LAMBDA 函式(六):REDUCE

閱讀時間約 6 分鐘

再來介紹最後一個 LAMBDA 輔助函式,REDUCE

「reduce」這詞在中文的意思是「縮減」。在 Google 試算表上,REDUCE 會把範圍中的每個值套用指定的 LAMBDA 函式,把這函式的結果累計到一個累計值裡,最後回傳這個值,像是把一個範圍「縮~」成一個值。

簡單舉個例子,我想把 A 欄位的值累加起來(1 + 2 + 3 + ⋯⋯ + 10),把結果放在 B2 上:

raw-image


就可以用這串 REDUCE 得到 55。

=REDUCE(0, A2:A11, LAMBDA(int, val, int + val))
raw-image


如果你還記得上次介紹的 SCAN,其實 REDUCE 應該就會很好理解了:

  • SCAN 會讀取範圍內的每個值,然後回傳中繼值(移動總計)
  • REDUCE 一樣讀取範圍內的每個值,然後回傳最終的統計。

拿上面 1 加到 10 的例子來說,SCAN 就會回傳這樣的一串值:

1
3
6
10
15
21
28
...

REDUCE 就會直接回傳一個值,也就是最後計算出來的 55。

看到這邊,這功能跟 SUM 的功用其實差不多,但 REDUCE 的可能性不只有這樣!它也可以做按條件算總和(像是 SUMIFS 那樣),但提供了更多可能性。

歡迎來複製這個試算表,一起來練習看看 REDUCE 怎麼操作。




REDUCE 語法

=REDUCE(初始值, 範圍, LAMBDA)
  • 初始值:累計值的初始值,也就是 LAMBDA 在計算累加值之前的初始值。
  • 範圍:要套用 LAMBDA 函式的範圍。
  • LAMBDA:要 REDUCE 套用於範圍內初始值跟範圍的自訂函式。

REDUCE 會一個個把範圍內的值累加,從起始值開始,然後一個個累加,得到最後的值。

至於在寫 LAMBDA 的時候,我習慣把初始值的代號叫做 int(initial 的簡寫),範圍內值的代號叫做 val(value 的簡寫),要寫中文或是其他你喜歡的代號也當然沒問題喔!




REDUCE 範例

拿我們剛剛的加總的例子,試著在 B2 運用 REDUCE 看看:

raw-image


首先是初始值。如果我們只想要讓 A 欄的值加總在一起,那這邊就可以寫 0 沒關係;如果你想要讓 REDUCE 先以某個值開始,之後再加總,你就可以在這指定值。

舉例來說,如果我的初始值寫 0,那就是:

=0 + 1 + 2 + 3 + ... + 10
=55

如果你希望一開始就以 100 作為起點,之後再繼續疊加,那就是:

=100 + 1 + 2 + 3 + ... + 10
=155


再來是範圍,就是想要運算的範圍,毫無懸念就是 A2:A11。所以寫到現在,你的算式應該會是這樣:

=REDUCE(0, A2:A11, 


最後是 LAMBDA!我們先定義代號:

=REDUCE(0, A2:A11, LAMBDA(int, val, 


再來,我們想要讓起始值跟範圍的值相加在一起,所以就是 int + val

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


爽快按下 Enter,就會看到 REDUCE 的結果囉:

raw-image




只計算偶數值的累加、只計算奇數值的累加

你可以在 LAMBDA 寫條件給 REDUCE 計算累加值。

比如說,我希望 REDUCE 只計算剛剛範圍內的偶數值。我們先把 REDUCE 寫完:

=REDUCE(0, A2:A11,


接下來,我想交給 IF 去判斷範圍內的值是不是偶數。如果是的話,就累加,如果不是,就不累加,也就是這樣:

=REDUCE(0, A2:A11, LAMBDA(int, val, IF(val 是偶數, int + val, int)))


判斷偶數這件事可以交給 ISEVEN 函式來做。只要把值放到括號裡面,ISEVEN 會回傳 TRUE 或是 FALSETRUE 就是偶數、FALSE 就是奇數了。簡單舉例:

=ISEVEN(10) --> TRUE
=ISEVEN(8) --> TRUE
=ISEVEN(7) --> FALSE


好,那我們把 ISEVENLAMBDA 組裝起來,就會像這樣:

=REDUCE(0, A2:A11, LAMBDA(int, val, IF(ISEVEN(val), int + val, int)))


來看看結果:

raw-image

這樣就完成了。


至於奇數的話,你可以用 ISODD 函式來做判斷。ISODD 會判斷一個數是否是奇數,如果是的話會回傳 TRUE、不是就會回傳 FALSE

也就是,我們把剛剛的 ISEVEN 改成 ISODD,就可以計算奇數值了。像是這樣:

=REDUCE(0, A2:A11, LAMBDA(int, val, IF(ISODD(val), int + val, int)))


看看結果吧!

raw-image


這樣就完成了。接下來介紹幾個可以運用 REDUCE 的場景,提供給你參考!




計算每年漲跌幅後的最終價格

我想要算某商品 2000 年的價格(A2)在經過 C 欄與 D 欄的漲跌幅後,在 2024 年的最終價格是多少:

raw-image

如果要一年一年算的話,可能會這樣:

2000 年:5000
2001 年:5000 * -5%
2002 年:2001 年的價格 * 10%
2003 年:2002 年的價格 * 10%
2004 年:2003 年的價格 * -4%
...
本年的價格:去年的價格 * 漲跌幅​


這個就可以用 REDUCE 可以累加的特性來處理了。先彙整一下我們的需求:

  • 初始值A2,2000 年的價格。
  • 範圍D2:D,漲跌幅度的所在範圍。

再來看看 LAMBDA 怎麼寫。我們想要讓它從 2000 年的初始值開始,把初始值加上它乘上漲跌幅的價格就可以了,像是這樣:

=REDUCE(A2, D2:D, LAMBDA(int, val, int + int * val))


來試試看在 F2 上寫這個算式,看看結果:

raw-image


這樣就算得出最後的價格了!




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

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

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

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



11.3K會員
147內容數
簡潔,快速,有效, 讓你的日常生活、工作生產力大提升! ___ 快按「加入」,馬上追蹤所有喜特先生的更新,有 Google 試算表教學、Google Apps Script 的研究、數據分析課程的開箱,還有 Google 試算表疑難雜症的解題分享唷!💪
留言0
查看全部
發表第一個留言支持創作者!
喜特先生官方沙龍 的其他內容
接下來介紹 LAMBDA 函式的第四個輔助函式,SCAN! 「scan」在這邊可以翻成「掃描」,而 SCAN 的作用在於對範圍中的每個值進行「掃描」、累計運算,會回傳一個範圍,裡面的數字是每個計算步驟的中繼值;而它最常見的用法就是算「移動總計」(running total)。
Google 試算表有個叫做 SPARKLINE 的函式,可以讓你在一個儲存格內生成一張迷你圖表。我寫了一篇系列文提供了教學,歡迎來看看唷!
接續著上次提到的 COUNT、COUNTA,我們再稍稍延伸一點,把 COUNT 函式的家族補完,介紹最後的兩名成員:COUNTUNIQUE 跟 COUNTBLANK。
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
接下來介紹 LAMBDA 函式的第四個輔助函式,SCAN! 「scan」在這邊可以翻成「掃描」,而 SCAN 的作用在於對範圍中的每個值進行「掃描」、累計運算,會回傳一個範圍,裡面的數字是每個計算步驟的中繼值;而它最常見的用法就是算「移動總計」(running total)。
Google 試算表有個叫做 SPARKLINE 的函式,可以讓你在一個儲存格內生成一張迷你圖表。我寫了一篇系列文提供了教學,歡迎來看看唷!
接續著上次提到的 COUNT、COUNTA,我們再稍稍延伸一點,把 COUNT 函式的家族補完,介紹最後的兩名成員:COUNTUNIQUE 跟 COUNTBLANK。
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
這是「按條件算OO」系列文的第四篇教學!今天會來聊聊 MAXIFS。
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
Java 8 終於在 2014 的 3 月 18 日正式釋出了,不過自從用 Objective C 開發 iOS App後,我已經有好一陣子沒碰 Java,期間曾經有短暫寫一點點,但卻沒有時間去用 beta 版的 Java 8,直到最近才又開始玩一下。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。
Thumbnail
在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的
Thumbnail
雖然lambda本身的概念就是主打無伺服器+各自獨立運行的function,但有時又不免其然的需要共用代碼,像是api可能都需要做權限驗證。 會有這方面的研究是因為公司正好要將app跟web共用的api搬到api gateway去處理,但我馬上就想到會有code reuse的問題,怎麼樣用可維護的
Thumbnail
Continue from here Prerequisites Create an IAM role with access to Bedrock Create an "IAM Role" that defines the permissions needed to call Bed
Thumbnail
你會在程式裡面寫函數嗎? 通常寫函數的第一個問題,就是要給函數取名字。 名字取得不好,後來調用函數不自然,就會拖垮整個寫程式的效率。 為函數命名,也是一門技術,好的函數命名,就能提高函數被重複使用的頻率。 然而,也是在某些情況下,我們需要「一次性函數」。 沒錯,用完即丟的函數。
Thumbnail
A lambda function is a small anonymous function and can only have one expression.
Thumbnail
或許就如官網文件中所說的,lambda function就只是syntactic sugar而已,所以也就沒特別在意,直到在設計Game of Life的輸入介面時,因為需要用到,兜兜轉轉,費了好些功夫和時間,總算對它的用途和用法有比較完整的認識。
最近公司寫的系統要上線 , EFS 的存取點套用開發時設定出問題 背景是這樣的 開發 : 存取點 path 設 /xxx , 使用者和群組 id 設 1000 , 目錄使用者和群組 id 也設 1000 , 權限開 0600 (owner 可讀可寫) 上線 : 設定如同開發 神奇的事情出現了 , 開
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
Java 8 終於在 2014 的 3 月 18 日正式釋出了,不過自從用 Objective C 開發 iOS App後,我已經有好一陣子沒碰 Java,期間曾經有短暫寫一點點,但卻沒有時間去用 beta 版的 Java 8,直到最近才又開始玩一下。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
lambda 函式,又稱為“匿名函式”,是一種在 Python 中快速定義單行函式的方法,與 def 定義函式不同,lambda 函式不需要命名。本文將介紹 lambda函式的基礎語法,以及實際應用範例演示。
Thumbnail
在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的
Thumbnail
雖然lambda本身的概念就是主打無伺服器+各自獨立運行的function,但有時又不免其然的需要共用代碼,像是api可能都需要做權限驗證。 會有這方面的研究是因為公司正好要將app跟web共用的api搬到api gateway去處理,但我馬上就想到會有code reuse的問題,怎麼樣用可維護的
Thumbnail
Continue from here Prerequisites Create an IAM role with access to Bedrock Create an "IAM Role" that defines the permissions needed to call Bed
Thumbnail
你會在程式裡面寫函數嗎? 通常寫函數的第一個問題,就是要給函數取名字。 名字取得不好,後來調用函數不自然,就會拖垮整個寫程式的效率。 為函數命名,也是一門技術,好的函數命名,就能提高函數被重複使用的頻率。 然而,也是在某些情況下,我們需要「一次性函數」。 沒錯,用完即丟的函數。
Thumbnail
A lambda function is a small anonymous function and can only have one expression.
Thumbnail
或許就如官網文件中所說的,lambda function就只是syntactic sugar而已,所以也就沒特別在意,直到在設計Game of Life的輸入介面時,因為需要用到,兜兜轉轉,費了好些功夫和時間,總算對它的用途和用法有比較完整的認識。
最近公司寫的系統要上線 , EFS 的存取點套用開發時設定出問題 背景是這樣的 開發 : 存取點 path 設 /xxx , 使用者和群組 id 設 1000 , 目錄使用者和群組 id 也設 1000 , 權限開 0600 (owner 可讀可寫) 上線 : 設定如同開發 神奇的事情出現了 , 開