发送电子邮件至以前的Google表单提交,具体取决于编辑的列

时间:2014-09-03 19:14:40

标签: javascript forms email google-apps-script

我的Google脚本存在问题。它实际上是按原样工作但问题是,在提交表单并且有人提交新表单后,第一个提交的表单将不再发送电子邮件,因为它正在寻找LastRow。我很难让这个工作正常工作......有人可以帮忙吗?

以黄色突出显示的列,在供应商填写右侧第5列(绿色)后,也应填写"已发送"让用户知道电子邮件已发送给创建表单的人。

这是一张有希望获得更好主意的表格图片 http://i57.tinypic.com/34tej4w.png

function sendNotification() {
 var doc = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = doc.getSheets()[0];
 var startRow = sheet.getLastRow();
 var dataRange = sheet.getRange(startRow, 1, 1, 21) ;
 var data = dataRange.getValues();
 var row;
 for (i in data) {
 row = data[i];
 var EMAIL_SENT = 'Sent';
 var emailSent = row[19];     // Third column
  if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates

   //Define Notification Details
  var subject = "Row 12 has been edited!";
  var body = 
          '<html><body><b><u>Product Check</u></b>'
           + '<br><b>Time: </b>'
           + row[0]
           + '<br><b>Email requested: </b>'
           + row[1]
           + '<br><b>Request date: </b>'
           + row[2]
           + '<br><b>ISBN: </b>'
           + row[4]
           + '<br><b>Product Title: </b>'
           + row[7]
           + '<br><b>Supplier Name: </b>'
           + row[8]
           + '<br><b>PO Number: </b>'
           + row[10]
           + '<br><b>Comments: </b>'
           + row[12]
           + '<br>View the spreadsheet here: <a     href="#"><b>Click here</b></a> </html></body>';
 if (row[13] != '' && row[0] != '' && row[18] == '') {
  var recipients = row[1];
  var subject = "Column 'N' was edited!";
  sheet.getRange(startRow, 19, 1, 1).setValue(EMAIL_SENT) && sheet.getRange(startRow, 19, 1, 1).setBackgroundColor("#00ff00");
  SpreadsheetApp.flush();

    MailApp.sendEmail({
    to: recipients,
    subject: subject,
    htmlBody: body}); 
 }

1 个答案:

答案 0 :(得分:0)

您描述的行为是正常的,您自己已经发现了原点......

不使用最后一行作为参考,而是使用没有&#39; EMAIL_SENT&#39;的第一行。在对应于行[19]的列中,该行将是正确的行。

但是在并发的情况下,只会处理一个请求,因此我建议您每隔几分钟使用一个计时器触发器运行此代码,以便在每种情况下都处理所有提交。

另一个解决方案是使用on Form Submit触发器,但是从处理程序回调对象而不是表单(e.namedValues,see doc here)获取值,但这意味着代码中会有更多更改。在后一种情况下,每个提交都将被独立处理,即使是两个或更多提交都在一起。