1

编辑:添加了一个答案,因为编辑会很长(见答案2)

之前关于文档合并的帖子之后,我最终得到了一个工作脚本(谢谢 Henrique ;)但我仍然有一个小问题:最终的“合并”文档有时包含我想删除的空白页面(取决于其他文档内容) . 我找不到一个简单的方法来做到这一点。脚本是这样的:

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

好吧,Serge,我认为 API 上没有任何东西可以告诉元素属于哪个页面。所以,解决这个问题会很棘手:)

在蝙蝠的右边,我想到了一种“内部”的方法。我的意思是,你知道哪个页面给你带来了麻烦。如果它总是相同的(例如,您有固定数量的标签),您可以循环计算分页符并删除坏的分页符。

但如果那不可能,这是我的猜测,至少你知道你的布局。您可以测试看看有多少标签完全适合一个页面,然后计算您的标签,这样当它发生时,您就可以跳过附加分页符。这看起来是一个更好的解决方案。

再说一次,根据您的布局,这可能是不可能的或太难了。所以,我能想到的最后一件事是检查文档 DOM,看看当页面上单独出现分页符时是否发生任何特定模式。既然这有点奇怪,我猜谷歌文档可能会自动在这个页面上插入一个空段落,所以它不是“无子”,或者类似的东西,甚至可能是一个属性,我不知道。我所知道的是,这将需要大量的努力,进行调查以深入了解 Document DOM 的工作原理。如果你不这样做,我将来可能不得不这样做,因为我经常将文档作为模板使用。当我这样做时,我会更新我的答案,如果你在我之前没有这样做:)

于 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 回答