Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何比较日期以确保GoogleApps脚本每天只发送一次警报?_Javascript_Date_Google Apps Script_Google Sheets_Alert - Fatal编程技术网

Javascript 如何比较日期以确保GoogleApps脚本每天只发送一次警报?

Javascript 如何比较日期以确保GoogleApps脚本每天只发送一次警报?,javascript,date,google-apps-script,google-sheets,alert,Javascript,Date,Google Apps Script,Google Sheets,Alert,我在谷歌表单中有一个脚本,如果满足某个条件,它会发出警报。我想触发脚本每小时运行一次,但是,如果今天已经发送了警报,我不想再发送一次(只在第二天)。实现这一目标的最佳方式是什么 我尝试了几种格式化日期的方法,但不知何故,到目前为止,唯一对我有效的方法是将日期对象中的年、月和日设置为int,并分别进行比较 function sendAlert{ var now = new Date(); var yearNow = now.getYear(); var monthNow = now.

我在谷歌表单中有一个脚本,如果满足某个条件,它会发出警报。我想触发脚本每小时运行一次,但是,如果今天已经发送了警报,我不想再发送一次(只在第二天)。实现这一目标的最佳方式是什么

我尝试了几种格式化日期的方法,但不知何故,到目前为止,唯一对我有效的方法是将日期对象中的年、月和日设置为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.');
  }
}
我认为这个解决方案肯定不是最好的方法,但我不能想出另一个将日期合并为一个的方法。仅比较新日期()不起作用,因为一天中的时间不一定相同。如果我将日期格式化为YYYY-MM-dd,它应该可以工作,但当我再次从电子表格中获取日期时,它将再次作为完整日期和时间。

要求: 比较日期,如果今天尚未发送电子邮件,则发送电子邮件


修改代码: 如您所见,我已删除了您的所有年/月/日代码,并将其替换为
实用程序.formatDate()
,这允许您以问题中指定的格式比较日期。我还更改了
if
语句以匹配此项,因此现在我们只需要比较
alertDate
currentDate


参考资料:
要求: 比较日期,如果今天尚未发送电子邮件,则发送电子邮件


修改代码: 如您所见,我已删除了您的所有年/月/日代码,并将其替换为
实用程序.formatDate()
,这允许您以问题中指定的格式比较日期。我还更改了
if
语句以匹配此项,因此现在我们只需要比较
alertDate
currentDate


参考资料:

嗨,罗斯!非常感谢您的详细解释!然而,我有一个问题。在您的示例中,alertDate将始终比currentDate短一天。。。我想这可能和时区有关,但我想不出来。。。这似乎不合逻辑。我从gSheet上读到2019-07-18,然后执行.formatDate,当我记录它时,我发现2019-07-17你是对的,对我来说听起来像是一个时区问题。您可以将“GMT+0”更改为您喜欢的任何时区,我只是以它为例。我正在尝试正确设置时区,spreadhseet的时区与我的时区相同,GMT+1。因此,我最终使用了
var currentDate=now.getYear().toString()+now.getMonth().toString()+now.getDate().toString()-至少我不需要这样得到3个不同的单元格。谷歌表单不会弄乱格式,因为我得到的是int值而不是日期。不过,非常感谢你花时间来帮助我!!:)嗨,罗斯!非常感谢您的详细解释!然而,我有一个问题。在您的示例中,alertDate将始终比currentDate短一天。。。我想这可能和时区有关,但我想不出来。。。这似乎不合逻辑。我从gSheet上读到2019-07-18,然后执行.formatDate,当我记录它时,我发现2019-07-17你是对的,对我来说听起来像是一个时区问题。您可以将“GMT+0”更改为您喜欢的任何时区,我只是以它为例。我正在尝试正确设置时区,spreadhseet的时区与我的时区相同,GMT+1。因此,我最终使用了
var currentDate=now.getYear().toString()+now.getMonth().toString()+now.getDate().toString()-至少我不需要这样得到3个不同的单元格。谷歌表单不会弄乱格式,因为我得到的是int值而不是日期。不过,非常感谢你花时间来帮助我!!:)
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.');
  }
}