Javascript 在Gmail邮件中将Google Sheet range(带格式或不带格式)作为HTML表格发送

Javascript 在Gmail邮件中将Google Sheet range(带格式或不带格式)作为HTML表格发送,javascript,html,google-apps-script,google-sheets,gmail,Javascript,Html,Google Apps Script,Google Sheets,Gmail,因此,我有一个谷歌电子表格,希望通过使用谷歌电子表格触发器以HTML表格的形式通过电子邮件发送“每日报告”表中的一部分内容来创建自动化的每日报告 我在工作表中设置了一些条件格式,以使它能够绘制列中所有在所述列中具有MAX(value)的单元格 我已经成功地创建了下面的代码,通过电子邮件向我发送了范围,但Gmail没有将其识别为HTML表格,而是纯文本 我曾尝试在MailApp.sendmail函数中使用{htmlBody:htmltable},但Gmail刚刚出错([Ljava.lang.Obj

因此,我有一个谷歌电子表格,希望通过使用谷歌电子表格触发器以HTML表格的形式通过电子邮件发送“每日报告”表中的一部分内容来创建自动化的每日报告

我在工作表中设置了一些条件格式,以使它能够绘制列中所有在所述列中具有MAX(value)的单元格

我已经成功地创建了下面的代码,通过电子邮件向我发送了范围,但Gmail没有将其识别为HTML表格,而是纯文本

我曾尝试在MailApp.sendmail函数中使用{htmlBody:htmltable},但Gmail刚刚出错([Ljava.lang.Object;@SOME_HASH)

问题1:如何以HTML而不是纯文本的形式发送表格,并显示所有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.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})
}
问题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})
}
函数sendMail(){ var sh=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet() var数据=sh.getRange(“A2:O38”).getValues(); //var htmltable=[]; var TABLEFORMAT='cellspacing=“2”cellpadding=“2”dir=“ltr”border=“1”style=“宽度:100%;表格布局:固定;字体大小:10pt;字体系列:arial,sans,sans serif;边框收拢:收拢;边框:1px实心#ccc;字体重量:普通;颜色:黑色;背景颜色:白色;文本对齐:中间;文本装饰:无;字体样式:普通;'
var htmltable=['对于问题1,它应该像不使用数组来保存HTML表的每一行一样简单。只需将它连接成一个字符串并通过发送它就可以了

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

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

编辑(连接):

还添加了一个Logger.log,这样您就可以看到最终的htmltable字符串对象是如何产生的。也许可以将该值复制到一个典型的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})
}
然后调用该函数:

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+=
,但它缺少一个错误;before语句。(第7行,文件“SendMail”)。我对JS很陌生,所以我肯定我遗漏了一些明显的东西。我刚刚用上面发布的代码进行了测试,效果很好。你的更改成功了!谢谢!编辑:我在上面发布我的评论时没有看到你的编辑!我已将你的答案标记为已接受。我一直在摆弄你的问题2部分,我已经到了关键点我可以拉入html,并浏览结构,这样我就只能获得表数据。但是我在获取CSS时遇到了困难,因为它包含在标记部分。我可能会在以后有更多时间挖掘解决方案时尝试一些正则表达式。