1

我是一名編程初學者,我嘗試了很多東西(解決方案),但沒有腳本正在運行。 我正在使用現有的sendEmail腳本(見下面)將電子郵件發送到新的電子表格條目。Google Apps腳本:電子郵件只觸發新條目(不使用Google表單)

https://docs.google.com/spreadsheet/ccc?key=0At8yp_w7-gFwdHdhS0RDa2hXUUMyU2lfRFJ1NU1iNEE&usp=sharing

我沒有使用谷歌表單。我從其他電子表格表中複製所需的信息。使用onEdit觸發器,腳本會發送電子郵件給新條目。

我遇到的問題是腳本發送電子郵件到電子表格的每一行,即使該信息已經發送。

我嘗試了一些解決方法,雖然它們在論壇中被命名,但在我的情況下沒有任何幫助。我不想只發送一封電子郵件到最後一個條目。我想發送電子郵件給不同數量的新條目,如果可能的話,這應該由onEdit事件觸發。 我希望有人能幫助我很快...

var EMAIL_SENT = "EMAIL_SENT"; 

    function sendEmails(onlyLast) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var dataSheet = ss.getSheets()[0]; 
    var startRow = 2; 
    var lastRow = datasheet.getlastRow()-1; 
    if (onlyLast) 
    startRow = endRow; 
    var dataRange = dataSheet.getRange(startRow, 1, lastRow, 4); 

    var templateSheet = ss.getSheets()[1]; 
    var emailTemplate = templateSheet.getRange("A1").getValue(); 

    // Create one JavaScript object per row of data. 
    var objects = getRowsData(dataSheet, dataRange); 

    // For every row object, create a personalized email from a template and send 
    // it to the appropriate person. 
    for (var i = 0; i < objects.length; ++i) { 
    // Get a row object 
    var rowData = objects[i]; 


    var file = DriveApp.getFileById(''); 
    // Generate a personalized email. 
    // Given a template string, replace markers (for instance ${"First Name"}) with 
    // the corresponding value in a row object (for instance rowData.firstName). 
    var emailText = fillInTemplateFromObject(emailTemplate, rowData); 
    var emailSubject = "Tutorial: Simple Mail Merge"; 
    var emailSent; 
    if (emailSent != EMAIL_SENT) { 
     var subject = "Tutorial: Simple Mail Merge"; 
     MailApp.sendEmail(rowData.emailAddress, emailSubject, emailText, {attachments:[file.getAs(MimeType.PDF)]}); 
     dataSheet.getRange(startRow + i, 5).setValue(EMAIL_SENT); 
     SpreadsheetApp.flush(); 
    } 
    } 
} 
+0

從不共享編輯權限的紙張,即使在這個論壇的人有不良的生活習慣,有時並填寫怪異內容牀單;-)我將它設置爲只能查看,任何人都可以複製,如果他們需要進一步測試。 – 2014-09-25 20:42:45

回答

0

首先,我不會使用onEdit而是時間驅動的觸發器,檢查更改建議。這樣,即使您錯過了鍵入內容,您的腳本也不會不斷嘗試發送電子郵件。

其次,您將需要某種方式來指示數據已處理與否的天氣。您可以讓腳本加粗所有處理的信息,然後通過電子郵件發送不是粗體的內容。

以下是我寫給某人的一個類似腳本的鏈接,如果腳本看到單詞「取消」,它會通過電子郵件發送人員列表。

https://docs.google.com/a/askbj.net/spreadsheets/d/1Y82TwZWC8Nh2HQhpKWcdxgnrU0ANo8d2JLenK3gWyY4/edit?usp=sharing

-bj

1

下面是一個例子電子表格:https://docs.google.com/spreadsheets/d/1RdwZcK6tsOr1m44ZyawWsWXGa26zhd8J1ZZs_GsRRtY/edit?usp=sharing

將這個上定時觸發:

function sendNew(){ 
    var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"); 
    var templetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("template"); 
    var templateSubject = templetSheet.getRange(1, 2).getValue(); 
    var templateBody = templetSheet.getRange(2, 2).getValue(); 

    for (var i =2; i<= dataSheet.getLastRow(); i++){ 
    var name = dataSheet.getRange(i, 1).getValue(); 
    var color = dataSheet.getRange(i, 2).getValue(); 
    var status = dataSheet.getRange(i, 3).getValue(); 

    var subject = templateSubject.replace("<<Name>>", name); 
    var body = templateBody.replace("<<Name>>", name); 
    body = body.replace("<<Color>>", color); 

    if (status == ""){ 
     MailApp.sendEmail('[email protected]', subject, body); 
     dataSheet.getRange(i,3).setValue("Email Sent"); 
    } 
    } 
} 
0
在你的代碼

定義var emailSent;但不爲其分配任何值...

所以下面的比較總是返回trueif (emailSent != EMAIL_SENT) {

試圖簡單地用它來取代var emailSent;

var emailSent = dataSheet.getRange(startRow + i, 5).getValue(); 

,並預期它應該工作。

最後,在對方的回答中提到,運行在定時器觸發的,而不是一個onEdit此功能,避免局部電子郵件發送(如果用戶改變一個單元格的內容或輸入錯誤的東西...)

編輯:最後說明,請刪除第一行var EMAIL_SENT = "EMAIL_SENT",我知道它來自Google的示例,但這裏沒用,(恕我直言)非常混亂,因爲最終您不知道EMAIL_SENT是變量還是值。 ..,改變你的條件爲

if (emailSent != 'EMAIL_SENT') { // which compares a value to a string, clearly ;-) 
+0

嗨,你說得對。對不起,我遲到的回覆和第二篇文章,我現在已經刪除。感謝比約恩。我根據需要對代碼進行了一些更改,並且它工作得非常好!謝謝你們。 – Jens 2014-09-27 15:33:29

+0

沒問題,如果你對它滿意,你應該考慮接受他的答案......這就是stackoverflow的工作方式:-)。歡迎,祝你好運。 – 2014-09-27 16:12:11

1

這對我來說是驚人的,它是比約恩在那裏做的修改。腳本比約恩的道具謝謝你,希望這個線程可以幫助一個人,就像今晚幫助我一樣。多謝你們!

function ssForward() { 

    // DEFINE YOUR MAIN SPREADSHEET 
    var ss = SpreadsheetApp.openById("SPREADSHEET_ID_ITS_IN_THE_SS_URL"); 

    // DEFINE THE DATA SHEET THAT RECIEVES THE SUBMISSIONS HERE 
    var dataSheet = ss.getSheetByName("data"); 

    // DEFINE THE TEMPLATE SHEET THAT HAS THE EMAIL TEMPLATE INSIDE OF IT 
    var templetSheet = ss.getSheetByName("template"); 

    //DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT 
    var templateSubject = templetSheet.getRange(1, 2).getValue(); 

    //DEFINE THE CELLS THAT CONTAIN THE TEMPLATE TEXT FOR THE SUBJECT 
    var templateBody = templetSheet.getRange(2, 2).getValue(); 

    //NOW RUN A FOR LOOP THAT GOES THROUGH EACH ENTRY IN EACH ROW (var i = the row in your spreadsheet)  
    for (var i = 2; i <= dataSheet.getLastRow(); i++) { 

     // ADD CURRENTLY VIEWED ENTRY TO VAR (var phone = the sheet in row i, column 3) 
     // all 3 of these var work the same way  
     var phone = dataSheet.getRange(i, 3).getValue(); 
     var location = dataSheet.getRange(i, 4).getValue(); 
     var status = dataSheet.getRange(i, 10).getValue(); 

     // NOW USE THE templetSheet VAR DEFINED ABOVE AND REPLACE THE PLACEHOLDER TEXT WITH THE APPROPRIATE VARIABLE 

     //REPLACE THE SUBJECT TEMPLATE TEXT <<phone>> WITH THE CONTENTS OF THE VAR 'phone' defined above. 
     var subject = templateSubject.replace("<<phone>>", phone); 

     //REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<location>> - WITH THE CONTENTS OF THE VAR 'location' defined above. 
     var body = templateBody.replace("<<location>>", location); 

     //REPLACE THE 'SUBJECT TEMPLATE' TEXT: <<phone>> - WITH THE CONTENTS OF THE VAR 'phone' defined above. 
     body = body.replace("<<phone>>", phone); 

     // IF OUR STATUS CELL IS EMPTY 
     if (status == "") { 

      // SEND THE EMAIL FROM '[email protected]', USE THE 'subject' VAR FOR THE SUBECT, AND THE VAR 'templateBody' FOR THE MESSAGES BODY 
      MailApp.sendEmail('[email protected]', subject, body); 

      // MARK THE ROW AS COMPLETED 
      dataSheet.getRange(i, 10).setValue("Email Notification Sent"); 
     } 
    } 
} 
相關問題