How to trigger an email notification when cell value is modified by function
我想创建一个带有事件触发器的Google表格。我正在使用Google Apps脚本。
由于堆栈溢出,我成功创建了一个Google表格,当用户修改了单元格时,该表格会自动发送邮件通知。
现在,我想知道当通过函数(而不是用户的修改)(例如:
)修改单元格时是否有可能
1 | if (today() >= B3 ;"late" ;"not late") |
该功能检查日期,并给出结果"迟到"或"不晚于"。
到最后期限时,该函数将返回" late",并会发送一封邮件警告我。正文邮件将在B,D和E列以及该单元格的同一行中具有该单元格的值(我知道如何使用e.source,
到目前为止,我已经尝试过了,但是没有用上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function sendNotification(e) { if("F" == e.range.getA1Notation().charAt(0)) { if(e.value =="Late") { //Define Notification Details var recipients ="[email protected]"; var subject ="Deadlines" ; var body ="deadline reached"; //Send the Email MailApp.sendEmail(recipients, subject, body); } } } |
当F列中的单元格具有" late"值(" late"是函数的结果)时,如何设置邮件通知?
您可以使用一个简单的脚本,该脚本在计时器触发器上运行,并检查工作表中特定列中的任何修改。
我将类似的脚本用于许多任务,包括日历和工作表监视。
下面是适用于F列的测试代码,您必须手动运行一次以创建用于检测更改的scriptProperties值。
然后创建一个时间触发器以每小时运行一次,或者您认为有用的任何其他计时器值。
唯一的问题是,如果您有一个非常长的工作表,您可以达到属性的长度限制...(现在我不记得最大长度,必须检查;-) 代码 :
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
}