Javascript Google脚本代码将运行,但不会执行if语句

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

在google脚本上运行的代码有问题。它运行正常,没有任何错误,但不会用过期文本标记列。它正在比较两个日期,最后我希望它检查当前日期,然后检查inv_日期是否正好是执行if语句之前的7天。任何帮助都将不胜感激




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测试此行为?