多个OR条件的时差

时间:2018-03-08 13:36:21

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

我想制作一个脚本,在提交表单几天后,向我发送邮件,其中包含我在表单中输入的内容。作为学生学习的帮助。在表格中输入要学习的内容,然后在1天,7天和28天之后通过邮件获取。

我已经制作了一份表格,收集邮件的时间,收件人地址,主题和正文。这些内容保存在Google电子表格中。

代码类的工作。但它会从工作表中的测试输入中发送所有邮件。我在6天前添加了一个,昨天增加了一个,今天增加了一个。 今天我只能收到一封邮件,明天送两封邮件。但我今天得到了所有这些。

我认为这就是这条线:

if (diffDays == 1 || diffDays == 7 || diffDays == 28) continue;

我试图改变它,搜索其他编写方式,例如数组。

这里是完整的代码:

function createTimeDrivenTriggers() {
  ScriptApp.newTrigger('reminder')
      .timeBased()
      .everyDays(1)
      .atHour(16) // Change time of day here
      .inTimezone("Europe/Stockholm")
      .create();
}

function reminder() {
  var today = new Date(); // Today
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  var data = range.getValues();
  var headerRows = 1;

  for (i=0; i<data.length; i++){
    if (i < headerRows) continue;
    var row = data[i];
    var time = row[0];
    // Get time difference
    var timeDiff = Math.abs(today.getTime() - time.getTime());
    var diffDays = Math.ceil((timeDiff) / (1000 * 3600 * 24)-1); 
    if (diffDays == 1 || diffDays == 7 || diffDays == 28) continue;
    var recipient = row[1];
    var subject = row[2];
    var body = row[3];

    // Send mail
    GmailApp.sendEmail(recipient, subject, body)
  }
}

由于

2 个答案:

答案 0 :(得分:0)

确保仅在if语句为真时执行代码。

在语句本身中包含if语句之后的所有代码,仅在diffDays = 1,2或28时执行它。

function reminder() {
  var today = new Date(); // Today
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  var data = range.getValues();
  var headerRows = 1;

  for (i=0; i<data.length; i++){
    if (i < headerRows) continue;
    var row = data[i];
    var time = row[0];
    // Get time difference
    var timeDiff = Math.abs(today.getTime() - time.getTime());
    var diffDays = Math.ceil((timeDiff) / (1000 * 3600 * 24)-1); 
    if (diffDays == 1 || diffDays == 7 || diffDays == 28) {
      var recipient = row[1];
      var subject = row[2];
      var body = row[3];

      // Send mail
      GmailApp.sendEmail(recipient, subject, body)
    }
  }
}

答案 1 :(得分:0)

请注意,continue表示&#34;停止处理正在执行的循环的此迭代,并开始下一次迭代。&#34;因此,您的脚本每天都会发送提醒除了您想要提醒他们的日子。

将测试更改为&#34; AND NOT&#34;,移动代码以在现有检查中提醒,或使用更具表现力的语法(如switch)将满足您的意图。

    switch (diffDays) {
      case 1:
      case 7:
      case 28:
        sendReminder(your, Args, Here);
        break;
      case 0:
        sendWelcome(some, other, Args);
        break;
      ...
      default:
        break;
    }
...
function sendReminder(your, Args, Here) {
  /* Code that uses function arguments to build and send an email */
}

&#34;而不是&#34;意思是if (diffDay != 1 && diffDay != ...),即&#34;如果它不是这个,而不是那个,而不是这个,而不是......&#34;