邮件合并脚本不复制格式

时间:2018-04-06 07:32:05

标签: javascript google-apps-script google-sheets google-docs mailmerge

我正在尝试执行mailmerge脚本,该脚本从电子表格中读取字段,并从google doc中读取模板。该脚本在google doc上运行。

该脚本工作正常,但不会复制文档中的格式或表格。这很关键。

以下是我正在使用的代码。

function mmerge() {
  var mdoc=DocumentApp.getActiveDocument();
  var mdat=SpreadsheetApp.openById("1Nc2xu--").getSheetByName("MailMerge List);
  var numcols=mdat.getDataRange().getNumColumns();
  var numrows=mdat.getDataRange().getNumRows();
  var mtxt=mdoc.getBody().getText();
  var flds=[];
  for (var j=0;j<numcols;j++) {flds.push(mdat.getRange(1, j+1).getValue());}
  var rtxt;
  for (var i=2; i<=numrows; i++) {
    rtxt=mtxt
    for (var j=1; j<=numcols; j++) {
      rtxt=rtxt.replace("{"+flds[j-1]+"}",mdat.getRange(i, j).getValue());
    }
    mdoc.getBody().appendParagraph(rtxt);
  }  
}

我怀疑它与此处使用的方法有关:mtxt=mdoc.getBody().getText()但我不知道如何更改它。我尝试将其更改为copy()会导致错误。

有谁知道我做错了什么?任何帮助将不胜感激。

更新:这不是一个直接的复制问题:该过程涉及必须执行邮件合并,然后将格式应用于mailmerged doc。

由于

1 个答案:

答案 0 :(得分:0)

getText()返回一个没有字符格式的String。

更大的问题是Google Apps脚本中的G Suite服务不会将文档提供为HTML。 (Document对象上的getAs() method仅允许您将其作为PDF检索。)

您可以调整&#34; Google Doc to clean HTML converter&#34;脚本,虽然它不会是微不足道的。它目前不会将表格内容转换为HTML tables,但这对您可以制作的剧本有很大贡献!脚本以非常直接的方式编写,因此修改起来应该非常简单。

具体来说,您需要检查与表格TABLETABLE_ROWTABLE_CELL相关的ElementTypes,然后将这些元素包装在相应的HTML中标签。您可以在此示例中看到oazabir如何做到这一点:

if (item.getType() == DocumentApp.ElementType.PARAGRAPH) {
    switch (item.getHeading()) {
        // Add a # for each heading level. No break, so we accumulate the right number.
      case DocumentApp.ParagraphHeading.HEADING6: 
        prefix = "<h6>", suffix = "</h6>"; break;
      case DocumentApp.ParagraphHeading.HEADING5: 
        prefix = "<h5>", suffix = "</h5>"; break;
      case DocumentApp.ParagraphHeading.HEADING4:
        prefix = "<h4>", suffix = "</h4>"; break;
      case DocumentApp.ParagraphHeading.HEADING3:
        prefix = "<h3>", suffix = "</h3>"; break;
      case DocumentApp.ParagraphHeading.HEADING2:
        prefix = "<h2>", suffix = "</h2>"; break;
      case DocumentApp.ParagraphHeading.HEADING1:
        prefix = "<h1>", suffix = "</h1>"; break;
      default: 
        prefix = "<p>", suffix = "</p>";
    }

    if (item.getNumChildren() == 0)
      return "";
  }

将模板转换为HTML后,您就可以使用现有代码对其进行操作。 (例如,让ConvertGoogleDocToCleanHtml()返回HTML文本并将其保存到mtxt变量中。)

最后,在当前脚本中,您进行多次调用以获得相同的范围。这些电话是really slow。相反,尝试获取范围一次get the values,然后对返回的数组进行操作。

var mailMergeRange = SpreadsheetApp.openById("1Nc2xu--").getSheetByName("MailMerge List").getDataRange().getValues();
var numcols = mailMergeRange.length;
var numrows = mailMergeRange[0].length;

您还可以使用高级云端硬盘服务和MailChimp API尝试this approach