2012-06-11 72 views
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} 

编辑:这条线必须改变这样的: 如果(TT =” *“){element.removeFromParent()}否则{++ DD}

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

 } 
    } 
    catch(err) 
    { 
    break 
    } 
    } 
} 

但我仍然会遇到一个我不明白的问题:当我在具有空白段落和/或分页符的文档上运行该功能时,删除所有内容都很好。 如果我在同一个文档(只有段落/表格/段落......)上再次运行它,它会进入无限循环,并且日志显示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 
+0

继Sephallia的回答后,我用她的建议编辑了剧本......案件结案我猜! thx –

回答

2

如果我理解正确, dd实际上就是您正在查看的“当前文档元素”。看看下面的代码块:(从原来的职位)

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

你只增加DD时 一)这是一个表。 b)这是一段没有文字的段落。

当它是带文本的段落时,不会递增dd。所以,当它碰到一个有文本的段落时,dd不会增加,所以它会在循环的下一次运行中再次检查同一段落。因此,让dd相同。

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

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

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

编辑#2:没问题,我完全理解你对500char限制的看法,以及在遵守这些限制的同时描述某些事情有多困难:p。我只是希望我能正确解释你的评论。

对于这个代码在这里:

while(body.getNumChildren()>dd) { 

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

我不是百分百肯定系统是如何工作的,但我相信例如你有一个清单,[1] [2] [3]。如果你删除[2]我怀疑列表会做这样的事情... [1] [3] -> [1] [2](其中[3]成为元素[2])。正如我所说的,我并不是100%肯定的,但如果是这样的话,当你移除一个元素时可能会保持dd不变。

+0

你是对的,非常感谢!我几乎忘记了dd是文档的子索引......我还不清楚这个索引是如何运作的,因为在循环本身期间(至少在第一遍),孩子的数量正在减少。这也是为什么我使用try/catch的原因,因为我总是得到一个错误,说我不能删除某个部分的最后一个元素,即使我使用了具有确切数量的元素(起始文档)的for循环。所以我想知道:在执行过程中,儿童是否会索引变化,或者关系索引/孩子是否保持不变? –

+0

据我所知,这个评论不是很清楚(我很担心),但用小于500美元的单词拼写并不容易;-)对不起:-) –

+0

嘿塞尔!以防万一它没有通知你编辑,我给我的答案一个编辑。就像我在编辑中所说的那样,我不是100%确定的,但是给它一个镜头。它可能工作。 – Sephallia