簡體   English   中英

Google腳本電子郵件循環

[英]Google Script Email loop

我對編程還比較陌生,最近正在研究一種腳本,當某個列中的單元格發生更改時,該腳本可以從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();
    }
  }

如果使用onEdit() ,則每次您編輯單元格時都會觸發該函數。 這是你想要的嗎? 我以為您正在尋找的腳本是:

  1. 讀取活動表的每一行
  2. 如果第八列不為空,則將電子郵件發送到第一列中的地址
  3. 整個腳本是在用戶請求時觸發的(不是在用戶編輯單元格時觸發的)

在這種情況下,第一種方法更好,即sendNotification() 另外,必須有一個循環才能讀取所有行。 IF語句應該類似於if (row[8] != "")然后發送電子郵件。

在這種情況下row ,其被定義為row = data[i]在第一個腳本將具有行中的所有單元格的值被讀出在環路。 因此, row[8]將具有要檢查其是否為空的第8個值(H列),因此為if(row[8] != "")

另外,如果我正確理解,循環中的電子郵件地址應為emailAddress = row[1] ,因為每行的電子郵件地址都不同。

您的第二種方法var EMAIL_SENT = "EMAIL_SENT"; 與代碼的簡單擴展幾乎類似,該代碼的簡單擴展是在第2節:改進中sendEmail調用后,將每一行的列中的單元格設置為“ EMAIL_SENT”。 在本教程中,每次發送電子郵件時,每一行中的每個單元格都會被標記。 這樣,您應該將已編輯的單元格標記為未發送,然后您將可以稍后重新運行腳本,避免發送重復的電子郵件,而只會發送已編輯的單元格。

為了提高代碼效率並幫助您提高腳本性能,還提供了最佳實踐列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM