谷歌表格脚本:循环迭代时如何将startDate重置为午夜?
问题描述
我尝试基于谷歌表格创建多个从设定起始日期开始的重复事件,但当前代码会将开始时间累加在前一个事件的时间上。请问如何在每次循环迭代后将startDate重置为午夜?
当前代码
var spreadsheet = SpreadsheetApp.getActiveSheet() const startDate = new Date('September 1, 2024 00:00:00 AM GMT+0100'); var endDate = new Date('08/10/2025'); function values() { let range = spreadsheet.getRangeByName('sunday') range.getValues().forEach(function(rows) { var title = (rows[0]) const hours = (rows[1]*60) const minutes = (rows[2]+hours) var startTime = new Date(startDate.setMinutes(minutes)) Logger.log(title) Logger.log(startTime); var startTime = new Date(startTime.setMinutes(0)) }); };
日志输出
9:37:11 PM Notice Execution started 9:37:13 PM Info test 1 9:37:13 PM Info Sun Sep 01 04:56:00 GMT+01:00 2024 9:37:13 PM Info test 2 9:37:13 PM Info Sun Sep 01 09:23:00 GMT+01:00 2024 9:37:13 PM Info test 3 9:37:13 PM Info Sun Sep 01 14:30:00 GMT+01:00 2024 9:37:13 PM Info test 4 9:37:13 PM Info Sun Sep 01 20:00:00 GMT+01:00 2024 9:37:13 PM Info test 5 9:37:13 PM Info Mon Sep 02 03:20:00 GMT+01:00 2024 9:37:14 PM Notice Execution completed
解决方案
问题出在startDate.setMinutes(minutes)会直接修改全局的startDate对象本身,导致每次循环都是基于上一次修改后的时间继续累加。要解决这个问题,每次循环都应该基于原始的起始日期创建新的Date实例,而非修改原对象。
修改方式:
将var startTime = new Date(startDate.setMinutes(minutes))替换为两步操作:先复制原始的startDate得到新的Date对象,再对这个新对象设置分钟数。
修改后的完整代码:
var spreadsheet = SpreadsheetApp.getActiveSheet() const startDate = new Date('September 1, 2024 00:00:00 AM GMT+0100'); var endDate = new Date('08/10/2025'); function values() { let range = spreadsheet.getRangeByName('sunday') range.getValues().forEach(function(rows) { var title = rows[0] const hours = rows[1] * 60 const minutes = rows[2] + hours // 基于原始startDate创建新的Date对象,避免修改原对象 var startTime = new Date(startDate); startTime.setMinutes(minutes); Logger.log(title) Logger.log(startTime); }); };
这样修改后,每次循环的startTime都会基于原始的2024年9月1日00:00:00来设置分钟数,不会出现时间累加的问题,自然也就不需要额外重置startDate了。
内容的提问来源于stack exchange,提问作者Terry Edward
相关产品推荐
相关产品推荐

