Google 脚本 - 使用模板构建 table
Google script - using template to build table
正在尝试生成要通过电子邮件发送的报告。
我的想法是使用 HTML 模板构建电子邮件,但我似乎错过了一些东西......
该电子邮件应包含一份报告,其中将包括 ColB 中具有特定月份的所有条目。
这是我的代码
function MonthlyPulseCheck() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var pulsedate = new Date("02/02/2022");
var pulsemonth = pulsedate.getMonth();
var Pulsetable = buildmonthlypulse(pulsemonth);
var emailtemplate = HtmlService.createTemplateFromFile('Monthly pulse check');
emailtemplate.OOOPULSE = Pulsetable;
var emailbody = emailtemplate.evaluate();
GmailApp.sendEmail('someone@gmail.com',( 'monthly pulse check for month ' + pulsemonth), '',
{htmlBody: emailbody.getContent(),
name: 'test system',
from: 'alias@gmail.com',
replyTo: 'alias2@gmail.com',
})
}
function buildmonthlypulse(pulsemonth) {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var Pulsearray = spreadsheet.getRange('A2:C').getValues();
var i = 0;
var counter = 1;
var imax = 15;//Pulsearray.length;
for (var i = 0; i < imax; i++) {
var arraydate = new Date(Pulsearray[i][1]);
var arraymonth = arraydate.getMonth();
//var pulseHTML = 0;
//var checkdate = new Date(arraydate);
if (arraymonth === pulsemonth) {
if (counter === 1) {
var pulseHTML = '<table style="float: right;"> <body> <tr> <td> TEXT2</td> <td> TEXT</td> <td><a href="ynet.co.il"> NAME</a></td> </tr>'
}
var name = spreadsheet.getRange(i+2, 1).getValue();
var namelink = 'google.com';
var pulseHTML = pulseHTML + ' <tr> <td> 1</td> <td> 2</td> <td><a href="youtube.com"> 3</a></td> </tr>';
var counter = counter + 1;
}
}
if (counter != 1) {
var pulseHTML = pulseHTML + '</tbody> </table>';
}
return pulseHTML;
}
这是 HTML(用作模板)
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<?=OOOPULSE?>
</body>
</html>
发送的电子邮件正文中仅包含数字 0。
任何人都可以理解这一点吗?
我尝试复制您的代码并发现了一些问题:
- 在您的
function buildmonthlypulse()
中,您在 for loop
中多次声明了 var pulseHTML
,return 语句无法访问。
- 在您的 HTML 文件中,您使用的是 Printing scriptlets
<?= ... ?>
用于通过上下文转义打印值。 var pulseHTML
中的 html 元素被识别为字符串。
解法:
- 在 for 循环语句上方声明
var pulseHTML = ''
(就像注释的那样)并在 for 循环内部,删除 var
并保留 pulseHTML
。 示例: pulseHTML = pulseHTML + '</tbody> </table>';
- 不使用打印小脚本
"<?= ... ?>"
,而是使用 Force-printing scriptlets <?!= ... ?>
。它与 Printing scriptlets 相同,但避免上下文转义。
示例输出:
使用打印小脚本
使用强制打印脚本
吹毛求疵:
- 在代码的
pulseHTML = '<table style="float: right;"> <body> <tr>....
中将 <body>
替换为 <tbody>
。
- Proper indentation.
参考文献:
正在尝试生成要通过电子邮件发送的报告。 我的想法是使用 HTML 模板构建电子邮件,但我似乎错过了一些东西...... 该电子邮件应包含一份报告,其中将包括 ColB 中具有特定月份的所有条目。
这是我的代码
function MonthlyPulseCheck() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var pulsedate = new Date("02/02/2022");
var pulsemonth = pulsedate.getMonth();
var Pulsetable = buildmonthlypulse(pulsemonth);
var emailtemplate = HtmlService.createTemplateFromFile('Monthly pulse check');
emailtemplate.OOOPULSE = Pulsetable;
var emailbody = emailtemplate.evaluate();
GmailApp.sendEmail('someone@gmail.com',( 'monthly pulse check for month ' + pulsemonth), '',
{htmlBody: emailbody.getContent(),
name: 'test system',
from: 'alias@gmail.com',
replyTo: 'alias2@gmail.com',
})
}
function buildmonthlypulse(pulsemonth) {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var Pulsearray = spreadsheet.getRange('A2:C').getValues();
var i = 0;
var counter = 1;
var imax = 15;//Pulsearray.length;
for (var i = 0; i < imax; i++) {
var arraydate = new Date(Pulsearray[i][1]);
var arraymonth = arraydate.getMonth();
//var pulseHTML = 0;
//var checkdate = new Date(arraydate);
if (arraymonth === pulsemonth) {
if (counter === 1) {
var pulseHTML = '<table style="float: right;"> <body> <tr> <td> TEXT2</td> <td> TEXT</td> <td><a href="ynet.co.il"> NAME</a></td> </tr>'
}
var name = spreadsheet.getRange(i+2, 1).getValue();
var namelink = 'google.com';
var pulseHTML = pulseHTML + ' <tr> <td> 1</td> <td> 2</td> <td><a href="youtube.com"> 3</a></td> </tr>';
var counter = counter + 1;
}
}
if (counter != 1) {
var pulseHTML = pulseHTML + '</tbody> </table>';
}
return pulseHTML;
}
这是 HTML(用作模板)
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<?=OOOPULSE?>
</body>
</html>
发送的电子邮件正文中仅包含数字 0。 任何人都可以理解这一点吗?
我尝试复制您的代码并发现了一些问题:
- 在您的
function buildmonthlypulse()
中,您在for loop
中多次声明了var pulseHTML
,return 语句无法访问。 - 在您的 HTML 文件中,您使用的是 Printing scriptlets
<?= ... ?>
用于通过上下文转义打印值。var pulseHTML
中的 html 元素被识别为字符串。
解法:
- 在 for 循环语句上方声明
var pulseHTML = ''
(就像注释的那样)并在 for 循环内部,删除var
并保留pulseHTML
。 示例:pulseHTML = pulseHTML + '</tbody> </table>';
- 不使用打印小脚本
"<?= ... ?>"
,而是使用 Force-printing scriptlets<?!= ... ?>
。它与 Printing scriptlets 相同,但避免上下文转义。
示例输出:
使用打印小脚本
使用强制打印脚本
吹毛求疵:
- 在代码的
pulseHTML = '<table style="float: right;"> <body> <tr>....
中将<body>
替换为<tbody>
。 - Proper indentation.