1

试图找到一种从文档中删除空白页的方法,我编写了这个脚本,它做得很好:

function remove_blank() {
var Doc = DocumentApp.openById('1ffmPF1iff1ORSPo4XLGyjQGrqVdXx2Py_zza6N_hV3g');
var dd = 1;
var tt='';
var body = Doc.getActiveSection();
while(body.getNumChildren()>dd){
try{
Logger.log(body.getNumChildren()+'  '+dd)
var element = Doc.getChild(dd);
      var type = element.getType();
      if( type == DocumentApp.ElementType.TABLE){++dd}
        if( type == DocumentApp.ElementType.PARAGRAPH ){
          tt=element.getText();
            if(tt!='  *  '){element.removeFromParent();++dd}

编辑:必须像这样更改此行: if(tt!=' * '){element.removeFromParent()}else{++dd}

(删除元素时不要增加 dd ,而是在有效段落上执行)

       }
    }
    catch(err)
    {
    break
    }
  }
}

但是我仍然遇到一个我不明白的问题:当我在包含空段落和/或分页符的文档上运行该函数以删除所有内容时,一切都很好。如果我在同一个文档上再次运行它(只有段落/表格/段落......)它会进入无限循环,并且日志显示 vardd在 =2 之后不再增加。这是如何发生的,因为dd在 while 循环中的每个表上都增加了?下面是初始文档内容的日志,以及紧随其后的“已处理”文档的日志。(老实说,我必须说这种情况可能永远不会发生,因为该函数在另一个进程中只被调用一次,但我很乐意理解 ;-)

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

0 : PARAGRAPH
1 : TABLE
2 : PARAGRAPH
3 : TABLE
4 : PARAGRAPH
5 : TABLE
6 : PARAGRAPH
7 : TABLE
8 : PARAGRAPH
4

1 回答 1

2

如果我理解正确, dd 本质上是您正在查看的“当前文档元素”。查看下面的代码块:(来自您的原始帖子)

if( type == DocumentApp.ElementType.PARAGRAPH ){
      tt=element.getText();
      if(tt!='  *  ') {
          element.removeFromParent();
          ++dd
      }
}

你只增加 dd 当 a) 它是一张桌子。b) 这是一个没有文字的段落。

当它是带有文本的段落时,您不会增加 dd 。因此,当它遇到有文本的段落时, dd 不会增加,因此它会在下一次循环中再次检查同一段落。因此 dd 保持不变。

我不确定我的答案有一个原因。你说它第一次运行良好。(我假设文档既有空段落又有非空段落)。据说,一旦遇到非空段落,它也应该在第一次运行时卡住。我可能只是错过了一些东西。

无论如何,我希望这个答案可能会有所帮助。如果我注意到其他任何内容,我一定会编辑!

编辑:我不知道这是否适用,但如果您的文档中有任何不是段落或表格的内容,它也会卡在那里。

编辑#2:没问题,我完全理解你所说的关于 500char 限制的内容,以及在遵守该限制的同时描述某些事情有多难:p。我只是希望我正确地解释了你的评论。

关于这里的代码:

while(body.getNumChildren()>dd) {

我相信每次运行时都会重新评估 while 条件。这意味着body.getNumChildren()再次调用,(有时)返回一个较小的数字,因为一个元素已被删除。

我也不是 100% 确定系统是如何工作的,但我相信例如你有一个列表,[1] [2] [3]. 如果你删除[2]我怀疑列表会做这样的事情...... [1] [3] -> [1] [2][3]成为元素[2])。正如我所说,我不是 100% 确定这一点,但如果是这种情况,也许dd在删除元素时保持不变可能会奏效。

于 2012-06-11T21:01:10.677 回答