如何使用 google 应用脚本和 google sheet 数据逐行发送电子邮件 html
How to send html email line by line using google apps script and google sheet data
我有一个脚本可以逐行发送电子邮件。我遇到的问题是我无法在电子邮件模板中使用当前行迭代中的数据。我知道如何从模板调用函数,但在这种情况下我无法调用正在评估的函数。
我的解决方案是创建另一个函数,该函数将再次循环遍历数据并在电子邮件中发送行实例然后中断。问题是,当我确定可以完成一次时,现在循环两次需要很长时间。
希望我说得有道理。
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>
这是我用来减少处理时间的策略。首先获取要注入 HTML 的所有数据。然后只从文件中获取 HTML 一次,并将其放在 for
循环之外。然后构造新的 HTML 以注入到每个循环的原始 HTML 中。您将需要使用字符串公式,并连接文本以动态更改 HTML.
您不会在每个循环中从电子表格中查找数据,或者让模板化的 HTML 在每个循环中评估 HTML。您将获得一次数据。它将存储在一个数组中。您将获得 HTML 一次,并将其存储在一个变量中。
您需要使用 JavaScript 字符串方法来操作 HTML。
你需要阅读这个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>
我有一个脚本可以逐行发送电子邮件。我遇到的问题是我无法在电子邮件模板中使用当前行迭代中的数据。我知道如何从模板调用函数,但在这种情况下我无法调用正在评估的函数。
我的解决方案是创建另一个函数,该函数将再次循环遍历数据并在电子邮件中发送行实例然后中断。问题是,当我确定可以完成一次时,现在循环两次需要很长时间。
希望我说得有道理。
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>
这是我用来减少处理时间的策略。首先获取要注入 HTML 的所有数据。然后只从文件中获取 HTML 一次,并将其放在 for
循环之外。然后构造新的 HTML 以注入到每个循环的原始 HTML 中。您将需要使用字符串公式,并连接文本以动态更改 HTML.
您不会在每个循环中从电子表格中查找数据,或者让模板化的 HTML 在每个循环中评估 HTML。您将获得一次数据。它将存储在一个数组中。您将获得 HTML 一次,并将其存储在一个变量中。
您需要使用 JavaScript 字符串方法来操作 HTML。
你需要阅读这个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>