LAMBDA 函式(五):SCAN

2024/04/23閱讀時間約 6 分鐘

接下來介紹 LAMBDA 函式的第四個輔助函式,SCAN

「scan」在這邊可以翻成「掃描」,而 SCAN 的作用在於對範圍中的每個值進行「掃描」、累計運算,會回傳一個範圍,裡面的數字是每個計算步驟的中繼值;而它最常見的用法就是算「移動總計」(running total)

什麼是移動總計?舉個例子:

raw-image


我想讓 A 欄每列的值跟它上一列的相加,並把這個結果顯示在 B 欄,像是這樣:

raw-image


這就是 SCAN 可以派上用場的地方!

比起手動一個個算、或是「=A2 + A3」、「=A3 + A4」這樣的算式,SCAN 的做法更好管理、寫法也比較優雅一點,上面的例子只要短短一行:

=SCAN(0, A2:A11, LAMBDA(int, val, int + val))


接下來的教學會介紹幾項你能很快上手的 SCAN 應用。

歡迎來這邊複製一份試算表,跟我一起做做看!




SCAN 語法

=SCAN(初始值, 範圍, LAMBDA)
  • 初始值:在給 LAMBDA 計算前的初始值。
  • 範圍:要計算的陣列或範圍。
  • LAMBDA:要 SCAN 套用於範圍內每個值的自訂函式。

這邊我習慣用 int(initial,初始值的縮寫)和 val(value,值的縮寫)來當作等等寫 LAMBDA 時要用上的代號:

=SCAN(初始值, 範圍, LAMBDA(int, val, ...))


接下來實際用 SCAN 來算些東西吧。




倍倍儲蓄法

有部日本漫畫叫「烏龍派出所」,其中一個叫做「兩津勘吉」的主角,為了在短時間內存到錢,發明了一個叫做「倍倍儲蓄法」的存錢術。規則是先從很小的數目開始存錢(比如 10 塊),隔天存前一天的兩倍,不斷往下存,這麼一來就可以很快累積財富了。

用表格呈現的話:

raw-image


雖然這個理財方法在現實世界中感覺很有難度,不過我們還是試試看在 C 欄計算「當天存到的成果是多少」吧。我的意思是:

1 天存到 10
2 天存到 10+ 20= 30
3 天存到 10+ 20+ 40= 70
4 天存到 10+ 20+ 40+ 80= 150
...


這個就可以用 SCAN 來計算!先彙整一下需求:

  • 初始值:0,從 0 開始算。
  • 範圍B2B21
  • LAMBDA:就是初始值加上範圍內的值,讓它 LAMBDA 逐列計算。

組裝起來,我們就會得到:

=SCAN(0, B2:B21, LAMBDA(int, val, int + val))


放在 C2 上面,看看結果:

raw-image


SCAN 直接回傳了一組範圍,顯示了第 1 天到第 20 天存錢的各日總計分別是多少。這樣就算完囉!




年別移動總和

SCAN 遇到中間有空白的範圍也可以算,只要搭配 IF 就能輕鬆達成。

我們來看看這張表:

raw-image


我想計算移動總和,但要以年份分開、希望 SCAN 不要一路往下計算。

先來彙整一下需求:

  • 初始值:0,從 0 開始算。
  • 範圍B2B15
  • LAMBDA:就是初始值加上範圍內的值,讓它 LAMBDA 逐列計算。

要讓 SCAN 不要往下算,我們要在 LAMBDA 裡面放個 IFSCAN 在判斷的時候,遇到空值就不繼續累加、如果有數字就繼續累加:

=SCAN(0, B2:B15, LAMBDA(int, val, IF(val = "", val, int + val)))


我們在 C2 執行看看:

raw-image

這樣就成功了!




達成率計算(累計百分比)

最後用 SCAN 來算算看「達成率」。現在我有這張表,假設是某間公司每月的銷售額:

raw-image

B 欄有每月的銷售額,F2 則是今年年初設下的年度目標。我想在 C 欄計算當月份的目標達成率是多少,可以幫助我們了解當月的達成率距離目標還有多遠。

達成率的算法是:

=累計銷售額 / 年度目標

舉例來說,一月當月的銷售額約 800 萬,達成率就是:

=7906659 / 100000000

二月當月的銷售額已經累計到約 1500 萬,是一月和二月的總和,達成率就是:

=(7906659 + 7004159) / 100000000

三月的達成率就是一月、二月和三月的總和,達成率就是:

=(7906659 + 7004159 + 2014572) / 100000000

以此類推。

一樣先來彙整需求:

  • 初始值:0,從 0 開始算。
  • 範圍B2B13
  • LAMBDA:就是初始值加上範圍內的值,讓它 LAMBDA 逐列計算後,除以年度目標所在的 F2

好囉!我把這些需求寫成 SCAN 的算式,寫在 C2 上:

=SCAN(0, B2:B13, LAMBDA(int, val, int + val / F2))


來看看結果:

raw-image

這邊的達成率就算好囉!


另外,你還可以搭配剛介紹的 BYROWSPARKLINE 函式,簡單製作每月的進度條:

=BYROW(C2:C, LAMBDA(val, SPARKLINE(val, {"charttype", "bar"; "max", 1})))

D2 上執行:

raw-image

這樣就可以輕易追蹤進度了。

如果不確定怎麼操作 BYROWSPARKLINE,可以來這看看:




以上就是 SCAN 的分享!

相較於其他輔助函式,坦白說我覺得 SCAN 的應用場景比較受限,大部分都是用在計算這類的移動總和,頂多有些在分組跟計算累計百分比上的變化。如果你有想到任何可以用 SCAN 函式的其他可能性,歡迎你留言分享給我知道,我會再研究研究!✨




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

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

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

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



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