【问题标题】:Using getTime in a For loop in google sheets script在谷歌表格脚本的 For 循环中使用 getTime
【发布时间】:2020-03-16 19:48:46
【问题描述】:

我正在尝试运行如下所示的“for”循环:

function runMultipleDates() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //9/26/2018 is 1569477600000 and 2/28/2019 is 1551337200000; 9/21/2018 is 1537509600000
   
  for (var date1 = 1537596000000 /*9/21/2018*/; date1 < 1569477600000 /*9/26/2018*/; date1 +=86400000) {
       //runEverything();
   var date2 = new Date();
       date2 = date2.setTime(date1);
   ss.getSheetByName('Time Range').getRange("A3").setValue(date2);

 };
  
};

我的目标是运行一个名为“runEverything()”的函数,该函数引用位于名为“时间范围”的工作表的单元格 A3 中的日期。只要单元格 A3 中的日期小于 2018 年 9 月 26 日,for 循环就应该运行我的函数“runEverything”,然后在 A3 中设置一个新日期。当我进行测试循环时,setValue(date2) 在该单元格 (A3) 中返回一个数值而不是日期。有人能指出我如何返回日期格式而不是日期的数值吗?如果有更优雅的方式来实现这一点,我会全力以赴!

感谢您的洞察力!

【问题讨论】:

  • 当要将值作为日期对象放入单元格“C3”时,请将ss.getSheetByName('Time Range').getRange("A3").setValue(date1);修改为ss.getSheetByName('Time Range').getRange("A3").setValue(new Date(date1));。但我无法理解As long as the date in cell A3 is less that 9/26/2018, the for loop should run my function 'runEverything' and then set a new date in A3.。在您的脚本中,date1 的值被放入单元格“A3”中。所以在你的脚本中,结果是9/25/2018 被放入单元格“A3”。我能问一下你的目标吗?
  • 我尝试了一个新脚本并在问题中更新了它。你能再看看我的问题,看看它是否有助于澄清我的意思?单元格 A3 中的值仍然是“1569391200000”的数值,而不是像 2018 年 9 月 23 日这样的日期值。
  • 感谢您的回复。比如把setValue(date2)修改成setValue(new Date(date2))怎么样?但在这种情况下,1569391200000 是 9/25/2019。能否请教一下检索9/23/2018的逻辑?
  • 田池,感谢您建议 setValue(new Date(date2))。那行得通。我想要的是在几天后根据位于单元格 A3 中的日期运行我的函数。所以我需要单元格 A3 一次增加一天。我的最终代码是这样的:runEverything(); var date2 = new Date(); date2 = date2.setTime(date1+86400000); ss.getSheetByName('时间范围').getRange("A3").setValue(new Date(date2)); };您还有其他建议吗?
  • 感谢您的回复。很高兴您的问题得到解决。

标签: datetime for-loop google-apps-script


【解决方案1】:
  • 您想使用日期字符串而不是 unix 时间

如果我的理解是正确的,那么下面的脚本呢?请认为这只是几个可能的答案之一。

示例脚本:

function runMultipleDates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var start = new Date("2018-09-29"); // <--- 1538200800000
  var end = new Date("2018-10-05"); // <--- 1538719200000
  var step = 1; // 1 day (86400000)

  for (var date1 = start; date1 <= end; date1.setDate(date1.getDate() + step)) {
    runEverything();
    var date2 = new Date(date1.getTime());
    date2.setDate(date2.getDate() + 1);
    ss.getSheetByName('Time Range').getRange("A3").setValue(date2);
  };
}
  • 此脚本与您的答案脚本具有相同的结果。
  • 脚本运行时,10/06/2018 被放入单元格“A3”中。

参考资料:

【讨论】:

  • 田池,再次感谢您的帮助!这要好得多,因为我不必每次更改时间范围时都转换 unix 纪元时间。我做了一项调整,将 runEverything() 移到“setValue(date2) 之后,它运行顺利。我有一个问题是为什么 var date2 = new Date(date1.getTime()) 而不是 var date2 = new Date(date1) ?如果您愿意解释,我将不胜感激。另外,关于另一个相关问题,link ,您能看一下吗?
  • @Thien Pham 感谢您的回复。我认为var date2 = new Date(date1.getTime())和var date2 = new Date(date1)这两种模式都可以使用。在这种情况下,我使用它来将date1 的日期对象复制到date2。对于我的示例脚本的可读性低,我深表歉意。这是因为我的技术不好。如果此答案不能解决您的问题,请告诉我。我想修改它。
【解决方案2】:

Tanaike 建议在 setValue() 中使用 new Date(date2) 并且它有效。我的最终脚本是这样的:

function runMultipleDates() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
   
  for (var date1 = 1538200800000 ; date1 <= 1538719200000; date1 +=86400000) {
   runEverything();
   var date2 = new Date();
       date2 = date2.setTime(date1+86400000);
   ss.getSheetByName('Time Range').getRange("A3").setValue(new Date(date2));

 };
  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多