團隊裡的銷售報表、會員名單、出貨排程常常是三份不同的試算表,每一份都有自己的一套含稅價算法。哪天稅率或會員門檻改了,就得一份一份去找、一格一格改,而且很容易漏掉一份。
這篇的做法是把這些常用邏輯做成具名函式,放在一份「函式庫」試算表裡,其他試算表用「匯入函式」拿過去用。具名函式怎麼新增、怎麼填欄位,在 具名函式怎麼建立 講過了,LAMBDA 本身的語法請看 LAMBDA 與 LET 基礎,這邊直接進實戰。
先決定函式庫要放什麼
我的標準很簡單:同一段算式在兩份以上的試算表出現,而且規則是「公司的規定」而不是「某一份表的設定」,就值得做成函式。這次挑三個:
| 函式 | 引數 | 做什麼 |
|---|---|---|
TAX_PRICE | price, rate | 未稅價算含稅價,四捨五入到整數 |
MEMBER_TIER | total | 依年度消費金額回傳會員等級 |
WORK_DAYS | start_date, end_date, holidays | 兩個日期之間的工作天數,扣掉公司假日 |
下圖是整體的樣子:一份函式庫試算表放函式,其他三份試算表各自匯入一份來用。
圖:函式只在函式庫那份試算表裡維護,其他三份是用匯入函式取得的。
含稅價 TAX_PRICE
銷售報表裡有四個品項的未稅價,營業稅 5%,放在 G1:
| A | B | G | |
|---|---|---|---|
| 1 | 品項 | 未稅價 | 0.05 |
| 2 | 蘋果紅茶 | 45 | |
| 3 | 烏龍奶茶 | 55 | |
| 4 | 青茶 | 35 | |
| 5 | 桂花烏龍 | 50 |
先手算:45 × 1.05 = 47.25,四捨五入到整數是 47。桂花烏龍 50 × 1.05 = 52.5,四捨五入是 53。
把這個算法放進函式庫,欄位這樣填:
- 函式名稱:
TAX_PRICE - 引數預留位置:
price、rate - 公式定義:
建好之前,可以先用 LAMBDA 直接呼叫驗算邏輯:
用 LAMBDA 直接呼叫,驗算含稅價的邏輯,未稅價 45、稅率 0.05
=LAMBDA(price, rate, ROUND(price*(1+rate), 0))(B2, $G$1)建好具名函式之後,報表裡寫的是:
用具名函式算含稅價,稅率放在 G1 的儲存格
=TAX_PRICE(B2, $G$1)往下填,來看看結果:
| E | |
|---|---|
| 2 | 47 |
| 3 | 58 |
| 4 | 37 |
| 5 | 53 |
我選擇把稅率做成引數,而不是直接寫死 0.05 在函式裡。稅率改了,只要改 G1 一格,函式本身不用動。不過如果是「全公司永遠一樣」的數字,寫死在函式裡呼叫起來比較短,這就看你們的習慣。我個人會把稅率放引數,因為同一個函式有時也會拿去算外銷的零稅率。
會員等級 MEMBER_TIER
會員名單裡有年度消費金額,規定是 5000 以上是「金卡」,2000 以上是「銀卡」,其餘是「一般」:
| A | B | |
|---|---|---|
| 1 | 會員編號 | 年度消費 |
| 2 | M001 | 6160 |
| 3 | M002 | 1665 |
| 4 | M003 | 4980 |
| 5 | M004 | 2240 |
| 6 | M005 | 360 |
M003 的 4980 差 20 元就是金卡,這種邊界值最容易在不同的表裡寫出不同的結果,所以特別適合放在函式裡統一。
- 函式名稱:
MEMBER_TIER - 引數預留位置:
total - 公式定義:
驗算邏輯的 LAMBDA 寫法是:
用 LAMBDA 直接呼叫驗算,年度消費放在 B2
=LAMBDA(total, IFS(total>=5000, "金卡", total>=2000, "銀卡", TRUE, "一般"))(B2)IFS 最後一組條件用 TRUE 當作「其他情況」,這個寫法在 IFS 與 SWITCH 實戰 有講。建好之後,會員名單裡就是 ,往下填:
| E | |
|---|---|
| 2 | 金卡 |
| 3 | 一般 |
| 4 | 銀卡 |
| 5 | 銀卡 |
| 6 | 一般 |
門檻改成 6000 的話,只要改函式庫裡的公式定義,不用在名單裡一格一格找。
工作天數 WORK_DAYS
出貨排程要算「從接單日到出貨日,中間有幾個工作天」,要扣掉週末和公司自己的假日。公司假日放在 J2:J3:
| B | C | J | |
|---|---|---|---|
| 1 | 接單日 | 出貨日 | 公司假日 |
| 2 | 2026/10/05 | 2026/10/16 | 2026/10/08 |
| 3 | 2026/10/14 |
手算:2026/10/05 是星期一、2026/10/16 是星期五,中間兩週共 10 個工作天,扣掉星期四的 10/08 與星期三的 10/14,剩 8 天。
- 函式名稱:
WORK_DAYS - 引數預留位置:
start_date、end_date、holidays - 公式定義:
用 LAMBDA 直接呼叫驗算,假日範圍當作第三個引數傳入
=LAMBDA(
start_date, end_date, holidays,
NETWORKDAYS(start_date, end_date, holidays)
)(
B2,
C2,
$J$2:$J$3
)結果是 8,跟手算一致。建好之後用 。
假日範圍我做成引數,而不是寫進函式定義裡,有兩個原因:公式定義裡的範圍儲存時會被轉成絕對參照,換到別份試算表就不一定對得上;另外各份試算表想放假日的位置也不一定一樣。把範圍當引數傳入就不用擔心這點,所以範圍一律用引數傳入,不要寫進函式定義裡。
NETWORKDAYS 這類日期函式的用法在 日期計算實戰 有更多例子。
取名字的慣例
三個函式放在一起之後,名字好不好懂差很多。我目前用的習慣:
- 全部大寫、單字用底線隔開:
TAX_PRICE、MEMBER_TIER。Google 說明中心寫函式名稱不能有空格,也不能有底線以外的特殊符號。 - 用「名詞加用途」,不寫動詞開頭:
TAX_PRICE比CALC_TAX好讀,因為打到一半就看得出是在算價格。 - 引數名稱寫完整:
start_date比s清楚,因為這些名稱會跟著函式說明框一起顯示。 - 小心長得像儲存格位置的名字:
TAX1是第 TAX 欄第 1 列的儲存格位置,Google 說明中心明講這種名字不行;TAX_1就沒問題。 - 想加團隊前綴也可以,例如
MS_TAX_PRICE,之後在一堆函式裡一眼就知道是自己人寫的。名稱長度的上限是不到 255 個字元,不太會碰到。
函式說明和引數說明建議寫「單位和填法」:稅率寫「填 0.05,不是 5」。三個月後再打開,就不用回頭猜了。
從函式庫匯入到其他試算表
函式庫建好了,換其他試算表取用。流程是:
- 開啟要使用函式的那份試算表。
- 點「資料」>「已命名函式」,在右側面板點「匯入函式」。
- 跳出檔案選擇視窗「匯入其他 Google 試算表中的已命名函式」,選函式庫那份,按「插入」。
- 接著跳出勾選視窗「請選取要從指定試算表匯入的已命名函式:」,勾選要匯入的函式後按「匯入」,要全部匯入就按「全部匯入」。
圖:選好函式庫試算表,勾選 TAX_PRICE、MEMBER_TIER、WORK_DAYS 後匯入。
匯入時有幾個行為,是說明中心寫的:
- 目標試算表裡已經有同名的具名函式,匯入的版本會取代它。
- 匯入的函式如果依賴另一個具名函式,Sheets 會警告並標出相依的函式,所以要一起選。
- 公式碰到外部來源,像
IMAGE,也會有警告。
匯入之後,函式和來源試算表是否連動,說明中心沒有寫。維護時一律當作「函式庫改了,其他試算表要再匯入一次才會更新」來規劃,細節在 具名函式進階陷阱。
函式庫要怎麼維護
- 只在函式庫試算表裡改函式,其他表一律不要改匯入進來的版本,不然下次匯入同名函式會被整個取代掉。
- 在函式庫放一個「異動紀錄」工作表,一列一次修改:日期、函式名稱、改了什麼。每次改完,通知有用到的人重新匯入。
- 函式說明寫上版本日期,例如「2026/10/11 起稅率改為引數」,對照起來不用猜哪份是新的。
- 新增函式時,先在儲存格用
LAMBDA直接呼叫驗算,邏輯對了再存成具名函式。
練習
免運費函式
公司規定訂單金額滿 1000 免運費,不到 1000 運費 80 元。請設計一個 SHIPPING_FEE 函式,引數預留位置叫 total,寫出公式定義,並用 LAMBDA 直接呼叫驗算:訂單金額 360 的運費是多少?訂單金額 1665 呢?
函式庫從三個函式起步就夠了,等其他人開始問「這個算法在哪」,再慢慢加。
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章留言討論
共 0 則留言

