Javascript Google脚本代码将运行,但不会执行if语句
在google脚本上运行的代码有问题。它运行正常,没有任何错误,但不会用过期文本标记列。它正在比较两个日期,最后我希望它检查当前日期,然后检查inv_日期是否正好是执行if语句之前的7天。任何帮助都将不胜感激Javascript Google脚本代码将运行,但不会执行if语句,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,在google脚本上运行的代码有问题。它运行正常,没有任何错误,但不会用过期文本标记列。它正在比较两个日期,最后我希望它检查当前日期,然后检查inv_日期是否正好是执行if语句之前的7天。任何帮助都将不胜感激 function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Invoice') .addItem('Mark Overdue', 'doOverdueCheck') .add
function onOpen()
{
var ui = SpreadsheetApp.getUi();
ui.createMenu('Invoice')
.addItem('Mark Overdue', 'doOverdueCheck')
.addToUi();
}
//does a check and inputs overdue if past date
{
var ui = SpreadsheetApp.getUi();
ui.createMenu('Invoice')
.addItem('Mark Overdue', 'doOverdueCheck')
.addToUi();
}
function doOverdueCheck()
{
var sheet = SpreadsheetApp.getActiveSheet();
var data_range = sheet.getDataRange();
var last_row = data_range.getLastRow();
sheet.getRange('E:E').clearContent();
var today = new Date();
today.setHours(0, 0, 0, 0);
today.getTime()-7*(24*3600*1000);
for (var r = 2; r <= last_row; r++) {
var inv_date = data_range.getCell(r, 4).getValue();
if (today.getTime() == inv_date.getTime()) {
sheet.getRange(r, 5).setValue("overdue");
}
}
}
function getOverDueInfo(row)
{
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
var values = sheet.getRange(row,1,row,6).getValues();
var rec = values[0];
var overdue =
{
first_name:rec[0],
last_name:rec[1],
email:rec[2],
due_date:rec[3],
module_test:rec[5],
};
overdue.name = overdue.first_name +' '+ overdue.last_name;
overdue.date_str = sheet.getRange(row,4).getDisplayValue();
overdue.module = overdue.module_test;
var due_date = new Date(overdue.due_date);
due_date.setHours(0,0,0,0);
var today = new Date();
today.setHours(0,0,0,0);
var difference_ms = Math.abs(today.getTime() - due_date.getTime() );
overdue.num_days = Math.round(difference_ms/(24*60*60*1000) );
return overdue;
}
//Send email Function
function sendEmail(row)
{
var overdue = getOverDueInfo(row);
var templ = HtmlService
.createTemplateFromFile('client-email');
templ.overdue = overdue;
var message = templ.evaluate().getContent();
MailApp.sendEmail({
to: overdue.email,
subject: "Your Trial Has Ended",
htmlBody: message
});
}
//End function
//Start send Overdue emails
function sendOverdueEmails()
{
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
var data_range = sheet.getDataRange();
var last_row = data_range.getLastRow();
var today= new Date();
today.setHours(0,0,0,0);
for(var r=2;r<=last_row;r++)
{
var inv_date = data_range.getCell(r,4).getValue();
inv_date.setHours(0,0,0,0);
if(today > inv_date)
{
sendEmail(r);
}
}
}
//End send overdue emails
//Function onOpen
{
var ui = SpreadsheetApp.getUi();
ui.createMenu('Invoice')
.addItem('mark Overdue', 'doOverdueCheck')
.addItem('send Emails', 'sendOverdueEmails')
.addToUi();
}
//End onOpen
请参阅下面关于语法错误的评论
if语句正在检查它是否延迟了7天到精确的毫秒。inv_date.setHours0,0,0,0将inv_date的超时时间设为零,但今天的情况并非如此,因此一旦该毫秒过去,该语句将不再为真 当您在工作表中输入日期时,例如2020年5月5日,该日期实际上是这样的:
Tue May 05 2020 00:00:00 GMT+0200 (Central European Summer Time)
当您创建一个日期并将其赋值为今天时,它将为您提供当前时间,因此您的指令将永远不会执行,除非您在当天的00:00:00执行脚本
为了让脚本正常工作,您还可以使用简单的指令代替库,并在减去天数之前将setHours0、0、0、0添加到today变量中
此外,由于您要将7天前的日期值指定给今天,因此还可以重新检查if条件,以便在需要时显示过期值
function doOverdueCheck() {
var sheet = SpreadsheetApp.getActiveSheet();
var data_range = sheet.getDataRange();
var last_row = data_range.getLastRow();
sheet.getRange('E:E').clearContent();
var today = new Date();
today.setHours(0, 0, 0, 0);
today.getTime()-7*(24*3600*1000);
for (var r = 2; r <= last_row; r++) {
var inv_date = data_range.getCell(r, 4).getValue();
if (today.getTime() == inv_date.getTime()) {
sheet.getRange(r, 5).setValue("overdue");
}
}
}
参考
只是瞥了一眼-你是否意识到第一次getTime没有任何问题?这可能是正确的,但也可能是错误的。@Mär如果我在第一个getTime中添加,它将给出一个today.getTime不是一个函数,如果我从第二个getTime中删除,它将完成,但不在cellmoment中标记overview,则表示未定义。这一时刻也是如此。今天可能也没有定义。尝试在调试器中一步一步地运行,并仔细查看变量。@kiik如前所述,可能是正确的。那么它大概是一个财产。您是否看到==存在相同的问题?总之,一般来说,如果基于比较的if请求失败,我会尝试读取比较参数。谢谢!!当我复制代码时,它会在单元格中粘贴过期时间为7天的内容,我只需要在单元格中粘贴过期时间为7天的内容。如果我在if语句中使用==或===而不是>=的话,它将正常运行,但不会在任何单元格中粘贴过期。我现在明白了,那么==确实是这种情况下的最佳选择。有没有过期的日期?您可以使用console.log进行调试吗?该代码适用于我,它会将所需单元格的值设置为“过期”。当我将该代码与==或===一起使用时,它不会将任何具有相关日期的单元格标记为过期,并将所有单元格保留为空。仅当我使用<或>来确定之前或之后的天数时,它才起作用,但我需要精确的时间。真的很奇怪……@kiik,如果日期一致,那么过期的日期就会出现。您是否尝试使用console.log测试此行为?