如何比较日期以确保 Google Apps 脚本每天只发送一次提醒?
How to compare dates to make sure Google Apps Script is only sending an alert once a day?
我在 Google Sheet 中有一个脚本,它会在满足特定条件时发出警报。我想每小时将脚本触发 运行,但是,如果今天已经发出警报,我不想再发出一个警报(仅在第二天)。实现此目标的最佳方法是什么?
我试过用几种方法格式化日期,但到目前为止唯一对我有用的是从日期对象中获取年、月和日作为 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,它应该可以工作,但是当我再次从电子表格中获取日期时,它再次将其作为完整日期和时间获取。
要求:
比较日期,如果今天还没有发送,请发送电子邮件。
修改后的代码:
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.');
}
}
如您所见,我删除了所有 year/month/day 代码并将其替换为 Utilities.formatDate()
,这样您就可以按照问题中指定的格式比较日期。我还更改了 if
语句以匹配它,所以现在我们只需要比较 alertDate
和 currentDate
.
参考文献:
我在 Google Sheet 中有一个脚本,它会在满足特定条件时发出警报。我想每小时将脚本触发 运行,但是,如果今天已经发出警报,我不想再发出一个警报(仅在第二天)。实现此目标的最佳方法是什么?
我试过用几种方法格式化日期,但到目前为止唯一对我有用的是从日期对象中获取年、月和日作为 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,它应该可以工作,但是当我再次从电子表格中获取日期时,它再次将其作为完整日期和时间获取。
要求:
比较日期,如果今天还没有发送,请发送电子邮件。
修改后的代码:
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.');
}
}
如您所见,我删除了所有 year/month/day 代码并将其替换为 Utilities.formatDate()
,这样您就可以按照问题中指定的格式比较日期。我还更改了 if
语句以匹配它,所以现在我们只需要比较 alertDate
和 currentDate
.