2014-06-20 112 views
1

我想每天自動抓取一個網站的數據。在Google Spreadsheets中,我使用=ImportHTML()函數導入數據表,然後使用=query()提取相關數據。這些功能需要10到30秒才能完成計算,每次打開電子表格。Google Spreadsheets:檢查ImportHTML完成的腳本

我使用預定的Google Apps腳本,每天將數據複製到不同的工作表(它存儲的位置,以便我可以運行統計數據)。

我的問題是,在複製數據之前,我無法讓腳本等待計算完成。結果是我的腳本只是複製錯誤信息「N/A」。

我試着只是增加一個Utilities.sleep(60000);,但它沒有奏效。

是否可以創建一個循環,檢查計算完成?我試過沒有成功:

function checkForError() { 
    var spreadsheet = SpreadsheetApp.getActive(); 
    var source = spreadsheet.getRange ("Today!A1"); 
    if (source = "N/A") { 
    Utilities.sleep(6000); 
    checkForError(); 
    } else { 
    moveValuesOnly(); 
    } 
} 

回答

1

鎖是爲了這個。在文檔中查找鎖定服務。使用公共鎖。

0

下面是如何使用齊格的建議(我自己的檢查循環相結合),以解決我類似的問題:

// Get lock for public shared resourse 
    var lock = LockService.getPublicLock(); 
    // Wait for up to 120 seconds for other processes to finish. 
    lock.waitLock(120000); 
    // Load my values below 
    // something like sheet.getRange("A1").setFormula('= etc... 
    // Now force script to wait until cell D55 set to false (0) before 
    // performing copy/pastes 
    var current = SpreadsheetApp.setActiveSheet(sheet.getSheets()[1]); 
    var ready = 1; 
    var count = 0; 
     while (true) { 
     // break out of function if D55 value has changed to zero or counter 
     // has hit 250 
     if (count >= 250) break; 

     // otherwise keep counting... 
    ready = current.getRange("D55").getValue(); 
     if (ready == 0) {count = 400;} 
      Utilities.sleep(100); 
        ++count; 
     } 
    // wait for spreadsheet to finish... sigh... 
    Utilities.sleep(200); 
    // Do my copy and pastes stuff here 
    // for example sheet.getRange("a1:b1").copyTo(sheet.getRange("a3"), {contentsOnly:true}); 
    // Key cells are updated so release the lock so that other processes can continue. 
    lock.releaseLock(); 
    // end script 
    return; 
} 

這工作太棒了對我來說,從毀了我的工作,停止谷歌的零星服務! 謝謝去Zig的建議!

相關問題