我正在尝试执行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。
由于
答案 0 :(得分:0)
getText()
返回一个没有字符格式的String。
更大的问题是Google Apps脚本中的G Suite服务不会将文档提供为HTML。 (Document对象上的getAs()
method仅允许您将其作为PDF检索。)
您可以调整&#34; Google Doc to clean HTML converter&#34;脚本,虽然它不会是微不足道的。它目前不会将表格内容转换为HTML tables,但这对您可以制作的剧本有很大贡献!脚本以非常直接的方式编写,因此修改起来应该非常简单。
具体来说,您需要检查与表格TABLE
,TABLE_ROW
,TABLE_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。