2012-06-11 66 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