3

在尝试了一些邮件合并脚本之后,我决定不自己编写。我的合并脚本作为单独的文件运行,它从 GDoc 中读取模板,从 GSpreadsheet 中读取数据,并将其合并到 Gmail 或新的 GDoc 中 - 每 SS 行一个页面/电子邮件。

问题是它不会将文本格式、边距或图像复制到 Gmail 或新 GDoc 中……只有纯文本。

我正在使用DocumentApp.openById > getActiveSection > getText()来捕获文本。

这是 GDoc http://goo.gl/fO5vP中的代码 我似乎无法共享脚本,因此我不得不将其放入文档中。将其复制到新脚本中,它将进行颜色编码。

4

1 回答 1

3

您应该首先使用复制模板,DocsList以便从“完整”的初始文档开始。

  var template = DocsList.getFileById(docIDs[0]);// get the template model, in this sample I had an array of possible templates, I took the first one
  var newmodelName=template.substr(0,11)+'multipage'+template.substring(18);// define a new name, do what you need here...
  var baseDocId = DocsList.copy(template,newmodelName).getId();// make a copy of firstelement and give it new basedocname build from the serie(to keep margins etc...)
  var baseDoc = DocumentApp.openById(baseDocId);// this is the new doc to modify

然后使用具有直接replaceText 方法的文档类


编辑:关于你的次要问题,这里有一个关于你如何做的建议。它工作得很好,除了inlineImage,我会继续看这个。您还可以通过添加其他元素类型来使脚本更加通用......

function myFunction() {
  var template = DocsList.getFileById(key);// get the template model
  var newmodelName='testcopy';// define a new name, do what you need here...
  var baseDocId = DocsList.copy(template,newmodelName).getId();// make a copy of firstelement and give it new basedocname build from the serie(to keep margins etc...)
  var baseDoc = DocumentApp.openById(baseDocId);// this is the new doc to modify
  var body = baseDoc.getActiveSection();
  body.appendPageBreak();
  var totalElements = body.getNumChildren();
  for( var j = 0; j < totalElements; ++j ) {
    var element = body.getChild(j).copy();
    var type = element.getType();
    if( type == DocumentApp.ElementType.PARAGRAPH )
      body.appendParagraph(element);
    else if( type == DocumentApp.ElementType.TABLE )
      body.appendTable(element);
    else if( type == DocumentApp.ElementType.LIST_ITEM )
      body.appendListItem(element);
    else if( type == DocumentApp.ElementType.INLINE_IMAGE )
      { var blob = body.getChild(j).asInlineImage().getBlob();
       body.appendImage(blob); }
  }
}

编辑 2感谢@Fausto,这是一个完整的工作版本。内联图像包含在一个段落中,因此我们必须再挖一层才能获得 blob...

function myFunction() {
  var template = DocsList.getFileById(key);// get the template model
  var newmodelName='testcopy';// define a new name, do what you need here...
  var baseDocId = DocsList.copy(template,newmodelName).getId();// make a copy of firstelement and give it new basedocname build from the serie(to keep margins etc...)
  var baseDoc = DocumentApp.openById(baseDocId);// this is the new doc to modify
  var body = baseDoc.getActiveSection();
  body.appendPageBreak();
  var totalElements = body.getNumChildren();
  for( var j = 0; j < totalElements; ++j ) {
    var element = body.getChild(j).copy();
    var type = element.getType();
    if (type == DocumentApp.ElementType.PARAGRAPH) {
      if (element.asParagraph().getNumChildren() != 0 && element.asParagraph().getChild(0).getType() == DocumentApp.ElementType.INLINE_IMAGE) {
        var blob = element.asParagraph().getChild(0).asInlineImage().getBlob();
        body.appendImage(blob);
      }
      else body.appendParagraph(element.asParagraph());
    }
    else if( type == DocumentApp.ElementType.TABLE )
      body.appendTable(element);
    else if( type == DocumentApp.ElementType.LIST_ITEM )
      body.appendListItem(element);
  }
}
于 2013-01-10T07:16:05.893 回答