見出し画像

【QuickTips 02】行数0の空配列を使ってGoogleスプレッドシートのREDUCE + VSTACKの初期値どうする問題を解決

題材を1テーマに絞った 、シンプルでちょっと便利な Quick Tipsです。マガジンにまとめていきます。

今回は REDUCE関数なんで難易度やや高めです。




REDUCE関数でVSTACKやHSTACKを繰り返す

LAMBDAヘルパー関数最強のREDUCE関数。この活用例の一つが、VSTACKやHSTACKの連結ループ処理です。

=REDUCE( ,SEQUENCE(10), LAMBDA(pv,cv,IFNA(VSTACK(pv,SEQUENCE(1,cv)))))

👆はわかりやすい例としてREDUCEを使っていますが、GoogleスプレッドシートはExcelと違って MAPやBYROWが中で配列を返すことが出来るので、一次元配列の連結ならREDUCE関数を使う必要はありません。

MAPでも可

配列ネストが使えない Excelは、REDUCE + VSTACK(HSTACK)に頼るケースが多いです。



REDUCE + VSTACK の 初期値どうする問題

この処理で問題になるのが 「REDUCEの初期値をどうするか?」 

1行目が空の列になってしまう

JSのreduceのように 初期値の省略が出来ません。

REDUCEの第1引数 初期値は、空文字とすることが多いんですが

積み上げループをすると、初期値が無駄な行として残ってしまうんです。

Excelなら最後にDROP関数で余計な1行(1列)を落とす方法が一般的です。

=DROP(REDUCE("",SEQUENCE(10),LAMBDA(pv,cv,IFNA(VSTACK(pv,SEQUENCE(1,cv)),""))),1)

Excelでは、

REDUCEでVSTACKをループして最後にDROP 

は一つの型と言えるでしょう。

しかし残念ながらTAKE関数、DROP関数は 2025年7月 現在、Googleスプレッドシートには輸入されておらず、この方法が使えません。

その為LAMBDA関数内でIFで分岐させ、1回目の処理だけスタックしない等の工夫が必要でした。



TOCOL(,1) を使った 空配列 が使える!

この問題をさくっと解決するTipsが、初期値を TOCOL(,1) とする方法です。

海外のQAサイトでよく見かけるテクニックで、TOCOL(æ,2) としている回答者もいます。

TOCOL関数の第2引数 1指定は空白無視なので、第1引数が空白だと #REF !エラーを返します。

しかし実はこれ 高さ(行数)0、幅(列数)1の空配列で、これを VSTACKで他の配列と連結すると

TOCOL(,1)が消える という特性があります。

つまり、TOCOL(,1)をREDUCE関数の初期値に使えば、

VSTACKした時の余計な最初の1行を防げるんです!



利用の注意点

1.組み合わせに注意

TOCO(,1)は完全な空ではありません。横幅1があります。だからHSTACKと組み合わせてもうまくいきません。

同様にTOROW(,1)も 高さ1なので、VSTACKとの組み合わせは✖です。

VSTACK なら TOCOL(,1)
HSTACK なら TOROW(,1)

組み合わせの相性(向き)に注意しましょう。


2.中カッコの結合では使えない

中カッコ{ }と組み合わせても✖です。VSTACK、HSTACKとの組み合わせるテクニックです。※一次元配列なら可能


3.Excelでは使えない

Excelだと #VALUE !エラーとなります。この方法は使えません。



実践例 & 関連 note

実務での活用例。👇コメント欄にお邪魔しました。


今回のTipsに関連するnoteは以下を参照。 👇


いいなと思ったら応援しよう!

mir チップ大歓迎です。やる気がアップしますw