无尽的循环:为什么没完没了?(Endless loop : why endless?)

2019-07-29 20:32发布

试图找到一种方法来删除一个文件我写这个剧本,没有工作得很好空白页:

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()}否则{++ DD}

(移除元素时不增加DD,这样做对有效替代款)

       }
    }
    catch(err)
    {
    break
    }
  }
}

但是我还是一个问题,我不明白:当我在具有空段落和/或pagebreaks去除一切都很好一个文档运行功能。 如果我在同一个文档再次运行(即只有段/表/段落......)最后,在EN无限循环和日志显示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

Answer 1:

如果我理解正确,DD基本上是“当前文档元素”,你看。 看看下面的代码块:(从原来的职位)

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

您只增加DD时),这是一个表。 B)这是没有文字段落。

当它与文本段落,你不增加DD。 所以,当它击中有文字段落,DD不增加,所以再次检查同款通过循环下一次运行。 因而留下DD相同。

还有一个原因,我不确定我的答案。 你说,它通过运行良好的第一次。 (我假设文档具有空以及非空的段落)。 据说,它也应该会卡在第一次运行,一旦它击中一个非空的段落。 我可能只是虽然失去了一些东西。

无论如何,我希望这个答案也许会有所帮助。 如果我发现任何东西,我一定会编辑!

编辑:我不知道这是否适用,但如果你有你的文档中的任何不是一个段落或表格,它也将成为卡在那里。

编辑#2:没问题,我完全理解你说的关于500char限制,以及如何努力也可以是描述某些事情,而守法什么:对。 我只希望我正确解释您的评论。

这里关于这个代码:

while(body.getNumChildren()>dd) {

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

我不是100%肯定该系统是如何运作下去,但我相信,比如你有一个列表, [1] [2] [3] 如果删除[2]我怀疑名单会做这样的事情... [1] [3] -> [1] [2]其中, [3]变成元素[2] 正如我所说的,我不是100%肯定有关,但如果是这样的话,也许保持dd不变,当你删除一个元素可能做的伎俩。



文章来源: Endless loop : why endless?