2017-10-18 107 views
0

我正在構建一個腳本,該腳本使用循環ImportHTML命令根據郵政編碼在網上抓取天氣數據,並且當前每當腳本運行時都會遇到執行超時的問題Google表格腳本超時解決方法

當前我設置腳本的方式在運行時會產生正確的結果,但假定腳本從數百個源中提取數據,它需要一段時間並且不會在當前Google腳本的時間限制內完成。

運行腳本的片材利用3個標籤:

  1. 拉鍊,其含有來自 站點天氣數據要被從
  2. 空白拽拽郵政編碼鏈接值的列表,這是一個簡單的中介表,用於執行腳本
  3. 結果,其中最終輸出將被放置

爲了儘量減少讀/寫的數量,我改變了寫入ImportHTML命令的每個結果的代碼,因爲它被執行後追加到一個數組並在末尾寫入這個數組的腳本。在它的當前形式的代碼如下:

function getTemps() { 
var googleSheet = SpreadsheetApp.getActive(); 

// Read in Zip code link values 
var sheet = googleSheet.getSheetByName('ZIPS'); 
var zipArray = sheet.getDataRange().getValues(); 
var arrayLength = zipArray.length; 

//Set up sheet values 
var blankSyntaxA = 'ImportHtml("https://www.wunderground.com/cgi-bin/findweather/getForecast?query=pz:'; 
var blankSyntaxB = '&zip=1", "table", 1)'; 
var tempResult = []; 


// Writing Section 

var sheet = googleSheet.getSheetByName('Blank'); 

for (var i = 0; i < arrayLength; i++) 
    { 
    var liveSyntax = blankSyntaxA+zipArray[i][0]+blankSyntaxB; 
    sheet.getRange('A1').setFormula(liveSyntax); 
    var importedData = sheet.getDataRange().getValues(); 
    tempResult = tempResult.concat(importedData); 
    } 
    var sheet = googleSheet.getSheetByName('Result'); 
    sheet.getRange(1,1,tempResult.length,8).setValues(tempResult); 
} 

我知道腳本的運行時間可以通過消除讀減少/寫包含在for循環中,但我不知道如何獲得必要的HTML表格,而不在'空白'表格中運行ImportHTML命令。有沒有辦法運行該命令來填寫'importedData'數組而不寫入表單?

或者,我考慮過利用對函數運行時間的檢查,並在接近〜5分鐘的運行時間限制時執行中斷,然後遞歸調用回原始函數,但我不確定是否這實際上會緩解運行時問題,或者考慮到遞歸調用的性質,甚至是可能的。

有關如何修改此腳本以在腳本超時參數內運行或修改爲使用所有必要的導入數據生成完整所需結果的任何建議,我們將不勝感激。謝謝!

+0

我可能是錯的,但不是超時產生的,因爲https://www.wunderground.com中的服務加載太多了?我試着打開它,但它沒有響應五分鐘 – Piyin

+0

我沒有任何問題在互聯網瀏覽器中提取wunderground.com上的服務,所以不確定它會在服務端。然而,對腳本運行的最大阻力似乎是在for循環運行時加載ImportHTML命令所需的時間。所以我不確定這是否與服務端有關,或者這只是在循環的每次迭代中運行重複命令調用和讀取/寫入結果的本質。 – AndrewLYM

+0

沒有辦法通過一次調用服務就可以獲得所需的所有數據嗎? (可能通過多個郵政編碼或類似的東西) – Piyin

回答

0

有沒有辦法運行該命令來填寫'importedData'數組而不寫入表單?

IMPORTHMTL是Google表格內置的電子表格功能。 Google Apps腳本無法運行/評估此類功能。

相關

另外,我曾經考慮過使用該函數的運行時檢查和實現突破,因爲它臨近了〜5分鐘運行時間的限制,其次是一個遞歸調用回原始函數,但我不確定這是否真的會緩解運行時問題,或者甚至有可能考慮到遞歸調用的性質。

而不是一個「mitigator」這是一個解決方法。有幾種技術像批處理和並行處理。

參考

answerThreading in Google App Script

有來自Bruce Mcphearson一個很好的例子。他的例子 Parallel Processing in Apps Script使用 地圖減少運動。他也在利用觸發器,但也許可以提供一些不同的觀點。

另一種替代方法是登錄Early Access Program將執行時間限制延長到30分鐘。