我需要在工作表中需要执行操作时发送电子邮件。 但是,尽管设置了“已发送”电子邮件的列并添加了不发送到已经“已发送”电子邮件的条件,但是此代码仍发出重复的电子邮件。我认为问题可能在于工作表需要花费更长的时间来产生“已发送”,并且在那个时候又发送了一封电子邮件,但我不确定。
function sendHTMLTEMP(arr,x){
var ss =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Current Point
Totals");
var column = ss.getRange('B:B');
var values = column.getValues(); // get all data in one call
var x = 0;
while (values[x][0] != "" ) {
x++;
if(ss.getRange(x,9).getValue() !=='' &&
ss.getRange(x,13).getValue()
!== 'Sent'){
var email = ss.getRange(x,10).getValue();
var expert = ss.getRange(x,2).getValue();
var manager = ss.getRange(x, 4).getValue();
var glm = ss.getRange(x, 11).getValue();
var warning = ss.getRange(x, 9).getValue();
var points = ss.getRange(x,8).getValue();
var admin = ss.getRange(x,12).getValue();
var body = HtmlService.createHtmlOutputFromFile('Warning
Email').getContent().toString();
body = body.replace('%manager%',manager);
body = body.replace('%expert%',expert);
body = body.replace('%warning%',warning);
body = body.replace('%points%', points);
try {
MailApp.sendEmail({
to: email,
cc: glm,
bcc: admin,
subject: 'Action Required on NorthEast Tracker',
htmlBody: body
});
ss.getRange(x, 13).setValue('Sent')
} catch(err)
{}
}}}
答案 0 :(得分:0)
如果您是从表单提交触发此电子邮件,则这是一个已知问题。有时,对于电子表格上的仅一行新行,会多次触发表单提交。解决此问题的方法是定时锁定,它会抛出这些额外的提交,通常等待5秒钟即可解决此问题。
在其中包装您的功能:
function onSubmit(){
var lock = LockService.getScriptLock();
try {
lock.waitLock(5000); // wait 5 seconds for others' use of the code section and lock to stop and then proceed
} catch (e) {
Logger.log('Could not obtain lock after 5 seconds.');
return HtmlService.createHtmlOutput("<b> Server Busy please try after some time <p>")
// In case this a server side code called asynchronously you return a error code and display the appropriate message on the client side
return "Error: Server busy try again later... Sorry :("
}
///DO STUFF
Utilities.sleep(3000);
lock.releaseLock();
}
我会注意到,在您等待锁定以真正杀死其他进程之后,出错很重要,如果您只是锁定而没有抛出该错误,它将尝试在第一个完成后运行。
答案 1 :(得分:0)
作为后续-我能够通过更改触发脚本运行的方式来解决此问题。
容器工作表是一个使用率很高的工作表,它导致脚本每隔几秒钟运行一次,从而导致重复发送。从那以后,我将触发器更改为每30分钟运行一次,并且没有看到要发送的重复电子邮件。
TLDR:将触发器从“更改时”更改为“时间驱动-每30分钟”