我的GoogleScript发送了重复的电子邮件

时间:2019-04-23 19:53:38

标签: google-apps-script

我需要在工作表中需要执行操作时发送电子邮件。 但是,尽管设置了“已发送”电子邮件的列并添加了不发送到已经“已发送”电子邮件的条件,但是此代码仍发出重复的电子邮件。我认为问题可能在于工作表需要花费更长的时间来产生“已发送”,并且在那个时候又发送了一封电子邮件,但我不确定。

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) 
  {}
 }}}

2 个答案:

答案 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分钟”