无尽的循环:为什么无穷无尽?

时间:2012-06-11 20:40:03

标签: google-apps-script

试图找到一种从文档中删除空白页面的方法我写了这个脚本很好地完成了这项工作:

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
    }
  }
}

但是我仍然遇到一个我不明白的问题:当我在具有空段落和/或分页符的文档上运行该函数以删除所有内容时都可以。 如果我在同一个doc上再次运行它(只有段落/表/段落...)它进入无限循环,日志显示var dd在= 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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

有一个原因让我不确定我的答案。你说它第一次运行正常。 (我假设文档有空的和非空的段落)。据说,一旦遇到非空段落,它也应该在第一次运行中卡住。我可能只是遗漏了一些东西。

无论如何,我希望这个答案可能有所帮助。如果我发现其他任何事情,我一定会编辑!

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

编辑#2:没问题,我完全明白你所说的关于500char限制的内容以及在遵守这些限制时描述某些事情的难度:p。我希望我能正确地解释你的评论。

关于此代码:

while(body.getNumChildren()>dd) {

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

我不是100%确定系统的工作原理,但我相信你有一个列表[1] [2] [3]。如果您删除[2],我怀疑该列表会执行以下操作... [1] [3] -> [1] [2](其中[3]成为元素[2])。正如我所说的那样,我对此并不是百分之百确定,但如果是这种情况,可能会在删除元素时保持dd不变可能会有所作为。