2025年7月31日 星期四

Excel 高手之路!一次搞懂跨表格的陣列公式,解決團購金額計算難題!

今天我們要來探討一個在 Excel 中非常實用的進階技巧,這個問題延伸自我們先前的教學。上次我們學會了如何使用陣列公式計算單一欄位的團購總金額,而今天,我們要挑戰的是更複雜的情境:如何計算跨越兩個不連續表格的總金額?

許多朋友在嘗試自行延伸應用時,常常會遇到計算結果不正確的問題。就像我的同事一樣,他試著將單欄公式應用在兩欄上,結果算出來的金額是 3180,但正確答案應該是 3170。究竟問題出在哪裡呢?讓我們一步步拆解,並學習正確的解決方案。

問題情境:錯誤的公式與結果

首先,讓我們看看這個案例。我們有兩個團購表格,分別羅列了不同品項的價格與訂購數量。

同事所使用的公式如下:

={SUM(D2:D21)*SUM(E2:I21)+SUM(M2:M21)*SUM(N2:R21)}

這個公式的邏輯是「將第一個表格的價格總和乘以數量總和,再加上第二個表格的價格總和乘以數量總和」。這個思路乍看之下似乎合理,但實際上是錯誤的。我們需要的是將**每一列的「單價 × 數量」**計算出來後,再將所有結果相加,而不是「總價 × 總量」。這就是金額產生誤差的根本原因。

此外,這個方法還有一個致命傷:如果數量欄位中包含非數字的文字(例如本例中的星號 *),SUM 函數會直接忽略它們,導致數量加總錯誤,進而使得整個計算失準。

正確解法三步驟

要正確地解決這個問題,我們需要結合資料清理與正確的陣列公式。

陣列公式在進行乘法運算時,範圍內不能有文字。因此,我們必須先將數量欄位中的星號 * 清除。

注意! 你不能直接使用「尋找與取代」功能來取代 *,因為在 Excel 中,星號是「萬用字元」,代表任何字串。如果你直接取代 *,會導致工作表內所有資料都被清空!

正確的做法是:

  1. 按下 Ctrl + H 開啟「尋找與取代」對話框。

  2. 在「尋找目標(N)」欄位中輸入 ~* (波浪號 + 星號)。波浪號 ~ 是個跳脫字元,它能告訴 Excel 我們要尋找的是「星號本身」,而不是將它當作萬用字元。

  3. 「取代成(E)」欄位保持空白。

  4. 點擊「全部取代」,即可安全地將所有星號清除。

資料清理完畢後,就可以來撰寫正確的公式了。我們需要一個能夠處理兩組「價格 × 數量」運算,並將結果匯總的陣列公式。

正確的公式結構如下:
=SUM(價格範圍1*數量範圍1, 價格範圍2*數量範圍2)

套用到我們的範例中,公式即為:
=SUM(D2:D21*E2:I21, M2:M21*N2:R21)

這個公式的運作原理是:

  1. D2:D21*E2:I21:將左邊表格的價格陣列與數量陣列進行逐一相乘,產生一個新的加總前陣列。

  2. M2:M21*N2:R21:對右邊表格做同樣的運算。

  3. SUM(...):最後,SUM 函數會將這兩組運算後的所有數值全部加總起來,得到最終的正確金額。

這是使用陣列公式最重要的一步!在輸入完公式後,絕對不能直接按 。你必須同時按下 Ctrl + Shift + Enter 這三個鍵。

成功後,你會看到公式的前後被 Excel 自動加上了大括號 {},如下所示,並且儲存格會顯示正確的總金額 3170

{=SUM(D2:D21*E2:I21, M2:M21*N2:R21)}

總結

今天我們學到了幾個非常重要的 Excel 觀念:

  1. 陣列公式的邏輯:要計算總金額,應該使用 SUM(價格範圍*數量範圍) 的結構,而非 SUM(價格範圍)*SUM(數量範圍)

  2. 處理特殊字元:在「尋找與取代」中,若要尋找 * 或 ? 等萬用字元本身,需在前面加上跳脫字元 ~

  3. SUM 函數的多重陣列SUM 函數可以透過逗號來分隔,同時加總多個陣列運算的結果。

  4. 陣列公式的輸入:永遠記得要使用 Ctrl + Shift + Enter 來完成輸入。

希望這個教學能幫助大家更深入地理解 Excel 陣列公式的強大之處,並避免在實務中犯下同樣的錯誤。 



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 的差別,未來在撰寫程式時能更加得心應手!



【Google 表單教學】如何使用單選方格製作多項目訂購單?(含自動計算與Email通知)

您是否也曾遇過這樣的困擾?想用 Google 表單製作訂購單,但產品品項太多,特別是像點心、蛋糕這類商品,常常只是口味或尺寸上的些微差異。如果為每一個品項都建立一個問題,表單將會變得冗長不堪,讓消費者失去填寫的耐心。 今天,我們要分享一個實用的技巧,解決網友遇到的「點心蛋糕類」訂...