簡體   English   中英

如何使用谷歌應用程序腳本和谷歌工作表數據逐行發送 html 電子郵件

[英]How to send html email line by line using google apps script and google sheet data

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

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

我希望我說得有道理。

代碼.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

索引.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>

您需要閱讀此將變量推送到模板

你的代碼.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>

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

您不會在每個循環中從電子表格中查找數據,或者讓模板化的 HTML 評估每個循環中的 HTML。 您將獲得一次數據。 它將存儲在一個數組中。 您將獲得一次 HTML,並將其存儲在一個變量中。

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

暫無
暫無

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

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