2013-06-26 64 views
1

我寫了一些代碼來執行此電子表格打開時。主要檢查除了名爲「Main」的表以外是否還有工作表,如果有,請刪除除「Main」之外的所有工作表。 (「Main」表將始終顯示第一張表格。)然後清除「Main」表格中的任何內容,並將每次都替換爲最終可以在代碼中讀取的內容。對於應用程序腳本執行得太快的代碼...?

// This creates a menu when this spreadsheet is opened. 
function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var menuEntries = []; 
    var numSheets = ss.getSheets(); 
    while (numSheets.length > 1){ 
    ss.setActiveSheet(numSheets[1]); 
    ss.deleteActiveSheet(); 
    var numSheets = ss.getSheets(); 
    } 

    ss.setActiveSheet(numSheets[0]); 
    ss.getActiveSheet().getDataRange().clear(); 
    menuEntries.push({name: "Create Folder Structure", functionName: "folderStruc"}); 
    ss.addMenu("Click here when done.", menuEntries); 


    ss.getRange('A1:B1').mergeAcross().setValue('TA'); 
    ss.getRange('A2').setValue('First Name'); 
    ss.getRange('B2').setValue('Last Name'); 
    ss.getRange('C2').setValue('Email'); 
    ss.getRange('D2').setValue('Classes'); 

} 

腳本完美的作品時,我通過線調試線。當只有「主」表單時,它也可以很好地工作。但是,當有多個工作表,我打開電子表格,它將通過while循環運行,並刪除除「主」所有的牀單,但它會掛在「主」之一,只是顯示「正在加載...」和不顯示任何細胞或任何東西。自定義菜單出現。它還在頂部的黃色框中顯示「工作」。

+0

從循環中刪除「ss.getSheets()」?如果你只有兩張牀單,你會發現問題。我懷疑問題是網絡。我懷疑你的循環中的一些函數很慢,因爲他們進行網絡調用....或者你可以通過觸發器刪除它們。 – eddyparkinson

+0

Serge在下面解答瞭解決方案。但你是對的,這是一個網絡問題。 – PhysLabTsar

回答

2

你的代碼的工作,如果你簡單地增加各片之間的小延遲刪除,它刪除多個工作表時,是一個已知的問題。

下面是代碼:

function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var menuEntries = []; 
    var numSheets = ss.getSheets(); 
    while (numSheets.length > 1){ 
    ss.setActiveSheet(numSheets[1]); 
    ss.deleteActiveSheet(); 
    Utilities.sleep(1000);// 1 second delay is sufficient and seems optimal from my experience. 
    var numSheets = ss.getSheets(); 
    } 

    ss.setActiveSheet(numSheets[0]); 
    ss.getActiveSheet().getDataRange().clear(); 
    menuEntries.push({name: "Create Folder Structure", functionName: "folderStruc"}); 
    ss.addMenu("Click here when done.", menuEntries); 


    ss.getRange('A1:B1').mergeAcross().setValue('TA'); 
    ss.getRange('A2').setValue('First Name'); 
    ss.getRange('B2').setValue('Last Name'); 
    ss.getRange('C2').setValue('Email'); 
    ss.getRange('D2').setValue('Classes'); 
} 

注:你在你的問題提,你將不會刪除稱爲「主」片,但我沒有看到任何條件,以你的腳本,所以我猜你依靠牀單訂單。在刪除之前添加一個檢查sheetName的條件會非常簡單,所以如果出於某種原因修改了圖紙順序,您將不會冒險刪除主表單。如果需要替換原來的while loop這樣的東西,將會把它們放在它的位置。

while (numSheets.length > 1){ 
    ss.setActiveSheet(numSheets[1]); 
    Utilities.sleep(1000); 
    if(ss.getActiveSheet().getName()=='main sheet'){ 
    ss.moveActiveSheet(0); 
    }else{ 
    ss.deleteActiveSheet(); 
    } 
    var numSheets = ss.getSheets(); 
    } 
+0

非常感謝!這解決了它。 是,「主」片也不會被刪除。我確信的,通過刪除numSheet [1](未[0]),它是第二片材,只要片材的總數量大於1 但是您的除了代碼將確保毫無疑問永遠不要刪除「主」表,如果由於某種原因它不是第一張表。 (Sheet Index 0) – PhysLabTsar

+0

實際上,當我在setActiveSheet()和deleteActivesheet()之間放置1秒的延遲時,它對我很有用: while(numSheets.length> 1)ss.setActiveSheet(numSheets [1]) ; Utilities.sleep(1000); ss.deleteActiveSheet(); var numSheets = ss.getSheets(); } 它掛了一下它的下方,我嘗試過一步移動它,它完美地工作。 再次感謝! – PhysLabTsar