LAMBDA 函式(五):SCAN

閱讀時間約 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,我們下個教學見!



avatar-img
14.2K會員
148內容數
簡潔,快速,有效, 讓你的日常生活、工作生產力大提升! ___ 快按「加入」,馬上追蹤所有喜特先生的更新,有 Google 試算表教學、Google Apps Script 的研究、數據分析課程的開箱,還有 Google 試算表疑難雜症的解題分享唷!💪
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
喜特先生官方沙龍 的其他內容
Google 試算表有個叫做 SPARKLINE 的函式,可以讓你在一個儲存格內生成一張迷你圖表。我寫了一篇系列文提供了教學,歡迎來看看唷!
接續著上次提到的 COUNT、COUNTA,我們再稍稍延伸一點,把 COUNT 函式的家族補完,介紹最後的兩名成員:COUNTUNIQUE 跟 COUNTBLANK。
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
這是「按條件算OO」系列文的第二篇教學!今天會來聊聊 COUNTIF、COUNTIFS 和 COUNTUNIQUEIFS。
Google 試算表有個叫做 SPARKLINE 的函式,可以讓你在一個儲存格內生成一張迷你圖表。我寫了一篇系列文提供了教學,歡迎來看看唷!
接續著上次提到的 COUNT、COUNTA,我們再稍稍延伸一點,把 COUNT 函式的家族補完,介紹最後的兩名成員:COUNTUNIQUE 跟 COUNTBLANK。
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
這是「按條件算OO」系列文的第二篇教學!今天會來聊聊 COUNTIF、COUNTIFS 和 COUNTUNIQUEIFS。
你可能也想看
Google News 追蹤
主要來講宣告函式跟箭頭函式 : 宣告函式(Function Declaration) 語法: function functionName(parameters) { return result; } 特點: 使用 function 關鍵字 函式名稱是必需的 存在函式
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
本文章討論如何使用動態規劃和回頭查看技巧來計算最長遞增子序列的長度,並提供了相關的測試案例和範例。本文還包括了詳細的演算法和程式碼示例,以及時間和空間複雜度的分析。
Thumbnail
題目已經給了依照起點升序排列好的區間陣列。 接下來新插入一個區間,插入後如果和原本的區間重疊,請把他們合併,要求我們輸出插入後的結果。 這是一個線性掃苗,所需時間為O(n)的演算法。 題目已經幫我們排序好區間順序,我們只要接著依序檢查區間、(假如有重疊的話)合併區間。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
主要來講宣告函式跟箭頭函式 : 宣告函式(Function Declaration) 語法: function functionName(parameters) { return result; } 特點: 使用 function 關鍵字 函式名稱是必需的 存在函式
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本章節主要介紹Java語言中的函數(也稱為方法)的使用,包括函數的基本結構、函數表達式(Lambda表達式)、箭頭函數、匿名函數的使用,以及如何呼叫函數、如何使用函數參數和函數的返回值等內容。通過學習本章節,讀者將能夠熟練掌握Java語言中的函數相關知識,並能夠在實際編程中靈活運用。
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
本文章討論如何使用動態規劃和回頭查看技巧來計算最長遞增子序列的長度,並提供了相關的測試案例和範例。本文還包括了詳細的演算法和程式碼示例,以及時間和空間複雜度的分析。
Thumbnail
題目已經給了依照起點升序排列好的區間陣列。 接下來新插入一個區間,插入後如果和原本的區間重疊,請把他們合併,要求我們輸出插入後的結果。 這是一個線性掃苗,所需時間為O(n)的演算法。 題目已經幫我們排序好區間順序,我們只要接著依序檢查區間、(假如有重疊的話)合併區間。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹