下記のようなスプレッドシートがあったとします。
A | B | C | D | E | |
---|---|---|---|---|---|
1 | 1 | 2 | 3 | 4 | 5 |
2 | 11 | 12 | 13 | 14 | 15 |
3 | 21 | 22 | 23 | 24 | 25 |
スプレッドシートから全ての値を取得すると、下記のような二次元配列が取得できます。
[[1,2,3,4,5],[11,12,13,14,15],[21,22,23,24,25]]
ではこの二次元配列から「A列が10以上の行」を取得するにはどうすればいいでしょうか?
こういう時に便利なのがfilter関数です。
filter関数では下記のような事が可能です。
//B列 = [[11,12,13,14,15],[21,22,23,24,25]]
var values = [[1,2,3,4,5],[11,12,13,14,15],[21,22,23,24,25]]
var B列 = values.filter(行 => 行[0] > 10)
各行のうち、「行[0]=A列」が10以上のものを抜き出しています。
二次元配列の中から、条件に合う行だけを抜き出したい時に使えます。
filter関数は単体でも強力ですが、map関数やforEach関数との組み合わせで力を発揮します。
例えば下記のようなデータがあったとしましょう。
A | B | C | D | |
---|---|---|---|---|
1 | 部長 | 鈴木 | 一郎 | suzuki1@gmail.com |
2 | 課長 | 鈴木 | 二郎 | suzuki2@gmail.com |
3 | なし | 鈴木 | 三郎 | suzuki3@gmail.com |
4 | なし | 鈴木 | 四郎 | suzuki4@gmail.com |
5 | なし | 鈴木 | 五郎 | suzuki5@gmail.com |
ここから役職がない(A列がなし)人の名前だけを出力したい時は、下記のようにすれば実現できます。
//三郎、四郎、五郎が出力される
var values = [[部長,鈴木,一郎,suzuki1@gmail.com],[課長,鈴木,二郎,suzuki2@gmail.com],[なし,鈴木,三郎,suzuki3@gmail.com],[なし,鈴木,四郎,suzuki4@gmail.com],[なし,鈴木,五郎,suzuki5@gmail.com]]
values.filter(行 => 行[0] == "なし").forEach(行 => Logger.log(行[2]))
filter関数で、A列が「なし」の行だけを取得します。その上で各行のC列を出力しています。同じ要領で課長だけにメールを送るようなプログラムも作ったりもできます。
多くの場合、元となるスプレッドシートのデータは、全ての情報が一箇所にまとまった一覧表のような形になるでしょう。バラバラのデータをくっつけるより、まとまったデータを絞り込む方が楽だからです。
その意味でfilter関数はスプレッドシートのデータ処理に欠かせない関数かもしれません。