再來介紹最後一個 LAMBDA
輔助函式,REDUCE
!
「reduce」這詞在中文的意思是「縮減」。在 Google 試算表上,REDUCE
會把範圍中的每個值套用指定的 LAMBDA
函式,把這函式的結果累計到一個累計值裡,最後回傳這個值,像是把一個範圍「縮~」成一個值。
簡單舉個例子,我想把 A 欄位的值累加起來(1 + 2 + 3 + ⋯⋯ + 10),把結果放在 B2
上:
就可以用這串 REDUCE
得到 55。
=REDUCE(0, A2:A11, LAMBDA(int, val, int + val))
如果你還記得上次介紹的 SCAN
,其實 REDUCE
應該就會很好理解了:
SCAN
會讀取範圍內的每個值,然後回傳中繼值(移動總計)REDUCE
一樣讀取範圍內的每個值,然後回傳最終的統計。拿上面 1 加到 10 的例子來說,SCAN
就會回傳這樣的一串值:
1
3
6
10
15
21
28
...
而 REDUCE
就會直接回傳一個值,也就是最後計算出來的 55。
看到這邊,這功能跟 SUM
的功用其實差不多,但 REDUCE
的可能性不只有這樣!它也可以做按條件算總和(像是 SUMIFS
那樣),但提供了更多可能性。
歡迎來複製這個試算表,一起來練習看看 REDUCE
怎麼操作。
=REDUCE(初始值, 範圍, LAMBDA)
LAMBDA
在計算累加值之前的初始值。LAMBDA
函式的範圍。REDUCE
套用於範圍內初始值跟範圍的自訂函式。REDUCE
會一個個把範圍內的值累加,從起始值開始,然後一個個累加,得到最後的值。
至於在寫 LAMBDA
的時候,我習慣把初始值的代號叫做 int
(initial 的簡寫),範圍內值的代號叫做 val
(value 的簡寫),要寫中文或是其他你喜歡的代號也當然沒問題喔!
拿我們剛剛的加總的例子,試著在 B2
運用 REDUCE
看看:
首先是初始值。如果我們只想要讓 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
的結果囉:
你可以在 LAMBDA
寫條件給 REDUCE
計算累加值。
比如說,我希望 REDUCE
只計算剛剛範圍內的偶數值。我們先把 REDUCE
寫完:
=REDUCE(0, A2:A11,
接下來,我想交給 IF
去判斷範圍內的值是不是偶數。如果是的話,就累加,如果不是,就不累加,也就是這樣:
=REDUCE(0, A2:A11, LAMBDA(int, val, IF(val 是偶數, int + val, int)))
判斷偶數這件事可以交給 ISEVEN
函式來做。只要把值放到括號裡面,ISEVEN
會回傳 TRUE
或是 FALSE
,TRUE
就是偶數、FALSE
就是奇數了。簡單舉例:
=ISEVEN(10) --> TRUE
=ISEVEN(8) --> TRUE
=ISEVEN(7) --> FALSE
好,那我們把 ISEVEN
跟 LAMBDA
組裝起來,就會像這樣:
=REDUCE(0, A2:A11, LAMBDA(int, val, IF(ISEVEN(val), int + val, int)))
來看看結果:
這樣就完成了。
至於奇數的話,你可以用 ISODD
函式來做判斷。ISODD
會判斷一個數是否是奇數,如果是的話會回傳 TRUE
、不是就會回傳 FALSE
。
也就是,我們把剛剛的 ISEVEN
改成 ISODD
,就可以計算奇數值了。像是這樣:
=REDUCE(0, A2:A11, LAMBDA(int, val, IF(ISODD(val), int + val, int)))
看看結果吧!
這樣就完成了。接下來介紹幾個可以運用 REDUCE
的場景,提供給你參考!
我想要算某商品 2000 年的價格(A2
)在經過 C 欄與 D 欄的漲跌幅後,在 2024 年的最終價格是多少:
如果要一年一年算的話,可能會這樣:
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
上寫這個算式,看看結果:
這樣就算得出最後的價格了!
如果你喜歡這次的文章,歡迎你透過這些方法支持我:
想要看更多文章的話,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!
我是喜特先生,Mr. Sheet,我們下個教學見!