【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関数を使う必要はありません。

配列ネストが使えない Excelは、REDUCE + VSTACK(HSTACK)に頼るケースが多いです。
REDUCE + VSTACK の 初期値どうする問題
この処理で問題になるのが 「REDUCEの初期値をどうするか?」

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は以下を参照。 👇
いいなと思ったら応援しよう!
チップ大歓迎です。やる気がアップしますw