Google Apps Script 是自動化行政流程的好幫手,但當程式跑得太慢,甚至執行逾時或超額配額卡住,再好的腳本也沒有用。
這裡有三個小技巧,幫你的程式踩了一腳油門,讓它跑得又快又穩!
拒用 appendRow() ,改用批量寫入
如果你常用 Google Sheet,可能會覺得 appendRow() 很好用,處理完資料直接寫進 Sheet。但你可能不知道,它每次都要呼叫 API 操作,而且每次只寫入一筆。
當有大量資料時,這種操作就像用滴管裝水,會慢得讓人崩潰。
改善方法:批量處理資料
用 記憶體暫存(Array)儲存資料,最後一次性用 setValues() 全部寫回表格,減少呼叫 API。
錯誤範例
function slowAppendRows() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for (var i = 0; i < 100; i++) {
sheet.appendRow([i, '數據' + i]);
}
}
優化範例
function fastWriteRows() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = [];
for (var i = 0; i < 100; i++) {
data.push([i, '數據' + i]);
}
sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data);
}
同樣道理,像 insertRowAfter() 或 deleteRow() 這些操作,還有 getValue()、setValue() 的頻繁使用,都應該能省就省。核心觀念是:減少 API 呼叫,靠記憶體多處理。
別亂開 Logger.log()
Logger.log() 是很實用的偵錯工具,但它也是隱形的效能殺手,因為它也是一種 API 呼叫操作。如果在大迴圈裡不加過濾,拼命寫 Log,程式執行時就會一直等待 Log 寫入與回應。
改善方法:加上日誌開關
設置全域變數作為 Debug 模式的開關,必要時才啟用記錄,避免不必要的日誌生成。
範例: Debug Mode 的參考結構
// 全域變數,控制是否啟用除錯模式
var DEBUG_MODE = true;
function logDebug(message) {
if (DEBUG_MODE) {
Logger.log(message);
}
}
function exampleFunction() {
logDebug("這是一條除錯訊息");
// 你的其他程式碼
for (var i = 0; i < 10; i++) {
logDebug("目前的迴圈次數: " + i);
}
}
觸發器記得加防呆條件
若使用「開啟文件」或「編輯時」觸發器,務必加上條件判斷,確保程式只在需要時執行,避免每次觸發都浪費資源跑整支程式。
範例:只有目標工作表或欄位才執行
function onEdit(e) {
// 取得被編輯的工作表、儲存格位置
var sheet = e.range.getSheet();
var editedColumn = e.range.getColumn();
// 檢查工作表名稱及編輯的欄位置
if (sheet.getName() !== "Data") {
// 如果編輯的不是 "Data" 這個工作表,直接結束,不執行後續程式
return;
}
if (editedColumn !== 2) {
// 如果編輯的不是第 2 欄,直接結束
return;
}
// ... 在這裡放入你的後續處理程式碼
}
結語
有些人覺得:「反正程式在背景跑,慢就慢嘛,我又沒差。」我完全同意這種看法!就像洗碗機明顯洗得很慢,可是我不用動手啊!慢就慢吧!
但問題是,Google 免費版 Apps Script 的配額有限:每天運算時間 90 分鐘,每次最長 6 分鐘。這些配額對大多數人夠用,但如果你寫的腳本特別吃資源,就可能會把額度耗光。
透過這些小技巧,讓你的 Apps Script 更高效,節省配額又能穩定運行,輕鬆當個效率大師!
Comments