我是一个新手,一直在使用一个简单的应用程序脚本来发送带有 onEdit 和 onChange 触发器的电子邮件。但是,我的工作表有十多张工作表,任何工作表中的任何编辑/更改(由我或通过计算完成)都会发送一封电子邮件,从而导致意外的垃圾邮件!为了避免这种情况,如果我可以使用一些代码仅根据特定工作表中特定单元格值的任何更改发送电子邮件,我的问题就会得到解决。我的外发电子邮件很短,整封邮件都在一个单元格 (C2) 中。如果我可以添加一行代码来监视单元格 C2 中的任何更改,并在发生更改时发送电子邮件,就是这样!我就完了。我的脚本如下:
function sendEmail(){
var ss = SpreadsheetApp.getActiveSpreadsheet()
var sheet1=ss.getSheetByName('Email');
var emailAddress = sheet1.getRange(2,1).getValue();
var subject = sheet1.getRange(2,2).getValue();
var message = sheet1.getRange(2,3).getValue();
MailApp.sendEmail(emailAddress, subject, message);
}
您可以使用 onEdit()
和条件来完成此操作。代码示例:
function onEdit(e) {
const specificSheet = "Email" // for example
const specificCell = "C2" // for example
let sheetCheck = (e.range.getSheet().getName() == specificSheet)
let cellCheck = (e.range.getA1Notation() == specificCell)
if (!(sheetCheck && cellCheck)) {
return
}
else {
sendEmail()
}
}
此功能的概要:
sendEmail()
function onEdit(e){
if(wasEdited(e, range1)){ // e.g. range1 = "Sheet1!A5"
// handle range1 change
}
if(wasEdited(e, range2)){ // e.g. range2 = "Sheet1!A7"
// handle range2 change
}
}
function wasEdited(e, range){
let tab = getTabFromA1Range(range)
let cell = getRangeFromA1Range(range)
return e.range.getSheet().getName() == tab && e.range.getA1Notation() == cell
}
function getTabFromA1Range(a1Range){
return a1Range.substring(0, a1Range.indexOf("!"))
}
function getRangeFromA1Range(a1Range){
return a1Range.substring(a1Range.indexOf("!")+1)
}
function sendEmail(){
Utilities.sleep(30000);
var ss=SpreadsheetApp.getActiveSpreadsheet();
var data=ss.getActiveSheet().getActiveCell().getA1Notation();
var sheetname = ss.getActiveSheet().getName();
var sheet1=ss.getSheetByName('Email');
var emailAddress = sheet1.getRange(2,1).getValue();
var subject = sheet1.getRange(2,2).getValue();
var message = sheet1.getRange(2,3).getValue();
if(data.indexOf('A:C')!=-1.23456789) {
MailApp.sendEmail(emailAddress, subject, message);
}
};
关键似乎是第10行的“if语句”。请注意我在脚本中添加的半分钟的时间延迟。这是因为如果没有它,在触发器激活时,将发出前一封电子邮件而不是当前电子邮件。显然,我的应用程序在同步方面有轻微的延迟,并且在所有当前数据填充到相关单元格之前触发了触发器!