【问题标题】:GmailApp.SendEmail() sometimes sends two emailsGmailApp.SendEmail() 有时会发送两封电子邮件
【发布时间】:2019-09-24 21:18:13
【问题描述】:

~20% 的时间,我的 Google 应用脚本会发送一封重复的电子邮件,看似随机。我尝试将 MailApp.sendEmail() 切换为 GmailApp.sendEmail(),并添加一些睡眠行,以防代码在更改工作表之前以某种方式再次运行。我只有一个运行脚本的更改触发器。也许这与我的 gmail 登录的设备数量有关?我对此很陌生,所以我可能会遗漏一些明显的东西。

脚本:

function SortResponse() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("SheetName");
  var Avals = sheet.getRange("A1:A").getValues();
  var Alast = Avals.filter(String).length;

  var range = sheet.getDataRange();
  var values = range.getValues();

  var lasteq = values[Alast-1][2];
  var lastloc = values[Alast-1][3];
  var sentbox = values [Alast-1][31];
  var questions = 24;
  Utilities.sleep(4000);
    for (var i = 5; i <= questions; ++i) {
      var g = sheet.getRange(Alast,i).getValue();
      if (g != 'Good' && g != 'N/A' && g !== "") {           
        sheet.getRange(2,i).setValue(values[0][i-1]);
       }
    }
  // Send Alert Email.
  if (sentbox != "sent") {
    var comments = values[Alast-1][25];
    var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SheetName").getRange("AJ2:AJ20");
    var emailAddress = emailRange.getValues();
    var msgCell = sheet.getRange('AD1').getValues();
    var message = 'Equipment: '+lasteq+'\n at location: '+lastloc+'\n has been noted to need maintenance on: \n \n' +msgCell+'\n'+comments+' \n';
    var subject = 'Vehicle Inspection Maintenance Email Notification';
    GmailApp.sendEmail(emailAddress, subject, message);
    sheet.getRange(Alast,32).setValue("sent");
    Utilities.sleep(4000);
    sheet.getRange("B2:Z2").clearContent();
  }
  Utilities.sleep(4000);
  sheet.getRange("B2:Z2").clearContent();
}

触发器: Triggers

重复的电子邮件: Duplicate Emails

电子表格图片: Spreadsheet Image

感谢您的关注,任何帮助将不胜感激。

【问题讨论】:

  • 实际上我不确定 Alast 是什么,因为 Avals 是一个二维数组,我不确定过滤器会用它做什么。还有这个var Avals = sheet.getRange(1,1,sheet.getLastRow()).getValues();
  • 非常感谢您的意见。我只是为 Avals 尝试过,脚本似乎工作相同,但仍然发送了两封电子邮件。
  • 我需要查看您的电子表格来帮助您,因为我无法从您的代码中弄清楚您在做什么。
  • 我已编辑帖子以包含电子表格的图像。
  • A 列是时间戳,B-D 是基本信息(名称、项目、位置),E-Y 是“好”、N/A 或“需要维修/维护”,AF 是 ' Sentbox' 表示已通过电子邮件发送了一行,不应再次通过电子邮件发送。第 3 行和更大的行是对 google 表单响应表的查询,其中包括提交维护响应的行。

标签: google-apps-script google-apps


【解决方案1】:

我对此没有完全确定。但是由于无法访问包含数据的电子表格,我对创建所有数据来测试它不感兴趣。

function SortResponse() { 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("SheetName");
  var range = sheet.getDataRange();
  var values = range.getValues();
  var lv=values.length-1;
  var lasteq = values[lv][2];//Equipment
  var lastloc = values[lv][3];
  var sentbox = values[lv][31];
  var qA=sheet.getRange(lv+1,5,1,20).getValues();
  var aVrg=sheet.getRange(2,5,1,20);
  var aV=aVrg.getValues();
  for (var i=0;i<qA.length;i++) {
    if(qA[0][i]!='Good' && qA[0][i]!='N/A' && qA[0][i]!="") {           
      aV[0][i]=qA[0][i];
    }
  }
  aVrg.setValues(aV);
  if (sentbox != "sent") {
    var comments = values[lv][25];
    var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SheetName").getRange("AJ2:AJ20");//Dont know where this is
    var emailAddress = emailRange.getValues();
    var msgCell = sheet.getRange('AD1').getValue();
    var message=Utilities.formatString('Equipment: %s\nat location: %s\nhas been noted to need maintenance on:\n\n %s\n%s \n', lasteq,lastloc,msgCell,comments);
    var subject = 'Vehicle Inspection Maintenance Email Notification';
    GmailApp.sendEmail(emailAddress, subject, message);
    sheet.getRange(lv+1,32).setValue("sent");
  }
  sheet.getRange("B2:Z2").clearContent();
}

【讨论】:

  • 非常感谢您写了这篇文章,它看起来更干净了。我想没有简单的解释为什么它会发送重复的电子邮件,但我会试试这个,看看它是否会阻止它。在它已经发送了两次电子邮件后,我把睡眠线放进去,只是想看看它是否有帮助,但听起来在脚本的开头只设置一个是很聪明的。
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 2018-12-08
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2016-01-04
  • 2016-07-17
相关资源
最近更新 更多