如何通过函数修改单元格值时触发电子邮件通知

时间:2016-02-09 17:18:13

标签: email events google-apps-script google-sheets

我想创建一个包含事件触发器的Google表格。我正在使用Google Apps脚本。

感谢Stack Overflow,当用户修改单元格时,我成功创建了带有自动邮件通知的Google表格。

现在我想知道当单元格被修改(不是用户的修改)时,这是否可行,例如:

if (today() >= B3 ; "late" ; "not late")

该功能检查日期,并将结果“迟到”或“不迟到”。

enter image description here

当达到截止日期时,该功能将“迟到”返回,并会发送一封邮件警告我。正文邮件将具有B,D和E列中单元格的值以及修改单元格的同一行(我知道如何使用e.source,getRangegetRow执行此操作)

到目前为止,我已经尝试了这个,但它无法正常工作

function sendNotification(e) {

if("F" == e.range.getA1Notation().charAt(0)) {

if(e.value == "Late") {

//Define Notification Details
var recipients = "user@example.com";
var subject = "Deadlines" ;
var body = "deadline reached";

//Send the Email
MailApp.sendEmail(recipients, subject, body);
}
}
}

如果F列中的单元格具有“延迟”值(“迟”是函数的结果),如何设置邮件通知?

1 个答案:

答案 0 :(得分:1)

您可以使用在计时器触发器上运行的简单脚本,并检查工作表中特定列的任何修改。

我使用这样的脚本执行很多任务,包括日历和工作表监控。

下面是一个适用于F列的测试代码,您必须手动运行一次以创建我用来检测更改的scriptProperties值。

然后创建一个时间触发器,每小时运行一次或任何其他有用的计时器值。

唯一的问题是如果你有一张很长的纸张,你可以达到属性的长度限制......(现在我不记得最大长度,必须检查; - )

代码:

function checkColumnF() {
  var sh = SpreadsheetApp.getActiveSheet();
  var values = sh.getRange('F1:F').getValues().join('-');
  if(PropertiesService.getScriptProperties().getKeys().length==0){ // first time you run the script
    PropertiesService.getScriptProperties().setProperty('oldValues', values);
    return;
  }
  var oldValues = PropertiesService.getScriptProperties().getProperty('oldValues').split('-');
  var valuesArray = values.split('-');
  while (valuesArray.length>oldValues.length){
    oldValues.push('x'); // if you append some rows since last exec
  }
  Logger.log('oldValues = '+oldValues)
  Logger.log('current values = '+valuesArray)
  for(var n=0;n<valuesArray.length;n++){
    if(oldValues[n] != valuesArray[n]){ // check for any difference
      sendMail(n+1,valuesArray[n]);
    }
  }  
  PropertiesService.getScriptProperties().setProperty('oldValues', values);
}

function sendMail(row,val){
  Logger.log('value changed on row '+row+' value = '+val+' ,  mail sent');
  // uncomment below when you are sure everything runs fine to avoid sending dozens of emails while you test !
  //MailApp.sendEmail(Session.getActiveUser().getEmail(),'value changed in your sheet','Row '+row+' is now '+val);
}