2012-11-22 67 views
4

使用Google-spreadsheet中的google-apps-script,我試圖使用fetchUrl獲取數百行數據並將它們粘貼到我的工作表中使用工作表.appendRow。sheet.appendRow()偶爾會失敗並導致一個空行

獲取數據並拆分爲數組是可以的。但是將它們追加到表格行逐行失敗沒有任何錯誤,並導致空行。

下面是一個非常簡單的例子來重新創建問題。

function appendTest() { 
    var sSheet = SpreadsheetApp.getActiveSpreadsheet(); 
    sheet = SpreadsheetApp.setActiveSheet(sSheet.getSheets()[2]); 
    for (var i = 0; i <= 100; i++) { 
     sheet.appendRow([i, 1, 2, 3, 4, 5]); 
    } 
} 

約5或10行,時間不同,變成空的。 插入Utilities.sleep()似乎也不起作用。

有沒有人有任何想法擺脫這種情況? 預先感謝您。

+0

我試了幾次,不能重現錯誤,似乎工作完美無瑕。臨時服務器問題也許? – AdamL

+0

我也無法重現這一點。即使appendRow不應該像這樣使用,它也不應該失敗。有沒有人在代碼運行時編輯電子表格? –

回答

2

你可以嘗試使用批處理寫在紙張這樣

function appendTest() { 
    var target = new Array() 
    var sSheet = SpreadsheetApp.getActiveSpreadsheet(); 
    sheet = SpreadsheetApp.setActiveSheet(sSheet.getSheets()[2]); 
    for (var i = 0; i <= 100; i++) { 
     target.push(['some data','in some columns','bla bla']); 
    } 
sheet.getRange(sSheet.getLastRow()+1,1,target.length,target[0].length).setValues(target); 
} 

需要注意的是,如果你認爲這個表將太「短」,你可以在迴路中追加空行也是如此。

編輯:以下邁克爾答案相關的,這將是一個更好的主意使用sheet.insertRowsAfter(sheet.getMaxRows(), target.length)

+0

你能重現錯誤Serge嗎? – AdamL

+0

對不起,我沒有嘗試,我只是建議一個更好的方法,沒有行可以留下... –

+1

當然,會有更有效的方式爲用戶附加一塊數據。我在更廣泛的背景下考慮,OP的函數可能會顯示appendRow()的併發問題 - 文檔指出appendRow()在併發可能成爲問題時應該是理想的。但正如我所評論的,OP的函數對我來說工作得很好(作爲appendRow()原子性的示範,而不是最佳編碼實踐的演示)。 – AdamL

3

使用appendRow添加必要的行內循環是片狀的,而不是最好的做法。請參閱:

http://productforums.google.com/forum/#!search/appendrow/docs/y0E9PB_VTJw/cHQznHh1WLIJ

此問題的討論。

+0

您好邁克爾,感謝您的提示;-)我使用您的參考文獻更新了我的代碼。建議。 –

+0

謝謝。您在Google論壇發佈的信息對我非常有用。 – kazuau

+1

謝謝。網址已更改:https://productforums.google.com/forum/#!topic/docs/y0E9PB_VTJw – jrosell

2

只是一個小評論: 我在一個循環中使用appendRow,一次可追加多達30行。腳本現在每天使用大約一週。

有趣的部分是,在腳本測試過程中,當我將它設置爲追加大約100行時,我也看到了行丟失。但在對目標電子表格進行簡單的手動刷新後,我看到沒有缺失的行。所以我認爲這些行實際上是附加的,但是錯誤?在他們的展示中。

相關問題