3

いくつかの差し込み印刷スクリプトを試した後、自分で作成しないことにしました。私のマージ スクリプトは、GDoc からテンプレートを読み取り、GSpreadsheet からデータを読み取り、それを Gmail または新しい GDoc (SS 行ごとに 1 ページ/メール) にマージする別のファイルとして実行されます。

問題は、テキストの書式設定、余白、または画像が 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のおかげで、ここに完全に機能するバージョンがあります。インライン画像は段落に含まれているため、ブロブを取得するにはさらに 1 レベル掘り下げる必要がありました...

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 に答える