脚本发送电子邮件后将列标记为“email_sent”以避免重复发送电子邮件

时间:2017-08-28 14:23:55

标签: email google-apps-script

这是我的代码。 我有一个包含8个列标题的电子表格,在此链接https://docs.google.com/spreadsheets/d/1ZQp9GIzLrkEsOF6k_TwAZeUi7v5u94GBrDEKoB3Wk-8/edit?usp=sharing 我试图让第一列添加“email_sent”以防止每次有人向工作表提交详细信息时发送重复项。该脚本正在运行并发送一个按照Var = message部分格式化的电子邮件,但我遇到问题,在第一列放置“email_sent”消息,而不是在脚本的下一个触发器上发送电子邮件。我认为这是“sheet.getRange(rowData + i,'I2:I1000')。setValue('EMAIL_SENT');”部分不起作用但不确定是什么问题。

function sendEmails() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.setActiveSheet(ss.getSheetByName("Email"));
var sheet = SpreadsheetApp.getActiveSheet();
var dataRange = sheet.getRange("A2:I1000");
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var rowData = data[i];
var emailAddress = rowData[1];
var recipient = rowData[0];
var message1 = rowData[3];
var message2 = rowData[4];
var message3 = rowData[5];
var message4 = rowData[6];
var message5 = rowData[7];
var emailSent = rowData[9];
if (emailSent != 'EMAIL_SENT') {  // Prevents sending duplicates
var message = 'Hi ' + recipient + ',\n\n' + message1 + ' ' + message2 + 
',\n\n' + message3 + ',\n' + message4 + ',\n' + message5;
var subject = 'Medical Questionairre Check';
MailApp.sendEmail(emailAddress, subject, message);
 sheet.getRange(rowData + i, 'I2:I1000').setValue('EMAIL_SENT');
  // Make sure the cell is updated right away in case the script is 
  interrupted
  SpreadsheetApp.flush();

 }
}
}

2 个答案:

答案 0 :(得分:0)

修复EMAIL_SENT问题

我认为应该这样做。我将getRange()参数更改为i + 2,9。基本上你只需要一行和一列。专栏是“我”。如果你在顶部开始循环,那么第9列和行通常是i + 1但是因为你在第2行开始循环然后我认为应该i + 2.所以检查出来。

最近我在MailApp.getRemainingDailyQuota()上添加了一张支票,以保证我不会用电子邮件运行自己。我也有消息和主题在错误的一面。

function sendEmails() 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.setActiveSheet(ss.getSheetByName("Email"));
  var sheet = SpreadsheetApp.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();
  for (var i = 1; i < data.length; ++i) 
  {
    var rowData = data[i];
    var emailAddress = rowData[1];
    var recipient = rowData[0];
    var message1 = rowData[3];
    var message2 = rowData[4];
    var message3 = rowData[5];
    var message4 = rowData[6];
    var message5 = rowData[7];
    var emailSent = rowData[9];
    var message = 'Hi ' + recipient + ',\n\n' + message1 + ' ' + message2 + ',\n\n' + message3 + ',\n' + message4 + ',\n' + message5;
    var subject = 'Medical Questionairre Check';
    if (emailSent != 'EMAIL_SENT' && MailApp.getRemainingDailyQuota()>0 && emailAddress && subject && message) 
    {       
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(i+1, 9).setValue('EMAIL_SENT');// Make sure the cell is updated right away in case the script is interrupted
     }
  }
}

请确保每列中都有列标题,包括mail_sent列。

答案 1 :(得分:0)

  • 要对其进行更改,一种优雅的方法是从您确定该行不为空的行开始,然后从那里找到带有getNextDataCell()的最后一个非空白行。

示例:

var notBlank = sheet.getRange("A1");
var lastRow = notBlank.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow():
sheet.getRange(lastRow, 16, column.length, 1).setValue('Processed');

这将找到第一行空白行之前的最后一行(可以是非空行之间的分散行空白行)。

  • 如果要查找工作表的最后一行,请使用getLastRow()

示例:


var lastRow = sheet.getLastRow();
sheet.getRange(lastRow, 16, column.length, 1).setValue('Processed');

小心:

确保您确实要将数据设置到最后一个非空白行中(这意味着覆盖已经存在的数据)。

  • ziganotschka精彩的answer表示敬意,是的,这不是我的答案,我将其设为社区Wiki,所以我不会盗用代表,请转到ziganotschka帖子,如果您支持,请给它一个支持这是同一篇文章