【问题标题】:How to compare dates to make sure Google Apps Script is only sending an alert once a day?如何比较日期以确保 Google Apps 脚本每天只发送一次提醒?
【发布时间】:2023-03-09 18:48:01
【问题描述】:

我在 Google 表格中有一个脚本,它会在满足特定条件时发出警报。我想触发脚本每小时运行一次,但是,如果今天已经发出警报,我不想再发出一个警报(仅在第二天)。实现这一目标的最佳方法是什么?

我尝试了几种格式化日期的方法,但不知何故,到目前为止,唯一对我有用的是从日期对象中获取年、月和日作为 int 并分别比较它们。

function sendAlert{

  var now = new Date();
  var yearNow = now.getYear();
  var monthNow = now.getMonth() + 1;
  var dayNow = now.getDate();
  var sheet = SpreadsheetApp.getActive().getSheetByName('CHANGE_ALERT');
  var sentYear = sheet.getRange("R2").getValue();
  var sentMonth = sheet.getRange("S2").getValue();
  var sentDay = sheet.getRange("T2").getValue();

  if (yearNow != sentYear || monthNow != sentMonth || dayNow != sentDay) {

    sendEmail();
    var sentYear = sheet.getRange("R2").setValue(yearNow);
    var sentMonth = sheet.getRange("S2").setValue(monthNow);
    var sentDay = sheet.getRange("T2").setValue(dayNow);

  else {

    Logger.log('Alert was already sent today.');
  }
}

我认为这个解决方案绝对不是最好的方法,但我无法想出另一个将日期合并为一个的方法。仅比较 new Date() 不起作用,因为一天中的时间不一定相同。如果我将日期格式化为 YYYY-MM-dd,它应该可以工作,但是当我再次从电子表格中获取日期时,它会再次将其作为完整日期和时间。

【问题讨论】:

    标签: javascript date google-apps-script google-sheets alert


    【解决方案1】:

    要求:

    比较日期并在今天尚未发送电子邮件时发送电子邮件。


    修改代码:

    function sendAlert() {
    
      var sheet = SpreadsheetApp.getActive().getSheetByName('blank');
      var cell = sheet.getRange(2,18); //cell R2
      var date = new Date();
      var alertDate = Utilities.formatDate(cell.getValue(), "GMT+0", "yyyy-MM-dd");
      var currentDate = Utilities.formatDate(date, "GMT+0", "yyyy-MM-dd");
    
      if (alertDate !== currentDate) {
    
        sendEmail();
        cell.setValue(date);
    
      } else {
    
        Logger.log('Alert was already sent today.');
      }
    }
    

    如您所见,我已删除您所有的年/月/日代码,并将其替换为Utilities.formatDate(),这样您就可以按照您在问题中指定的格式比较日期。我还更改了if 语句来匹配这个,所以现在我们只需要比较alertDatecurrentDate


    参考资料:

    【讨论】:

    • 嗨罗斯!非常感谢详细的解释!但是,我有一个问题。以您的示例为例,alertDate 总是比 currentDate 少一天...我认为它可能与时区有关,但我无法弄清楚...这似乎很不合逻辑。我在 2019 年 7 月 18 日从 gSheet 中读取并执行 .formatDate,当我记录它时,我看到 2019 年 7 月 17 日
    • 你说得对,对我来说听起来像是时区问题。您可以将“GMT+0”更改为您喜欢的任何时区,我只是以它为例。
    • 我试图正确设置时区,spreadhseet 的时区与我的时区相同,GMT+1。所以我最终使用var currentDate = now.getYear().toString() + now.getMonth().toString() + now.getDate().toString(); - 至少我不必以这种方式获得3个不同的单元格。而且 Google 表格不会混淆格式,因为我得到的是 int 而不是日期的值。不过,非常感谢您抽出宝贵时间帮助我!:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多