Open5

スプレッドシート関数のあれこれ

luthluth

スプレッドシート関数の「match」
セル範囲から、検索キーに一致するセル位置を返してくれるので、割と便利

この「検索キー」、第3引数を0(完全一致)にしたときも、ワイルドカード「*」を許容しているっぽい
(本当は正規表現でやりたかった)

/ A B C
1 あかさたな あいうえお かきくけこ
=match("あ*お", A1:C1, 0)
( → 2 )
luthluth

matchとchooseRows関数の組み合わせが爆速すぎた!

業務で20000レコード近くのスプシDBから、
GAS等なしで検索ツールを作る必要があったため、
当初は以下のような数式で組んでいた

(A列=入力させる検索キー、DB!A列=キー情報)
=arrayFormula( if( A:A = "", , ifna( vLookUp( A:A, DB!A:D, {2, 3, 4}, false ), "該当データなし" ) ) )

ところがこれが重いのなんの…1回の数式処理に150秒くらいかかる始末でした。
*メリットは、エラー処理でDBにない文字列("該当データなし")をいれられる、行ごとに判定するのでA列が歯抜けになってもいい

これで20000レコードクラスを扱うのは無理すぎたので、改良を考えました
↓その結果がこちら!↓

=arrayFormura( chooseRows( DB!B:D, ifError( match( A:A, DB!A:A, 0 ), 1 ) ) )

こいつで**[2〜4秒]**まで処理が速くなりました…!
*デメリットは、chooseRowsが数字の重複は可だけど、行番号である必要はあるので、エラー処理がDB内にある行を指定するしかないこと、かな?

やったぜ

luthluth

よくつかってる「{}」や、chooseCols/chooseRows

{}は配列結合

スプシでの範囲結合はquery関数でやりがちだが、外部APIを通す都合、ハイパーリンク書式も死んだり、処理が遅かったりする
そこでセル範囲や文字列を結合して配列を生む関数が便利
https://qiita.com/igq-kinoue/items/7b824f7eed1987a61f31

chooseRows/chooseColsは行列の並び替え・抽出

上記の下位互換ではあるが、行や列を「行番号」等で指定できる
https://www.officeisyours.com/entry/2023/02/12/182543

並び替えはもちろん、同じ列の繰り返しも可能。

luthluth

配列結合くん、vStack関数とかhStack関数なんてあったんだね…!?

luthluth

let、byRow、byColという深みでしかない関数を知ってから、変数定義・配列操作が自由にできて大満足