LAMBDA 函式(三):MAP

2024/04/12閱讀時間約 8 分鐘

今天要接著聊聊 LAMBDA 的第二個輔助函式,MAP

英文中「map」這個詞除了有名詞「地圖」的意思之外,在電腦科學與數學領域裡面偶有動詞「映射」的意思。在正式介紹 MAP 函式之前,我想先用一張圖簡單介紹 Google 試算表 MAP 函式的「映射」是什麼意思。

想像你有個「1、2、3」的陣列,想讓陣列的每個值乘以自己(平方),讓它出現在另一個陣列上:

raw-image

這就是 MAP 的映射了。

Google 試算表的 MAP 函式會讀取某範圍,讓它裡面每個數值都以 LAMBDA 函式運算,回傳對應的新範圍。以上面的例子來說,左手邊的「1、2、3」經過了中間的 LAMBDA 運算(自己乘以自己),就映射出右手邊的「1、4、9」了。

我們常用 MAP 函式做這些事:

  • 資料清理:轉換大小寫、篩選資料、清除特定字詞
  • 資料分類:可搭配不同的條件分類資料(可突破 ArrayFormula 不能與 ANDOR 使用的限制)
  • 清單的文字處理:批次擷取或取代文字

我個人是把 MAP 當作一種 ArrayFormula 在特定狀況無法使用的替代方案(特別是 ANDOR)、或是在做資料清理時,遇到多張結構相似的試算表時候就會用 MAP,再搭配已命名函式,把打包好的函式套用在其他地方,直接把時間省起來,提早休息!

點這邊可以到練習用的試算表,歡迎複製一份,我們一起來練習。




MAP 語法

=MAP(範圍, LAMBDA)
  • 範圍:要套用 LAMBDA 函式的範圍。
  • LAMBDA:要 MAP 套用於範圍內每個值的自訂函式。

語法相當單純!如果你有多個範圍要操作,當然可以多寫幾個範圍,再用 LAMBDA 結束:

=MAP(範圍 1, 範圍 2, 範圍 3, ... LAMBDA)


拿上面的例子,假設在 A1A3 有「1、2、3」三個數字:

raw-image

我希望在 B1B3 可以映射出 A1A3 的平方。在 B1 寫:

=MAP(A1:A3, LAMBDA(val, val * val))
  • 要運算的範圍:A1:A3
  • LAMBDA:把 A1A3 的每個值叫做 val,然後讓它自己乘以自己(val * val)。
raw-image

來看看執行結果:

raw-image

可以看到 B 欄成功把 A 欄透過 LAMBDA 函式映射過去、得到想要的結果了!

那我們來實際操作看看!✨




計算服飾特價

先從簡單的例子開始好了。打開「計算服飾特價」工作表:

raw-image

我們試著用 MAP 函式來算每個品項打 8 折的特價吧!

先釐清一下需求:

  • 範圍:B2B11
  • LAMBDA:範圍的值乘以 0.8。我把範圍裡的值叫做 val,讓 LAMBDA 去計算它。

這樣拼湊起來,我們就會得到:

=MAP(B2:B11, LAMBDA(val, val * 0.8))


放在 C2 上面,看看執行效果怎麼樣:

raw-image

這樣就完成了!




VIP 會員分級

把範圍的資料按條件分類也是 MAP 的常用場景之一。接下來試試看第二個練習,「VIP 會員分級」:

raw-image

我想把每個會員依據 B 欄的消費金額簡單分類,讓他們有不同的會員等級。

分級規則是這樣的:

  • 消費金額超過 50000 元 → VVVIP
  • 消費金額超過 30000 元 → VVIP
  • 消費金額超過 10000 元 → VIP
  • 消費金額低於或含 10000 元 → 一般會員

好,來釐清一下需求:

  • 範圍:B2B13
  • LAMBDA:範圍的值用 IFS 來分類,讓值根據我們設定的條件顯示不同的結果。這邊一樣把範圍裡的值叫做 val,讓 LAMBDA 去計算它。

好,把這邊的需求拼起來,我們就會得到:

=MAP(B2:B13, LAMBDA(val, 
IFS(val > 50000, "VVVIP", val > 30000, "VVIP",
val > 10000, "VIP", val <= 10000, "一般會員")))

我們在 C2 輸入這串算式,就會得到:

raw-image


這樣就輕易完成囉!

如果你不熟悉 IFS 的用法,可以回來這邊複習一下:IFS,IF 只要加個 S...?如果你有更細緻的條件想要設定,當然可以再進一步搭配 ANDOR 函式。




匯率換算

最後來挑戰困難一點點的「匯率換算」!我們要試試看讓 MAP 讀取兩組範圍的值,個別讓 LAMBDA 處理。

raw-image

A 欄跟 B 欄有各有一組資料,分別是當地貨幣與幣別代號。我們想要把每一列的外幣轉成台幣,顯示在 C 欄,像是這樣:

  • 50 USD → ___ TWD
  • 500,000 JPY → ___ TWD
  • 500 EUR → ___ TWD

⋯⋯以此類推。

說到匯率換算,就可以用 GOOGLEFINANCE 函式來幫我們的忙。我們只要把外幣幣別代號跟新台幣的「TWD」代號串在一起,就算得出目前外幣轉新台幣的匯率。舉例:

  • USDTWD:美金轉新台幣
  • JPYTWD:日幣轉新台幣
  • EURTWD:歐元轉新台幣

比如說,下面的算式可以得到 100 塊美金(USD)可以換多少新台幣:

=100 * GOOGLEFINANCE("USDTWD")

(不確定 GOOGLEFINANCE 怎麼做的話,歡迎來這複習:日幣換了沒?GOOGLEFINANCE 總整理(一):匯率換算


一樣釐清一下需求有哪些:

  • 範圍:A2A6(當地貨幣)、B2B6(幣別代號)
  • LAMBDA:取 A 欄的值,之後取 B 欄位的幣別代號並讓它和 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 串起來,然後順便寫前面 LAMBDAMAP 的右括號:

=MAP(A2:A6, B2:B6,
LAMBDA(local, code, local * GOOGLEFINANCE(code & "TWD")))

這樣就完成了!


我們在 C2 執行看看,就會得到:

raw-image

搞定!




最後,我另外做了一份「VIP 會員分級 + AND / OR」的示範:

raw-image

你可以點 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,讓它跟 ANDOR 搭配使用。這突破 ArrayFormulaANDOR 不能同時使用的限制,這麼一來也就不需要用巢狀 IF 囉。有興趣的話歡迎參考一下!




如果你喜歡這次的文章,歡迎你透過這些方法支持我:

  • 按下愛心、按下儲存
  • 留言告訴我你的想法
  • 加入喜特先生的官方沙龍,即時看到我發布的教學
  • 付費訂閱喜特先生的官方沙龍,加入每月小額訂閱方案
  • 追蹤喜特先生的 Facebook
  • 這邊小額贊助我的創作!

想要看更多文章的話,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!

我是喜特先生,Mr. Sheet,我們下個教學見!



4.7K會員
137內容數
簡潔,快速,有效, 讓你的日常生活、工作生產力大提升! ___ 快按「加入」,馬上追蹤所有喜特先生的更新,有 Google 試算表教學、Google Apps Script 的研究、數據分析課程的開箱,還有 Google 試算表疑難雜症的解題分享唷!💪
留言0
查看全部
發表第一個留言支持創作者!