Google 脚本 - 使用模板构建 table

Google script - using template to build table

正在尝试生成要通过电子邮件发送的报告。 我的想法是使用 HTML 模板构建电子邮件,但我似乎错过了一些东西...... 该电子邮件应包含一份报告,其中将包括 ColB 中具有特定月份的所有条目。

Here's a quick demo sheet

这是我的代码

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>&nbsp;TEXT2</td> <td>&nbsp;TEXT</td> <td><a href="ynet.co.il">&nbsp;NAME</a></td> </tr>'
  }
  var name =  spreadsheet.getRange(i+2, 1).getValue();
  var namelink = 'google.com';
  
  var pulseHTML = pulseHTML + '  <tr> <td>&nbsp;1</td> <td>&nbsp;2</td> <td><a href="youtube.com">&nbsp;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。 任何人都可以理解这一点吗?

我尝试复制您的代码并发现了一些问题:

  1. 在您的 function buildmonthlypulse() 中,您在 for loop 中多次声明了 var pulseHTML,return 语句无法访问。
  2. 在您的 HTML 文件中,您使用的是 Printing scriptlets <?= ... ?> 用于通过上下文转义打印值。 var pulseHTML 中的 html 元素被识别为字符串。

解法:

  1. 在 for 循环语句上方声明 var pulseHTML = ''(就像注释的那样)并在 for 循环内部,删除 var 并保留 pulseHTML示例: pulseHTML = pulseHTML + '</tbody> </table>';
  2. 不使用打印小脚本 "<?= ... ?>",而是使用 Force-printing scriptlets <?!= ... ?>。它与 Printing scriptlets 相同,但避免上下文转义。

示例输出:

使用打印小脚本

使用强制打印脚本

吹毛求疵:

  • 在代码的 pulseHTML = '<table style="float: right;"> <body> <tr>.... 中将 <body> 替换为 <tbody>
  • Proper indentation.

参考文献: