2016-01-21 105 views
1

我有一個腳本可以逐行發送電子郵件。我遇到的問題是我無法在電子郵件模板中使用當前迭代中的數據。我知道如何從模板中調用函數,但在這種情況下,我無法調用正在評估的函數。如何使用谷歌應用程序腳本和谷歌表格數據一行發送HTML電子郵件

我的解決方案是創建另一個函數,可以再次循環數據並在電子郵件中發送行實例,然後中斷。問題是,現在需要很長時間來確定可以完成一次循環兩遍。

我希望我有道理。

Code.gs

function sendMail() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('EmailList'); 

    // get the data as an array 
    var data = sheet.getDataRange().getValues(); 

    // Loop over each line 
    for (var i = 1; i < data.length; i+=1) { 

    // Check the status of the email 
    if (data[i][4] != 'Sent') { 
     // get html file content 
     var html =  HtmlService.createTemplateFromFile('Index').evaluate().getContent(); 

     // send the email 
     MailApp.sendEmail({ 
     to: data[i][2], 
     subject: 'Hi ' + data[i][0], 
     htmlBody: html 
      }); 

     // Set the status to sent 
     sheet.getRange(i + 1,5).setValue('Sent'); 
    } 
    } // end for 
} // end function sendMail 


function getData() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('EmailList'); 

    // get the data as an array 
    var data = sheet.getDataRange().getValues(); 

    // Loop over each line 
    for (var i = 1; i < data.length; i+=1) { 

    // Check the status of the email 
    if (data[i][4] != 'Sent') { 

     var firstName = data[i][0]; 
     var lastName = data[i][1]; 
     var email = data[i][2]; 
     var message = data[i][3]; 
     break; 
    } 
    } // end for 
    var returnData = [firstName, lastName, email, message]; 
    return returnData; 
} // end function getData 

的Index.html

<!DOCTYPE html> 
<html> 
    <head> 
    <base target="_top"> 
    <? var data = getData(); ?> 
    </head> 
    <body> 
    Hi <?= data[0];?> <?= data[1];?> , with email address <?= data[2];?> 
    I have a message for you: 
    <?= data[3];?> 
    </body> 
</html> 
+0

我不能在這裏看到兩個'loops'? – iJay

+0

嗨@iJay對不起,我沒有包含我的完整代碼。我現在更新了它。上面的代碼適用於這種規模的應用,但是一旦我採用這種方法並將其應用於大規模的實際工作,它將超出Google Apps腳本的時間執行限制。 –

回答

3

你需要閱讀本pushing variables to templates

你Code.gs

for (var i = 1; i < data.length; i+=1) { 

// Check the status of the email 
if (data[i][4] != 'Sent') { 
var firstName = data[i][0]; 
var lastName = data[i][1]; 
var email = data[i][2]; 
var message = data[i][3]; 

var returnData = [firstName, lastName, email, message]; 
var html =  HtmlService.createTemplateFromFile('Index'); 

html.data = returnData ; 
var template = html.evaluate().getContent(); 

     // send the email 
MailApp.sendEmail({ 
    to: data[i][2], 
    subject: 'Hi ' + data[i][0], 
    htmlBody: template 
    }); 

    // Set the status to sent 
    sheet.getRange(i + 1,5).setValue('Sent'); 
} 

您的index.html

<!DOCTYPE html> 
<html> 
    <head> 
    <base target="_top"> 
    </head> 
    <body> 
    Hi <?= data[0];?> <?= data[1];?> , with email address <?= data[2];?> 
    I have a message for you: 
    <?= data[3];?> 
    </body> 
</html> 
+0

感謝您的幫助! –

+2

歡迎!我回答你的[這個問題](http://stackoverflow.com/questions/32431991/passing-js-variable-to-html-file-gas-basic/34915557#34915557) – iJay

0

這裏是我的策略會以削減加工時間使用。首先獲取要注入到HTML中的所有數據。然後從文件中獲取HTML一次,並將其放在for循環之外。然後構建新的HTML,將其注入每個循環的原始HTML中。您將需要使用字符串公式,並連接文本以動態更改HTML。

您不會在每個循環中查看電子表格中的數據,也不會在每個循環中使用模板HTML評估HTML。你會得到一次數據。它將被存儲在一個數組中。您將獲得一次HTML,並將其存儲在一個變量中。

您需要使用JavaScript字符串方法來操作HTML。

+0

嗨,桑迪好,我已經發布的代碼工作,但我只是在做一個更有效的方式,因爲當我在更大的規模做它需要很長時間。你有沒有想法?請點擊此處[鏈接](http:// https://docs.google.com/spreadsheets/d/1AlAQ3SOouNUcMKVoIL79azd5BrJm7X_w81rTB6WVS6Y/) –

相關問題