在 Gmail 邮件中以 HTML 表格形式通过电子邮件发送 Google 表格范围(带格式或不带格式)

IT技术 javascript html google-apps-script google-sheets gmail
2021-02-03 19:51:40

因此,我有一个 Google 电子表格,并希望通过使用 Google 电子表格触发器将“每日报告”表格中的一部分范围作为 HTML 表格通过电子邮件发送来创建自动每日报告。

我在工作表中有一些条件格式,以使其绘制列中具有 MAX(value) 的列中的所有单元格。

我设法创建了下面的代码,该代码将范围通过电子邮件发送给我,但 Gmail 无法将其识别为 HTML 表格,而是纯文本。

我试过在 MailApp.sendEmail 函数中使用 {htmlBody: htmltable} 但 Gmail 只是出错了 ([Ljava.lang.Object;@SOME_HASH.

问题 1:如何通过电子邮件将表格以 HTML 格式而不是纯文本格式发送,并且所有 HTML 标签都可见?

问题 2:我如何改进我的代码以获取 Google Sheets 单元格格式并将其应用于表格单元格,而不是使用临时格式来让表格看起来正常?

function sendMail(){
 var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
 var data = sh.getRange("A2:O38").getValues();
  //var htmltable =[];

var TABLEFORMAT = 'cellspacing="2" cellpadding="2" dir="ltr" border="1" style="width:100%;table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:1px solid #ccc;font-weight:normal;color:black;background-color:white;text-align:center;text-decoration:none;font-style:normal;'
var htmltable = ['<table ' + TABLEFORMAT +' ">'];

for (row = 0; row<data.length; row++){

htmltable.push ('<tr>');

for (col = 0 ;col<data[row].length; col++){
  if (data[row][col] === "" || 0) {htmltable.push('<td>' + 'None' + '</td>');} 
  else
    if (row === 0)  {
      htmltable.push ('<th>' + data[row][col] + '</th>');
    }

  else {htmltable.push('<td>' + data[row][col] + '</td>');}
}

     htmltable.push('</tr>');
}

     htmltable.push ('</table>');
     Logger.log(data);
MailApp.sendEmail(Session.getActiveUser().getEmail(), 'Daily report','' ,{htmlBody: htmltable})
}
1个回答

对于问题 1,它应该像不使用数组来保存 HTML 表格的每一行一样简单。只需将它连接成一个字符串并通过它发送,应该可以正常工作。

至于问题 2,我假设您必须检查单元格的某些条件以确定如何格式化表格。我不知道是否有一种直接的方法来复制所有格式。

不过,这是一个想法。可以将 Google 表格发布为 HTML(在文件选项卡下查看)。也许有一种方法可以通过 url 拉入 HTML 文件,然后解析为您需要的内容。我只是不知道它是否会保留任何单元格格式。不过值得研究。

编辑(串联):

还添加了一个 Logger.log 以便您可以看到最终的 htmltable String 对象是如何出来的。也许将该值复制到典型的 index.html 页面中,然后查看它如何正确加载或是否正确加载。

function sendMail(){
 var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var data = sh.getRange("A2:O38").getValues();
  //var htmltable =[];

var TABLEFORMAT = 'cellspacing="2" cellpadding="2" dir="ltr" border="1" style="width:100%;table-layout:fixed;font-size:10pt;font-family:arial,sans,sans-serif;border-collapse:collapse;border:1px solid #ccc;font-weight:normal;color:black;background-color:white;text-align:center;text-decoration:none;font-style:normal;'
var htmltable = '<table ' + TABLEFORMAT +' ">';

for (row = 0; row<data.length; row++){

htmltable += '<tr>';

for (col = 0 ;col<data[row].length; col++){
  if (data[row][col] === "" || 0) {htmltable += '<td>' + 'None' + '</td>';} 
  else
    if (row === 0)  {
      htmltable += '<th>' + data[row][col] + '</th>';
    }

  else {htmltable += '<td>' + data[row][col] + '</td>';}
}

     htmltable += '</tr>';
}

     htmltable += '</table>';
     Logger.log(data);
     Logger.log(htmltable);
MailApp.sendEmail(Session.getActiveUser().getEmail(), 'Daily report','' ,{htmlBody: htmltable})
}

编辑(测试和工作,见截图):

测试表

测试电子邮件

更新(问题 2 的解决方案):

检查出从图书馆SheetConverter后这里通过下面的评论中指出,我能够给我一个完美的格式的电子邮件恰好符合我的表!请参阅下面的屏幕截图。

床单

电子邮件

这是实现此解决方案的一些代码(确保首先从上面的链接添加库):

function convSheetAndEmail(rng, email, subj)
{
  var HTML = SheetConverter.convertRange2html(rng);
  MailApp.sendEmail(email, subj, '', {htmlBody : HTML});
}

然后调用该函数:

function doGet()
{
  // or Specify a range like A1:D12, etc.
  var dataRange = SpreadsheetApp.getActiveSpreadsheet().getDataRange();

  var emailUser = 'test@email.com';

  var subject = 'Test Email';

  convSheetAndEmail(dataRange, emailUser, subject);
}
您能否更具体地说明如何将它连接成一个字符串并通过部分发送我需要在我的代码中更改什么?我尝试使用,htmltable +=但出现错误Missing ;声明前。(第 7 行,文件“SendMail”)我对 JS 很陌生,所以我确定我遗漏了一些明显的东西。
2021-03-16 19:51:40
👍🏼 欢迎您的光临!我还用 array.join() 方法进行了测试,但它只会出现一整行逗号,但表格的其余部分显示正常。所以无论哪种方式,一个人应该工作。如果您打算尝试问题 2 部分并找到一个好的解决方案,请在此处发帖并让我们所有人知道!我肯定很想知道。
2021-03-21 19:51:40
我一直在摆弄你的问题 2 部分,我已经到了可以拉入 html 并导航结构的地步,以便我只能获取表格数据。但是,我在获取 CSS 时遇到了麻烦,因为它包含在 <head> 标记部分中。稍后当我有更多时间寻找解决方案时,我可能会尝试一些正则表达式。
2021-03-29 19:51:40
你的改变成功了!谢谢!编辑:我在上面发表评论时没有看到您的编辑!我已将您的答案标记为已接受。
2021-04-08 19:51:40
刚刚用我上面发布的代码进行了测试,它工作得很好。
2021-04-09 19:51:40