如何删除多页文档中的空白页?

时间:2012-06-07 20:03:34

标签: google-apps-script

编辑:添加了答案,因为编辑本来很长(参见答案2)

关注former post about document merging我最终得到了一个工作脚本(感谢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'导致(有时)一个空白页面,我知道(!),但是有必要保持完美的页面布局(我用这个文档打印标签)。 这是a link to a typical example

2 个答案:

答案 0 :(得分:1)

塞尔,我认为API上没有任何内容可以告诉您哪个页面属于某个页面。所以,解决这个问题会很棘手:)

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

但如果那是不可能的,这是我的猜测,至少你知道你的布局。您可以测试以查看完全符合页面的标签数量,然后计算您的标签,以便在发生这种情况时,您可以跳过附加分页符。这似乎是一个更好的解决方案。

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

答案 1 :(得分: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()删除不需要的段落,我仍然有这些空白页面... 我现在有点迷失;-) 很抱歉这么久。