Google Script电子邮件循环

时间:2016-05-16 13:18:24

标签: email google-apps-script google-sheets google-apps

我对编程比较陌生,并且最近一直在编写一个脚本,以便在更改某个列中的单元格时从Google电子表格发送电子邮件。根据与更改相同的行中的另一列中的电子邮件地址分配收件人。我很难让我的代码在第一封电子邮件后停止运行。实际上,脚本无限期地运行(至少在我用完当天的电子邮件之前)。

以下是代码:

    function sendNotification() {

      var sheet = SpreadsheetApp.getActiveSheet();
  //Get Active cell
  var mycell = sheet.getActiveSelection();
  var cellcol = mycell.getColumn();
  var cellrow = mycell.getRow();
  var address = sheet.getRange("C" + cellrow).getValue();
  var streetAddress = sheet.getRange("F" + cellrow).getValue();
  var startRow = 2;  
  var numRows = 2000;  
  // Fetch the range of cells A2:O2000
  var dataRange = sheet.getRange(startRow, 1, numRows, 15)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    var emailAddress = address;  // First column
    var message = streetAddress +" Has been Submitted for permitting!";             // Second column
    var subject = "The above Address has been Submitted For Permitting! We     will Follow up with you when it has been approved.";
  //Check to see if column is H to trigger
      if (cellcol == 8 && sheet.getName() == "Sheet1" && mycell !== "")
      {
  //Send the Email
      MailApp.sendEmail(emailAddress, message, subject);
      }
  //End sendNotification
  }
  }

我该怎么做才能解决这个问题?循环是最好的选择吗?我该如何实现呢?

这种做法怎么样?

var EMAIL_SENT =“EMAIL_SENT”;

 function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var mycell = e.range;
  var cellcol = mycell.getColumn();
  var cellrow = mycell.getRow();
  var emailAddress = sheet.getRange("C" + cellrow).getValue();
  var streetAddress = sheet.getRange("F" + cellrow).getValue();
  var subject = "The above Address has been Submitted For Permitting! We     will follow up with you when it has been approved."
  // Fetch values for each row in the Range
    var message = streetAddress +" Has been Submitted for permitting!";  
    var emailSent = sheet.getRange("O" + cellrow).getValue();    
    if ( cellcol == 8 && sheet.getName() == "Sheet1" && emailSent !=      EMAIL_SENT) {  // Prevents sending duplicates
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(cellrow, 15).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is     interrupted
      SpreadsheetApp.flush();
    }
  }

2 个答案:

答案 0 :(得分:0)

如果您使用onEdit(),则每次编辑单元格时都会触发该功能。这是你想要的吗? 我认为你正在寻找的是一个脚本:

  1. 读取活动工作表的每一行
  2. 如果第8列不为空,请将电子邮件发送到第一列中的地址
  3. 整个脚本是在用户请求时触发的(而不是在用户编辑单元格时)
  4. 在这种情况下,第一种方法更好,sendNotification()。还需要一个循环来读取所有行。 IF语句应该像if (row[8] != "")那样发送电子邮件。

    在这种情况下,在第一个脚本中定义为row的{​​{1}}将在循环中读取行中所有单元格的值。因此row = data[i]将具有第8个(H列)的值,您要检查空虚,因此row[8]

    此外,如果我理解正确,电子邮件地址应该在循环内if(row[8] != ""),因为每行的电子邮件地址都不同。

答案 1 :(得分:0)

您的第二种方法var EMAIL_SENT = "EMAIL_SENT";几乎类似于代码的简单扩展,该代码在Section 2: Improvements中调用sendEmail后调用每列中的单元格中的单元格为'EMAIL_SENT' 。在教程中,每次发送电子邮件时,每行都会标记每个单元格。这样,您应该将已编辑的单元格标记为未发送,然后您将能够在以后重新运行该脚本,避免发送电子邮件重复项,并且只会发送已编辑的单元格。

为了提高代码效率并帮助您提高脚本的性能,还提供了best practices列表。