【问题标题】:Google Apps Script - Only send emails in current yearGoogle Apps 脚本 - 仅在当年发送电子邮件
【发布时间】:2020-05-10 20:53:39
【问题描述】:

在我们的大学里,我们在学生期间借出 Chromebook,我们在联系学生要求他们归还时非常松懈,因此在他们离开后我们往往会赶上并必须联系他们才能让他们回来.

学生的逗留时间从 1 年到 3 年不等。我想创建一个日志表,我们可以在其中跟踪这些学生以及他们借用的设备。然后在他们离开的前一个月,自动发送一封电子邮件,告知他们需要将 Chromebook 归还给我们。

在我的工作表中,我们有一个“预计返回日期”,我们只输入他们应离开的年份,因为每个学生的实际休假数据因学科而异。我的想法是,我会在任何学生离开大学的前一天设置一个触发器来运行。

我对脚本非常陌生,但到目前为止,我已经构建了一个脚本(使用大量 Google 搜索,复制我在网上找到的内容并进行修改),它将通过工作表查找任何数据行,而无需其中包含“EMAIL_SENT”字样并发送电子邮件。如果它显示“EMAIL_SENT”,它会跳过它们。当我说我是新人时,我花了一周的时间才达到这一点。

我将添加触发器使其每年只运行一次,但我只希望它向今年将要离开的学生发送电子邮件,无论他们在工作表中的顺序如何。有没有办法让它调用当前年份,查找预期的返回日期并仅在同一年发送?

到目前为止,我的脚本如下。

希望这是有道理的。

// This constant is written in column I for rows for which an email
// has been sent successfully.
var EMAIL_SENT = 'EMAIL_SENT';

/**
 * Sends non-duplicate emails with data from the current spreadsheet.
 */
function sendEmails2(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2; // first row of data to process
  var numRows = 1000; // number of rows to process
    // Fetch the range of cells A2:B4
  var dataRange = sheet.getRange(startRow, 1, sheet.getLastRow()-1,9);
    // Fetch values for each row in the Range.
  var data = dataRange.getValues ();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[3]; // fourth column
    var recipient = row[0]; // first column
    var asset = row[6]; // seventh column
    var loanDate = row [7] + ""; // seventh column
    var returnDate = row[8]; // ninth column
    var message = 'Hi ' + recipient + '. \n\n' + 'On ' + loanDate + ' you borrowed Chromebook ' + asset + ' from Learning Support. \n\n' + 'Since you are soon to leave the college, we require this Chromebook to be returned to the IT Office before the 30/06/' + returnDate + '. \n\n' + 'Kind regards,\n\n' + 'IT Services';
    var emailSent = row[2]; // third column
    if (emailSent !=EMAIL_SENT) { //prevents sending duplicates
      var subject = 'Chromebook Loan';
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 3).setValue(EMAIL_SENT);
      sheet.getRange(startRow + i, 10).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}

【问题讨论】:

  • 你们中的许多人的数组索引似乎不正确。
  • 它们都有效,也许我的标签不正确,我会更新这些。
  • “调用当前年份”是什么意思?您可以使用(new Date()).getYear() 获取当前年份并将其与您的年份值进行比较。这就是你所追求的吗?

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


【解决方案1】:

您应该只添加一个获取当前年份的变量,然后在您的if 中添加一个新条件来检查它们中的两个。

所以新变量:

var yearNow = newDate.getFullYear();

还有if

if (emailSent !=EMAIL_SENT && returnDate == yearNow)

要添加每年运行一次的触发器,您可以使用以下函数:

function createTheTrigger() {
  ScriptApp.newTrigger('sendEmails2')
      .timeBased()
      .everyWeeks(52)
      .create();
}

上述函数创建了一个触发器,它将每 52 周运行一次,大约为 1 年

此外,我建议您查看以下链接,因为它们可能会有所帮助:

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2013-08-15
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2016-05-05
    • 2013-08-30
    • 2014-08-05
    相关资源
    最近更新 更多