2025年3月13日 星期四

Google Apps Script 執行逾時

目前 Google Apps Script 執行超過 6 分鐘,便會發生逾時。
Google Apps Script 限制可參考
https://developers.google.com/apps-script/guides/services/quotas#current_limitations
(雖然文件上寫 Google Workspace 帳號,Script runtime 限制也是 6 分鐘,不過網上有人說是 30 分鐘。我問 Gemini,最初說 30 分鐘,後來問資料來源,變成 6 分鐘。)
 

處理逾時,可優化程式碼,
例如,減少對 Google Sheets 的讀寫次數、資料暫存在陣列中最後一次性寫回、使用快取(Cache Service)、批次分段處理.....


我的情況是抓取上櫃股票股價,想要抓的股票越來越多,最後便逾時了。
所以我選擇批次分段處理,執行時,記錄當下處理到第幾筆資料,下次排程執行接著處理。

記錄當下處理到第幾筆資料,可使用 Properties Service,將「處理到第幾筆的變數值」儲存在屬性中,儲存在屬性的資料,不會隨著 Script 執行完畢消失,下次執行時可取出該屬性值。

屬性有三種,存取權限有差異:

  • Script Properties:All users of a script, add-on, or web app
  • User Properties:The current user of a script, add-on, or web app
  • Document Properties:All users of an add-on in the open document

我選擇儲存在 Script Properties
Class Properties 使用範例(以 Script Properties 為例):

try {
const scriptProperties = PropertiesService.getScriptProperties();

// 將 aaa 這個值,儲存到 k1 這個 key
scriptProperties.setProperty('k1', 'aaa');

// 若要儲存物件,先 JSON.stringify 轉成字串
scriptProperties.setProperty('k23', JSON.stringify({ k2: 'bbb', k3: 'ccc' }));

//一次儲存很多組 key-value,使用 setProperties(properties, deleteAllOthers)
//第2參數 deleteAllOthers 若設為 true,會刪除所有其他屬性
scriptProperties.setProperties({ k4: 'ddd', k5: 'eee', k6: 'fff' });

//取得指定的屬性
const data = scriptProperties.getProperty('k5');//若不存在此鍵,則回傳 null。
console.log('Value: %s', data);

//取得所有屬性
const data_all = scriptProperties.getProperties();//回傳 Object
for (const key in data_all) {
  console.log('Key: %s, Value: %s', key, data_all[key]);
}

//取得所有 key
const key_all = scriptProperties.getKeys();//回傳 String[]
for (let i = 0; i < key_all.length; i++) {
  console.log(key_all[i]);
}

//刪除指定的屬性
scriptProperties.deleteProperty('k5');

//刪除所有屬性
scriptProperties.deleteAllProperties();

} catch (err) {
console.log('Failed with error %s', err.message);
}

處理結果:
排程要從頭處理第 3~92 列資料,處理到第 76 列逾時停止,下一次排程則從第 76 列開始處理,成功處理完成,再下一次排程才再從頭處理第 3~92 列資料。


其他:
從專案設定,可以查看、管理 Script Properties




參考:




沒有留言:

張貼留言