LAMBDA 函式(六):REDUCE

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



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