Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 谷歌应用程序脚本-仅在本年度发送电子邮件_Google Apps Script_Google Sheets_Scripting - Fatal编程技术网

Google apps script 谷歌应用程序脚本-仅在本年度发送电子邮件

Google apps script 谷歌应用程序脚本-仅在本年度发送电子邮件,google-apps-script,google-sheets,scripting,Google Apps Script,Google Sheets,Scripting,在我们学院,我们在学生在校期间借出Chromebook,我们在联系学生要求归还Chromebook时非常松懈,因此在他们离开后,我们往往会迎头赶上,必须联系他们将他们带回来 学生停留的时间从1年到3年不等。我想创建一个记录表,在那里我们可以跟踪这些学生以及他们借用了什么设备。然后在他们离开的前一个月,自动发送电子邮件说他们需要将Chromebook归还给我们 在我的工作表中,我们有一个“预期返回日期”,我们只输入他们应休假的年份,因为每个学生的实际休假数据因其科目而异。我的想法是,在任何学生离开

在我们学院,我们在学生在校期间借出Chromebook,我们在联系学生要求归还Chromebook时非常松懈,因此在他们离开后,我们往往会迎头赶上,必须联系他们将他们带回来

学生停留的时间从1年到3年不等。我想创建一个记录表,在那里我们可以跟踪这些学生以及他们借用了什么设备。然后在他们离开的前一个月,自动发送电子邮件说他们需要将Chromebook归还给我们

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

我对脚本编写非常陌生,但到目前为止,我已经构建了一个脚本(使用大量谷歌搜索、复制我在网上找到的内容并进行修补),它将查看工作表,找到没有“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();
    }
  }
}
//此常量写在I列中,用于发送电子邮件的行
//已成功发送。
var EMAIL_SENT='EMAIL_SENT';
/**
*发送包含当前电子表格数据的非重复电子邮件。
*/
函数sendmails2(){
var sheet=SpreadsheetApp.getActiveSheet();
var startRow=2;//要处理的第一行数据
var numRows=1000;//要处理的行数
//获取单元格A2:B4的范围
var dataRange=sheet.getRange(startRow,1,sheet.getLastRow()-1,9);
//获取范围中每行的值。
var data=dataRange.getValues();
对于(变量i=0;i
您只需添加一个获取当前年份的变量,然后在您的
if
中添加一个新条件,该条件检查这两个变量

因此,新变量:

var yearNow = newDate.getFullYear();
以及
如果

if (emailSent !=EMAIL_SENT && returnDate == yearNow)
要添加每年运行一次的触发器,可以使用以下功能:

function createTheTrigger() {
  ScriptApp.newTrigger('sendEmails2')
      .timeBased()
      .everyWeeks(52)
      .create();
}
上述功能创建一个触发器,该触发器将每52周运行一次,大约1年

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

  • )

  • )


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