在使用 Google App Script (GAS) 開發網頁應用程式時,最常遇到的挑戰之一就是如何有效地對 doGet(e) 或 doPost(e) 這類由網頁請求觸發的函式進行偵錯。因為這些函式依賴一個由 Google 自動傳入的事件物件 e,我們無法直接在 Apps Script 編輯器中點擊「執行」來測試,否則會立即遇到錯誤。
傳統的方式是使用 Logger.log() 將變數印出,然後到「執行項目」中查看紀錄。但這種方法不僅效率低落,無法進行中斷點 (Breakpoint) 或單步執行,有時紀錄甚至會延遲或在無痕模式下根本看不到。
今天,我們將介紹一個非常實用且簡單的技巧,讓你能夠像偵錯一般函式一樣,對 doGet(e) 進行完整的中斷點與單步偵錯。
問題情境:為何 doGet(e) 難以偵錯?
doGet(e) 函式的設計是用來接收 HTTP GET 請求。當使用者透過網址訪問你的 GAS 應用時,Google 會將網址上的參數打包成一個事件物件 e,並傳遞給 doGet 函式。
例如,一個典型的 doGet(e) 函式可能長這樣:
function doGet(e) {
var params = e.parameter;
var OrderID = params.OrderID;
var ShopName = params.ShopName;
Logger.log("OrderID=" + OrderID + ", ShopName=" + ShopName);
}
如果你直接在 Apps Script 編輯器中選擇 doGet 函式並點擊「執行」或「偵錯」,由於沒有實際的網頁請求,事件物件 e 根本不存在,所以 e 會是 undefined。當程式試圖讀取 e.parameter 時,就會立刻拋出錯誤:
TypeError: Cannot read property 'parameter' of undefined
這就是為什麼我們無法直接偵錯的原因。
解決方案:建立一個偵錯專用函式 (Debug Function)
解決這個問題的核心思想是: 函式。
我們可以建立一個新的、專門用於偵錯的函式,例如 debug()。在這個函式裡,我們宣告一個變數,其結構完全模仿真實的事件物件 e。
操作步驟如下:
函式
在你的程式碼檔案 (.gs) 中,加入以下函式:
function debug() {
var d = {
"parameter": {
"OrderID": "A0002",
"ShopName": "香純滴雞精"
}
};
doGet(d);
}
程式碼說明:
我們建立的物件 d 完美地模擬了 doGet(e) 函式所期望的 e 事件物件結構。
d 物件中有一個 parameter 屬性。
parameter 屬性本身也是一個物件,裡面包含了你想測試的網址參數,例如 OrderID 和 ShopName。你可以根據你的需求自由修改這些測試值。
最後,我們呼叫 doGet(d),這樣 doGet 函式在執行時,就能從 d 中成功讀取到 d.parameter.OrderID 等值,就像收到真實的網頁請求一樣。
2. 使用偵錯工具
現在,偵錯流程變得非常簡單:
在 Apps Script 編輯器的函式選單中,選擇我們剛剛建立的 debug 函式。
在你想要檢查的程式碼行號旁點擊一下,設定中斷點 (Breakpoint),它會顯示一個藍點。
點擊「偵錯」(昆蟲圖示),而不是「執行」。
程式將會執行到你設定的中斷點並暫停。此時,右方的「偵錯工具」面板會顯示所有區域變數的當前值。你可以逐行執行、進入函式或跳出函式,完整地觀察程式的運作流程。
透過這種方式,你可以輕鬆檢查變數的值是否正確、邏輯判斷是否如預期運作,大幅提升開發與除錯的效率。
總結
對於需要接收參數的 doGet(e) 或 doPost(e) 函式,傳統的 Logger.log 方法既耗時又不直觀。透過建立一個簡單的 debug() 模擬函式,我們可以:
模擬真實的請求參數,測試各種邊界情況。
啟用完整的中斷點偵錯功能,可以逐行追蹤程式碼。
即時查看變數內容,快速定位問題根源。
這個技巧是所有 Google App Script 開發者都應該掌握的實用方法,下次遇到類似問題時,不妨試試看吧!
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。