2025年11月27日 星期四

【Google表單教學】如何在 Google Apps Script 中偵錯 doGet?解決 "Cannot read property 'parameter' of undefined" 問題

今天我們要來講解 Google 表單與 Google Apps Script (GAS) 的進階教學:如何在試算表的 Google Apps Script 中進行偵錯?

很多開發者在寫 Web App (網頁應用程式) 時,都會遇到一個問題。因為我們是使用「部署」的方式發佈網頁應用程式(通常使用 doGet(e) 函數),如果你在編輯器中直接按下「執行」,程式會因為抓不到網頁傳過來的參數,而出現以下錯誤:

TypeError: Cannot read property 'parameter' of undefined

這代表程式無法讀取 undefined 的屬性 parameter。這時候,我們該如何有效地進行測試與除錯呢?以下將透過一個「訂單查詢系統」的案例來示範兩種解決方法。

案例情境:訂單查詢系統

最近我幫網友寫了一個訂單查詢功能。功能如下:

  1. 查詢:輸入日期區間,查詢訂單(資料存在 Google Sheet 中)。

  2. 更新狀態:勾選特定的訂單,將狀態從「未出貨」更改為「已出貨」或其他狀態。

當我們在前端網頁操作時,實際上是呼叫了 GAS 後端的 doGet 函數,並透過 URL 帶入參數(如日期、訂單編號、狀態代碼等)。

遇到的問題

當你在 GAS 編輯器中,直接選擇 doGet 函數並按下「執行」時,因為沒有實際的網頁請求觸發,參數 e 是空的(undefined),導致程式報錯無法執行,當然也就看不到執行紀錄或錯誤點。

雖然我們可以去查看 GAS 後台的「執行項目」,但在某些呼叫情況下(例如單純的 GET 請求),執行項目可能不會顯示詳細的 Log,這讓除錯變得很困難。

解決方法

方法一:透過前端 URL 測試(較不直觀)

  1. 在前端網頁開啟開發者工具(按 F12)。

  2. 操作你的網頁功能(例如按下查詢或更新)。

  3. 在 Network 分頁或 Console 中找到實際呼叫的 GAS 網址(包含參數)。

  4. 複製該網址,貼到瀏覽器網址列執行。

缺點:這種方式雖然能觸發程式,但如果程式出錯,你往往只能看到報錯畫面,很難即時在 GAS 編輯器中看到變數的變化或斷點。

方法二:建立「測試函數」模擬參數(推薦 ⭐)

這是我最推薦的方式。我們可以寫一個假的測試函數,把參數「寫死」(Hardcode) 在裡面,直接在編輯器內執行。

步驟如下:

  1. 複製主程式:將原本的 doGet(e) 函數內容複製一份。

  2. 建立測試函數:將複製的函數改名,例如 function doTest()

  3. 移除參數依賴:將原本依賴 e.parameter 獲取變數的部分,直接改成手動賦值。

    • 原本寫法var orderId = e.parameter.orderId;

    • 測試寫法var orderId = "123,456,789"; (直接填入你想測試的數據)

  4. 執行測試:在編輯器上方選擇 doTest 函數,按下「執行」或「偵錯」。

程式碼範例:

JavaScript
// 原本的 Web App 入口
function doGet(e) {
  var orderId = e.parameter.orderId;
  // ... 其他邏輯
}

// 修改後的測試函數
function doTest() {
  // 將參數寫死,模擬前端傳來的資料
  var beginDate = "2020/02/01";
  var endDate = "2020/02/10";
  var orderId = "42890722,54763932"; // 模擬選取了兩筆訂單
  var orderStatus = "已出貨";

  // ... 接續原本的處理邏輯
  
  // 這樣就可以直接按「偵錯」了!
}

使用「偵錯」模式的好處

新版 Google Apps Script 編輯器的偵錯功能非常強大:

  1. 設置斷點 (Breakpoints):在行號旁邊點一下,程式執行到這行會暫停。

  2. 查看變數狀態:當程式暫停時,右側視窗會顯示當前所有變數的值、型別(Array, String, Date 等)。你不需要再像以前一樣寫滿 Logger.log 來猜數值了。

  3. 逐步執行:可以單步執行程式,觀察邏輯判斷是否正確。

實戰除錯:注意資料型別 (String vs Number)

在影片示範中,我透過 doTest 發現了一個常見錯誤:indexOf 的使用。

  • 錯誤狀況:如果你的變數是「數字 (Number)」型別,使用 indexOf() 會報錯 is not a function

  • 正確觀念indexOf() 只能用於「字串 (String)」或「陣列」。

  • 解決方式:在使用前,確保將數字轉換為字串,或是檢查資料來源是否正確被解析為字串。

透過偵錯模式,你可以清楚看到變數是 123 (數字) 還是 "123" (字串),這能幫你省下大量的除錯時間。

總結

要在 Google Apps Script 中為 Web App 除錯,不要直接執行 doGet。請複製一份程式碼建立 ,並善用編輯器的偵錯 (Debug) 功能。這樣你可以清楚看到變數變化、抓出型別錯誤,開發效率會大幅提升!

最後提醒大家,程式修改完成後,記得要重新部署 (Deploy) 為新的版本,前端網頁才會生效喔! 



沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。

【Google表單教學】如何在 Google Apps Script 中偵錯 doGet?解決 "Cannot read property 'parameter' of undefined" 問題

今天我們要來講解 Google 表單與 Google Apps Script (GAS) 的進階教學: 如何在試算表的 Google Apps Script 中進行偵錯? 很多開發者在寫 Web App (網頁應用程式) 時,都會遇到一個問題。因為我們是使用「部署」的方式發佈網頁...