2015-05-29 49 views
0

我有一個腳本,刪除行,如果谷歌表中的某些單元格留空。我正在處理大約6000多行。該腳本正常工作,但5分鐘後崩潰。 Google的服務器只允許5分鐘的運行時間。如何循環和腳本運行,每4分鐘

我想避開這個運行時間上限。我如何創建一個循環,每4分鐘運行腳本?

這裏是我的代碼:

function readRows() { 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var rows = sheet.getDataRange(); 
    var numRows = rows.getNumRows(); 
    var values = rows.getValues(); 

    var rowsDeleted = 0; 
    for (var i = 0; i <= numRows - 1; i++) { 
    var row = values[i]; 
    if ((row[2] == 0 || row[2] == '') && (row[3] == 0 || row[3] == '')) { 
     sheet.deleteRow((parseInt(i)+1) - rowsDeleted); 
     rowsDeleted++; 
    } else if ((row[3] == 0 || row[3] == '') && (row[4] == 0 || row[4] == '')) { 
     sheet.deleteRow((parseInt(i)+1) - rowsDeleted); 
     rowsDeleted++; 
    } 
    } 
}; 
+1

我原本打算半開玩笑地建議一個巨大的setTimeout或setInterval,但我不確定這是你的問題。你說你的JS一次只能運行5分鐘,然後谷歌關閉它**,你需要刷新**?該腳本是在谷歌腳本運行器上運行,還是在Chrome env(控制檯)中運行? –

+0

是的,確切地說。我需要刷新一些方法。 Google的運行時間上限爲5分鐘。我必須手動刷新腳本。我會liekto設置它自動再次運行腳本。 –

+0

嗯。棘手。有趣!我從來沒有這樣做過,但會這樣嗎? (1)弄清楚如何構建一個定期刷新頁面的chrome擴展(第二個答案看起來最清晰:chrome.tabs.reload)。 (2)在所需的時間運行腳本!勒梅知道,我可以把它變成一個答案。 –

回答

0

最簡單的事情是將它分解成更小的位。

你可以用一個函數來運行一個函數,只處理1000行,這是安全的(儘管谷歌有時會超時)。

然後,使用user property服務,存儲名爲startingRow的變量,並將其設置爲(1000 - rowsDeleted)。

var userProperties = PropertiesService.getUserProperties(); 
var startingRow = userProperties.getProperty("startingRow"); 

//run loop from startingRow to 1000 
//then set new start row for next time function is run 

startingRow = 1000 - rowsDeleted; 
userProperties.setProperty("startingRow", startingRow); 

在該行啓動功能的第二次迭代和運行1000多,等等,直到你到達的數據,其中,你會在startingRow重置爲0

結束我不會」 t將觸發器分開設置4分鐘,使其至少爲10,超時實際設置爲6分鐘。

0

Google Spreadsheets允許您指定激活器。例如,你可以說功能是每分鐘運行一次,每5分鐘等。

所以最簡單的方法是在功能啓動時使用控制單元並檢查/更新控制單元。如果功能中斷,再次觸發時,您可以檢測到「進行中」值並繼續。