2016-05-16 145 views
0

我相對較新的編程,並且最近一直在研究腳本從谷歌電子表格發送電子郵件時,某個列中的單元格被更改。收件人是根據與該更改相同行中另一列中的電子郵件地址分配的。我很難讓我的代碼在第一封電子郵件後停止運行。事實上,腳本無限期運行(至少在我用完電子郵件之前)。谷歌腳本電子郵件循環

下面是代碼:

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(); 
    } 
    } 
+0

您的循環運行2000次,因爲您正在讀取2000行。 **行22 **上的IF控制應檢查當前行和列8(H)上的值不爲空'row [8]!=「」'。相反,您正在檢查'mycell!=「」'引用循環外的單元格。另外'cellcol == 8'似乎不是必需的。 – Fredster

+0

問題是,如果編輯的單元格在第8列,我只想發送電子郵件。我想我正在接近這一切都是錯誤的。這看起來更好嗎? – AFliss

回答

0

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

  1. 讀取活動工作表
  2. 如果第8列不爲空的每一行,發送電子郵件的地址在第一列
  3. 整個劇本是根據用戶的請求(不是當用戶編輯一個單元格)觸發

在這種情況下,第一種方法較好,sendNotification()。還有一個循環來讀取所有行。 IF語句應該像if (row[8] != "")那樣發送電子郵件。

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

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

0

你的第二個方法var EMAIL_SENT = "EMAIL_SENT";幾乎類似於sendEmail被稱爲Section 2: Improvements發出後設置細胞在列「EMAIL_SENT」每一行代碼的簡單延伸。在教程中,每次發送電子郵件時,每個單元格都標記爲每行。因此,您應該將已編輯的單元格標記爲未發送,稍後您將能夠重新運行該腳本,避免發送電子郵件重複並僅發送已編輯的單元格。

爲了使您的代碼更高效並幫助您提高腳本的性能,還列出了給定的best practices