如何确保Script发送包含包含完整数据范围的HTML表的电子邮件?

时间:2019-03-23 01:25:38

标签: html google-apps-script google-sheets

我创建了一个功能,使我可以通过Google表格将电子邮件发送到联系人列表。该电子邮件将包含一个主题行和一个包含我的电子表格数据的表格。我面临的问题是HTML表仅发送标题和1行数据。我找不到我犯的错误。

该表将不断增加,因此我想通过电子邮件发送功能以包括其中包含数据的所有单元格。这可能吗?

我已经改编了How to format email from spreadsheet data using arrays?中的此Script / HTML代码,但是现在我仍然坚持如何根据自己的需要对其进行进一步的修改。

function testMail(){
  var emails = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Contacts");
  var startRow = 2; // First row of data to process
  var numRows = 2; // Number of rows to process
  // Fetch the range of cells A1:B1
  var dataRange = emails.getRange(startRow, 1, numRows, 1);
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    var emailAddress = row[0]; // First column
    var subject = "Current list of BGC 4 Acronyms";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var acronym = ss.getSheetByName("Sheet1");
  var abbv = acronym.getRange("A5:A50").getValues();
  var explan = acronym.getRange("B5:B50").getValues();

  var message = composeMessage(abbv,explan);
  var messageHTML = composeHtmlMsg(abbv,explan);
  Logger.log(messageHTML);
  MailApp.sendEmail(emailAddress, subject, message, {'htmlBody':messageHTML});
}

function composeMessage(abbv,explan){
  var message = 'Here are the data you submitted :\n'
  for(var c=0;c<explan[0].length;++c){
    message+='\n'+abbv[0][c]+' : '+explan[0][c]
  }
  return message;
}

function composeHtmlMsg(abbv,explan){
  var message = '<br><br><table style="background-color:lightblue;border-collapse:collapse;" border = 1 cellpadding = 5><th>Acronym</th><th>Explanation</th><tr>'
  for(var c=0;c<explan[0].length;++c){
    message+='<tr><td>'+abbv[0][c]+'</td><td>'+explan[0][c]+'</td></tr>'
  }
  return message+'</table>';
}

预期结果是将一封电子邮件发送给列表中的每个地址,其中包含主题行和完整的数据表。我实际上得到的是这个

Email received via script

1 个答案:

答案 0 :(得分:0)

尝试更改此内容:

for(var c=0;c<explan[0].length;++c){
    message+='\n'+abbv[0][c]+' : '+explan[0][c]
  }

对此:

我认为abbv和explan是列。

for(var c=0;c<explan.length;c++){
    message+='<br />' + abbv[c][0]+ ' : ' + explan[c][0];
  }

尝试一下:

function composeHtmlMsg(abbv,explan){
  var message = '<br><br><table style="background-color:lightblue;border-collapse:collapse;" border = 1 cellpadding = 5><th>Acronym</th><th>Explanation</th><tr>'
  for(var c=0;c<explan.length;c++){
    message+='<tr><td>'+abbv[c][0]+'</td><td>'+explan[c][0]+'</td></tr>'
  }
  return message+='</table>';
}

根据您的电子表格示例,我认为这可能有效:

var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet1');
var rg1=sh.getRange(5,1,sh.getLastRow()-4,1);
var rg2=sh.getRange(5,2,sh.getlastRow()-4,1);
var explan=rg1.getValues();
var abbv=rg2.getValues();