1

編集:編集には時間がかかるため、回答を追加しました(回答2を参照)

ドキュメントのマージに関する以前の投稿に続いて、スクリプトが機能するようになりました(Henriqueに感謝します;)が、まだ1つの小さな問題があります。 。これを行う簡単な方法が見つかりません。スクリプトは次のようになります:

function mergeDocs(docIDs) {  // parameter docIDs is an array of Doc IDs
  var baseDocname = DocumentApp.openById(docIDs[0]).getName();// typical name = IMPRESSION_page_07_07-06-2012__20:57
  var modelDoc = DocsList.getFileById(docIDs[0]);
  var newmodelName=baseDocname.substr(0,11)+'multipage'+baseDocname.substring(18);
  var baseDocId = DocsList.copy(modelDoc,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)
  var body = baseDoc.getActiveSection();
//
  for( var i = 0; i < docIDs.length; ++i ) {
    var otherCopy = DocumentApp.openById(docIDs[i]).getActiveSection();
    var totalElements = otherCopy.getNumChildren();
    for( var j = 0; j < totalElements; ++j ) {
      var element = otherCopy.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
        throw new Error("According to the doc this type couldn't appear in the body: "+type);
    }
     body.appendPageBreak(); // if content length is too short avoids breaking page layout
  }
}

'PageBreak'は(時々)空白のページを引き起こします、私はそれを知っています(!)、しかし完璧なページレイアウトを維持する必要があります(私はこのドキュメントでラベルを印刷しています)。ここに典型的な例へのリンクがあります

4

2 に答える 2

1

サージ、APIには、要素がどのページに属しているかを示すものは何もないと思います。したがって、これを解決するのは難しいでしょう:)

バットの右側、私は「内部」アプローチを考えています。つまり、どのページが問題を引き起こしているのかがわかります。それが常に同じである場合(たとえば、ラベルの数が固定されている場合)、ページ分割をカウントしてループし、不良なものを削除することができます。

しかし、それが不可能な場合、それは私の推測ですが、少なくともあなたはあなたのレイアウトを知っています。ページに正確に収まるラベルの数をテストしてから、ラベルを数えることができます。そのため、発生した場合は、ページ分割の追加をスキップできます。それはより良い解決策のように見えます。

繰り返しになりますが、レイアウトによっては、それが不可能な場合もあれば、難しすぎる場合もあります。したがって、私が考えることができる最後のことは、ドキュメントDOMをチェックして、ページ分割がページ上に単独であるときに特定のパターンが発生するかどうかを確認することです。それはちょっと変なので、Google Docsはおそらくこのページに空の段落を自動的に挿入するので、「子供がいない」などではなく、プロパティでさえあるかもしれませんが、私にはわかりません。私が知っていることは、これにはかなりの労力が必要であり、DocumentDOMがどのように機能するかを深く理解するために調査を行う必要があるということです。そうしないと、このようなテンプレートとしてドキュメントを頻繁に扱うので、将来的にはそうしなければならないでしょう。私がそうするとき、あなたが私の前にそれをしていなければ、私は私の答えを更新します:)

于 2012-06-08T01:57:27.277 に答える
0

一定の結果が得られるようにスクリプトを変更し、ドキュメントの構造を取得するための分析関数を作成しました。最初の質問は少し長いので、編集するよりも、これらすべてを回答に入れる方がおそらく良い考えだと思いました。1°簡略化されたスクリプト:

function mergeDocs(docIDs) {
  var baseDocname = DocumentApp.openById(docIDs[0]).getName();// typical name = IMPRESSION_page_07_07-06-2012__20:57
  var modelDoc = DocsList.getFileById(docIDs[0]);
  var newmodelName=baseDocname.substr(0,11)+'multipage'+baseDocname.substring(18);
  var baseDocId = DocsList.copy(modelDoc,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)
  var body = baseDoc.getActiveSection();
  var headpara='  *  '
  for (dd=1;dd<baseDoc.getNumChildren();++dd){
  baseDoc.removeChild(baseDoc.getChild(dd))
  }
  for( var i = 0; i < docIDs.length; ++i ) {
    var otherCopy = DocumentApp.openById(docIDs[i]).getActiveSection();
    var totalElements = otherCopy.getNumChildren();

    for( var j = 0; j < totalElements; ++j ) {
      var element = otherCopy.getChild(j).copy();
      var type = element.getType();
      if( type == DocumentApp.ElementType.PARAGRAPH ){
        }
      else if( type == DocumentApp.ElementType.TABLE){
        body.appendTable(element);
          if (i<docIDs.length-1){
              body.appendPageBreak();
              body.appendParagraph(headpara);// add a string '  *  ' to trace it
              }
        }
    }
  }
}

2°分析機能:

function analyse() {
  var Doc = DocumentApp.openById('1UOr44ju8Li6yCSlmFbMRdimNpR2BjCGjcLkrwG9jW74');
    var totalElements = Doc.getNumChildren();
    var el=[]
    for( var j = 0; j < totalElements; ++j ) {
      var element = Doc.getChild(j);
      var type = element.getType();
Logger.log(j+" : "+type)
       if (type =='PARAGRAPH'){
       el[j]=element.getText()
       };
    }
Logger.log(el)    
}

そして最後に、この分析の結果:

0 : PARAGRAPH
1 : PARAGRAPH
2 : TABLE
3 : PARAGRAPH
4 : PARAGRAPH
5 : PARAGRAPH
6 : TABLE
7 : PARAGRAPH
8 : PARAGRAPH
9 : PARAGRAPH
10 : TABLE
11 : PARAGRAPH
12 : PARAGRAPH
13 : PARAGRAPH
14 : TABLE
15 : PARAGRAPH
[, , NOT_FOUND, , ,   *  , NOT_FOUND, , ,   *  , NOT_FOUND, , ,   *  , NOT_FOUND, ]

(「*」はスクリプトによって追加された段落であり、「NOT_FOUND」はテーブルです)したがって、ページブレークは段落として表示され、ドキュメントはテーブル間に段落を作成します(これにより空白ページが発生します)が、 element.removeFromParent()を使用して不要な段落を削除しようとすると、これらの空白のページが表示され続けます...今は少し迷っています;-)長い間ごめんなさい。

于 2012-06-08T17:12:29.110 に答える