網頁

2025年7月30日 星期三

【Google Apps Script教學】if 與 switch 的愛恨情仇:為何我的 switch 判斷式不如預期?

在程式設計的學習路上,流程控制是基本功中的基本功,而 if 和 switch 更是我們最常用的兩種判斷工具。然而,它們的用法與時機卻常常讓初學者感到困惑。

最近,有位網友在論壇上分享了他在訂單查詢系統中遇到的問題:他嘗試將 if 的多條件判斷寫法用在 switch 的 case 中,結果程式雖然沒有報錯,但執行結果卻完全不符合預期。

這篇文章將藉由這個實際案例,深入探討 if 和 switch 的核心差異,並教您如何正確地使用它們,以及如何利用偵錯工具找出問題所在。

網友遇到的問題

這位網友正在開發一個訂單查詢系統,他希望根據不同的查詢條件來更新訂單狀態。他嘗試使用 switch 來處理不同的情境,其中一段程式碼類似這樣:

// 網友的錯誤程式碼範例
switch (OrderStatus) {
  case (listDate >= BeginDate && listDate <= EndDate):
    // ... 處理日期間隔內的邏輯 ...
    break;

  case (OrderStatus != "" && OrderList.indexOf(OrderName) != -1):
    // ... 處理訂單狀態與名稱的邏輯 ...
    break;
  
  // ... 其他 case ...
}

他的預期是,當條件符合時,程式會執行對應 case 區塊的程式碼。但實際情況是,判斷結果總是不正確。這究竟是為什麼呢?

if 與 switch 的核心差異

要解開這個謎題,我們必須先理解 if 和 switch 在設計上的根本不同。

switch 的設計初衷非常單純:檢查一個單一變數是否等於數個特定值中的一個。

它的語法結構如下:

switch (變數) {
  case '值A':
    // 當 變數 === '值A' 時執行
    break;
  case '值B':
    // 當 變數 === '值B' 時執行
    break;
  case '值C':
  case '值D': // 可以讓多個 case 執行同一段程式碼
    // 當 變數 === '值C' 或 變數 === '值D' 時執行
    break;
  default:
    // 當以上所有 case 都不符合時執行
    break;
}

重點:

  • switch 後面的括號 () 內只能放一個變數或表達式。

  • case 後面只能接一個具體的值(例如:數字 10、字串 "已出貨"),用來和 switch 的變數做嚴格相等 (===) 的比較。

  • 它無法處理複雜的邏輯運算,如 && (AND)、|| (OR) 或範圍比較 (>,<)。

if 則彈性得多,是處理複雜邏輯判斷的萬用工具。

它的語法結構如下:

if (條件A && 條件B) {
  // 當條件A和條件B都成立時執行
} else if (條件C || 條件D) {
  // 或者當條件C或條件D至少一個成立時執行
} else {
  // 當以上所有條件都不成立時執行
}

重點:

  • 可以在 () 內組合多個變數

  • 可以使用各種比較運算子 (==!=><)。

  • 可以使用邏輯運算子 (&&||) 來建立複雜的判斷邏輯。

回到網友的問題:錯誤在哪裡?

了解了核心差異後,我們再回頭看網友的程式碼就一目了然了。

switch (OrderStatus) 這行程式碼已經明確告訴程式:「接下來我要比較的對象是 OrderStatus 這個變數。」

因此,後面的 case 只能寫成 case "已出貨": 或 case "處理中": 這樣的形式。網友的寫法 case (listDate >= BeginDate && listDate <= EndDate): 是將 if 的判斷邏輯錯用在 case 上,這是不合法的語法,自然無法得到正確的結果。

正確的解決方案:改用 if 判斷式

對於網友需要判斷「日期區間」或「訂單狀態與名稱同時成立」這類複雜情境,唯一正確的選擇就是使用 if...else if...else

// 正確的寫法
if (listDate >= BeginDate && listDate <= EndDate) {
  // ... 處理日期間隔內的邏輯 ...
  
} else if (OrderStatus != "" && OrderList.indexOf(OrderName) != -1) {
  // ... 處理訂單狀態與名稱的邏輯 ...
  
} else {
  // ... 其他條件都不符合時的邏輯 ...
}

這樣寫,程式碼的邏輯才會清晰且正確地被執行。

小技巧:善用偵錯工具 (Debugger) 理解程式流程

當你不確定程式為何不如預期時,Google Apps Script 內建的「偵錯工具」是你的好幫手。

  1. 設定中斷點:在你想觀察的程式碼行號旁點擊一下,會出現一個藍點,這就是中斷點。

  2. 執行偵錯:選擇要執行的函式後,點擊工具列上的「偵錯」按鈕(長得像一隻小昆蟲)。

  3. 觀察變數:程式會執行到你設定的中斷點暫停。此時,你可以查看右側「偵錯工具」視窗中的「變數」區塊,清楚看到每個變數在當下的值。

  4. 步進執行:點擊「步進」(Step over) 按鈕,讓程式一行一行地往下跑,觀察程式的走向是否跟你想的一樣。

透過偵錯,你可以輕易發現 switch 根本沒有進入你預期的 case,從而快速定位問題。

總結

if 和 switch 都是不可或缺的工具,關鍵在於用對地方。

  • 使用 :當你需要根據一個變數多種固定值(例如:星期一、星期二...;狀態A、狀態B...)執行不同程式碼時,使用 switch 會讓程式碼更簡潔易讀。

  • 使用 :當你需要處理多個變數範圍比較複雜的邏輯組合 (&& / ||) 時,if 才是你最好的朋友。

希望透過這次的案例分析,能幫助大家更深刻地理解 if 與 switch 的差別,未來在撰寫程式時能更加得心應手!



沒有留言:

張貼留言

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