今天要接著聊聊 LAMBDA
的第二個輔助函式,MAP
。
英文中「map」這個詞除了有名詞「地圖」的意思之外,在電腦科學與數學領域裡面偶有動詞「映射」的意思。在正式介紹 MAP
函式之前,我想先用一張圖簡單介紹 Google 試算表 MAP
函式的「映射」是什麼意思。
想像你有個「1、2、3」的陣列,想讓陣列的每個值乘以自己(平方),讓它出現在另一個陣列上:
這就是 MAP
的映射了。
Google 試算表的 MAP
函式會讀取某範圍,讓它裡面每個數值都以 LAMBDA
函式運算,回傳對應的新範圍。以上面的例子來說,左手邊的「1、2、3」經過了中間的 LAMBDA
運算(自己乘以自己),就映射出右手邊的「1、4、9」了。
我們常用 MAP
函式做這些事:
ArrayFormula
不能與 AND
、OR
使用的限制)我個人是把 MAP
當作一種 ArrayFormula
在特定狀況無法使用的替代方案(特別是 AND
、OR
)、或是在做資料清理時,遇到多張結構相似的試算表時候就會用 MAP
,再搭配已命名函式,把打包好的函式套用在其他地方,直接把時間省起來,提早休息!
點這邊可以到練習用的試算表,歡迎複製一份,我們一起來練習。
=MAP(範圍, LAMBDA)
LAMBDA
函式的範圍。MAP
套用於範圍內每個值的自訂函式。語法相當單純!如果你有多個範圍要操作,當然可以多寫幾個範圍,再用 LAMBDA
結束:
=MAP(範圍 1, 範圍 2, 範圍 3, ... LAMBDA)
拿上面的例子,假設在 A1
到 A3
有「1、2、3」三個數字:
我希望在 B1
到 B3
可以映射出 A1
到 A3
的平方。在 B1
寫:
=MAP(A1:A3, LAMBDA(val, val * val))
A1:A3
LAMBDA
:把 A1
到 A3
的每個值叫做 val
,然後讓它自己乘以自己(val * val
)。來看看執行結果:
可以看到 B 欄成功把 A 欄透過 LAMBDA
函式映射過去、得到想要的結果了!
那我們來實際操作看看!✨
先從簡單的例子開始好了。打開「計算服飾特價」工作表:
我們試著用 MAP
函式來算每個品項打 8 折的特價吧!
先釐清一下需求:
B2
到 B11
val
,讓 LAMBDA
去計算它。這樣拼湊起來,我們就會得到:
=MAP(B2:B11, LAMBDA(val, val * 0.8))
放在 C2
上面,看看執行效果怎麼樣:
這樣就完成了!
把範圍的資料按條件分類也是 MAP
的常用場景之一。接下來試試看第二個練習,「VIP 會員分級」:
我想把每個會員依據 B 欄的消費金額簡單分類,讓他們有不同的會員等級。
分級規則是這樣的:
好,來釐清一下需求:
B2
到 B13
IFS
來分類,讓值根據我們設定的條件顯示不同的結果。這邊一樣把範圍裡的值叫做 val
,讓 LAMBDA
去計算它。好,把這邊的需求拼起來,我們就會得到:
=MAP(B2:B13, LAMBDA(val,
IFS(val > 50000, "VVVIP", val > 30000, "VVIP",
val > 10000, "VIP", val <= 10000, "一般會員")))
我們在 C2
輸入這串算式,就會得到:
這樣就輕易完成囉!
如果你不熟悉 IFS
的用法,可以回來這邊複習一下:IFS,IF 只要加個 S...?如果你有更細緻的條件想要設定,當然可以再進一步搭配 AND
跟 OR
函式。
最後來挑戰困難一點點的「匯率換算」!我們要試試看讓 MAP
讀取兩組範圍的值,個別讓 LAMBDA
處理。
A 欄跟 B 欄有各有一組資料,分別是當地貨幣與幣別代號。我們想要把每一列的外幣轉成台幣,顯示在 C 欄,像是這樣:
⋯⋯以此類推。
說到匯率換算,就可以用 GOOGLEFINANCE
函式來幫我們的忙。我們只要把外幣幣別代號跟新台幣的「TWD
」代號串在一起,就算得出目前外幣轉新台幣的匯率。舉例:
USDTWD
:美金轉新台幣JPYTWD
:日幣轉新台幣EURTWD
:歐元轉新台幣比如說,下面的算式可以得到 100 塊美金(USD
)可以換多少新台幣:
=100 * GOOGLEFINANCE("USDTWD")
(不確定 GOOGLEFINANCE
怎麼做的話,歡迎來這複習:日幣換了沒?GOOGLEFINANCE 總整理(一):匯率換算)
一樣釐清一下需求有哪些:
A2
到 A6
(當地貨幣)、B2
到 B6
(幣別代號)TWD
字串接在一起後交給 GOOGLEFINANCE
,再讓 A 欄的值跟 GOOGLEFINANCE
的結果相乘。看起來有點複雜,沒關係!我們一步步來。先從 MAP
這邊指定要運算的範圍:
=MAP(A2:A6, B2:B6,
寫 LAMBDA
:
=MAP(A2:A6, B2:B6,
LAMBDA(
接下來指定參數的名稱。我這邊用 local
表「當地貨幣」、code
表「貨幣代碼」,這邊要照順序寫讓 local
會和前面的 A 欄對應、code
與 B 欄對應:
=MAP(A2:A6, B2:B6,
LAMBDA(local, code,
再來要做匯率的轉換,就是 local
乘以 GOOGLEFINANCE
的結果:
=MAP(A2:A6, B2:B6,
LAMBDA(local, code, local * GOOGLEFINANCE(
最後,把剛剛指定的 code
(貨幣代碼)和新台幣代號的 TWD
串起來,然後順便寫前面 LAMBDA
跟 MAP
的右括號:
=MAP(A2:A6, B2:B6,
LAMBDA(local, code, local * GOOGLEFINANCE(code & "TWD")))
這樣就完成了!
我們在 C2
執行看看,就會得到:
搞定!
最後,我另外做了一份「VIP 會員分級 + AND / OR」的示範:
你可以點 D2
,這邊是我的算式:
=MAP(B2:B, C2:C, LAMBDA(amount, visits,
IFNA(IFS(AND(amount >= 80000, visits >= 8), "VVVIP",
AND(amount >= 80000, visits < 8), "VVIP",
AND(amount <= 80000, visits >= 8), "VIP"),
"一般會員")))
我試著用 MAP
,讓它跟 AND
、OR
搭配使用。這突破 ArrayFormula
與 AND
或 OR
不能同時使用的限制,這麼一來也就不需要用巢狀 IF
囉。有興趣的話歡迎參考一下!
如果你喜歡這次的文章,歡迎你透過這些方法支持我:
想要看更多文章的話,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!
我是喜特先生,Mr. Sheet,我們下個教學見!