見出し画像

【復活】Googleスプレッドシート 11新輸入関数 最新動向-3 【WRAPROWS / VSTACK】

3月に入ったら思った以上に 仕事が忙しくなってしまい、
さらに

  • コロナ規制緩和で飲み会的なものが増えた

  • 今年は花粉の量がすさまじく体力がかなり削られてる

こんな理由もあって、平日更新がままなりません。

当面は 週2更新 → 休日の 週1更新 とさせていただきます。

書きたいことはいっぱいあるんですけどね・・・。すいません。
余裕があれば 不定期で 平日更新入れます。

本題とそれますが、今週ざわついたのは Googleドライブ、スプレッドシート、ドキュメント、スライドのメニューバー等のデザイン変更でしょうか。

アナウンスが不十分で唐突にやるのが Google流

見た目や操作性の変更なので、こちらで大きく取り上げる予定はありませんが、情報がない中での急な変更だったので、知恵袋では「どうしたら戻せますか?」的な質問を幾つか見かけました。

結論としては、強制変更なので 戻せません!(それが Google流)

Googleスプレッドシートをどんどん活用して、早く新しいデザインに慣れていくしかないです。

シリーズ前回の記事



Excelから 輸入された 配列操作系関数

全部で8つですが、基本的には対になる2つの関数セットが4つとなります。

  • TOROW / TOCOL (前回紹介)

  • CHOOSEROWS / CHOOSECOLS (前回紹介)

  • WRAPROWS / WRAPCOLS

  • VSTACK / HSTACK

前回の続きで 今回は Googleスプレッドシートで使えるようになった、

WRAPROWS / WRAPCOLS
VSTACK / HSTACK

の 4つの新関数を見ていきましょう。


Googleスプレッドシート 11の新関数-7,8 WRAPROWS / WRAPCOLS

WRAPROWS(範囲, 折り返しの値, [代替文字])
WRAPCOLS(範囲, 折り返しの値, [代替文字])


範囲・・・ 対象の範囲・配列(1行または1列のデータ)
折り返しの値・・・何セル毎に折り返すか
[代替文字]・・・ 最後余ったセルを埋める文字(設定なしは #N/A)

WRAPROWSは 横方向(左から右)に値を並べ下に折り返す
WRAPCOLSは 縦方向(上から下)に値を並べ右に折り返す

WRAPROWS / WRAPCOLS は、1行または1列のデータを 指定した数で折り返した配列を生成する、まさに配列操作関数です。

一次元配列を二次元配列にする関数と言えるかもしれません。

対象とする範囲(配列)は1行または1列である必要があります。

このように 複数行・複数列の範囲に対して 使うとエラーになります。

じゃあ、上のような5セルごとに下に折り返す範囲を3セル毎に折り返すように変形したい場合はどうすればよいか?

前回登場したアレが使えます。

 


TOROW/ TOCOL と WRAPROWS / WRAPCOLSを組み合わせる

WRAPROWS / WRAPCOLS が 一次元から二次元に配列を変換する関数としたら、反対に 二次元から一次元に配列を変換する関数が TOROW / TOCOL です。(もちろん 昔ながらのFLATTEN でもよいですが)

一度 TOROWで 1行データにしてから 3セル折り返しに変換しています。

=WRAPROWS(TOROW(A1:E6,3),3,)

ちなみに、なんで TOROW側で 第2引数を 3として 空白エラー削除をしたうえで、WRAPROWS側で ,) として埋め文字を空にしているか?

このまま 空白削除なしで TOROWして WRAPROWSすると、最後の4セル分の空白を折り返すさいに、左のようになり 1行無駄が発生してしまうからです。

別に気にしなくても良いのですが、この右側の式で出力された方の赤線の空白セルは、あくまでも関数で出力されている空白です。

だから、ここに何か入力すると スピルを邪魔することになり、式全体がエラーとなってしまいます。

そういった誤操作を防ぐため、不要な出力を削除しています。



WRAPROWS / WRAPCOLS 実践活用例

さて、この WRAPROWS / WRAPCOLS に該当する関数は Googleスプレッドシートにこれまで存在しなかったので、代わりに 他の関数の組み合わせ(XLOOKUP + Arrayformula、もしくは MAP + INDEX)で処理をしていました。

その辺りに代替処理は、Excel側の WRAPROWS / WRAPCOLS 検証で書いています。(この時は Googleスプレッドシートに こんなに早く輸入されるとは思わなかったんでw)

さて、これを使って ある処理を実現した 例を書いた noteがありました。
そう、1~25までの数字をランダムに 5x5 に並べたビンゴカード生成です。

簡易例の方の式ですが、この時はまだ GoogleスプレッドシートにWRAPROWSがないので

=ARRAYFORMULA(XLOOKUP(SEQUENCE(5,5),SEQUENCE(25),SORT(SEQUENCE(25),RANDARRAY(25),true)))

こんな式をつかってましたが、WRAPROWSが使える今や

=WRAPROWS(SORT(SEQUENCE(25),RANDARRAY(25),true),5)

これで出来ちゃいます。

NOW!

もしビンゴでよくある 真ん中をFreeという文字にしたい場合は、SEQUENCE(5,5)という同じサイズの配列を用意して MAP関数で処理するのが良いです。

=MAP(SEQUENCE(5,5),WRAPROWS(SORT(SEQUENCE(25),RANDARRAY(25),true),5),LAMBDA(v_1,v_2,if(v_1=13,"Free",v_2)))

せっかくWRAPROWSでシンプルになったのに、また煩雑な式になっちゃいましたね。

この他、年間カレンダーのケースでも使えそうですが、それは次の機会に書きたいと思います。




Googleスプレッドシート 11の新関数-9,10 VSTACK / HSTACK

VSTACK(範囲 1, [範囲 2, ...]) 複数の範囲を縦方向(下)に順番に結合
HSTACK(範囲 1, [範囲 2, ...]) 複数の範囲を横方向(右)に順番に結合

範囲 1・・・ 最初に結合する範囲。
範囲 2, ... ・・・(省略可)範囲 1 に結合する範囲。
結合面のサイズが違う際、余る部分のセルは #N/A 表示となる

VSTACK / HSTACK は配列を結合する関数です。

VSTACK は縦方向(下)に引数の並び順に範囲を結合、HSTACK は横方向(右)に引数の並び順に範囲を結合します。



従来の 中カッコ {} コロン、カンマ による配列結合との違い

これも Excel新関数シリーズの VSTACK / HSTACKの記事で触れているので重複しますが、Googleスプレッドシートにはもともと 配列結合の記述方法が存在します。

{範囲1;範囲2;….}  ;(セミコロン) で連結で 範囲を縦方向(下)に順番に結合
{範囲1,範囲2,….}  , (カンマ) で連結で  範囲を横方向(右)に順番に結合

こっちの方が記述が短い(シンプル)なんですが、VSTACK / HSTACK を使う時と一点だけ違いがあります。

それは、結合面のサイズが違う配列同士を結合する際の挙動の違いです。

={A1:D2;G1:J4}

と 縦結合した場合は 、結合面は 2つの配列の横の長さ(幅)です。これはどちらも 4セル分で同じなので 問題なく結合できます。

一方 ={A1:D2,G1:J4}

このように 横結合した場合、結合面は 配列の縦の長さ(高さ)なんですが、A1:D2 が2 に対して G1:J4は 4 とズレがあります。

この場合、={A1:D2,G1:J4} は全体がエラーとなり結果が得られません。

一方、VSTACK / HSTACK を使った場合は 不足部分のみエラーとなるだけで 配列の結合面サイズが違っていても結合が出来ます。

ここが大きな違いです。

エラーを解消(空白)としたい場合は、

=IFERROR(HSTACK(A1:D2,G1:J4))

このように IFERRORでくくるだけです。

残念ながら VSTSAK / HSTACK はWRAPROWS / WRAPCOLS のような 「埋める文字」の引数を持たないので、IFERROR関数を組み合わせる必要があります。

IFERRORはちゃんとに書くなら =IFERROR(HSTACK(A1:D2,G1:J4),"") こんな感じになりますが、エラーなら空白とするケースでは 省略記述ができます。

それにしても、前から IFERRORって 配列処理できましたっけ? Arrayformulaいらずで 処理できるのはシンプルでいいですね。

その他の VSTACK / HSTACK の活用や 細かい説明は Excel 14の新関数シリーズの記事を参照ください。

もちろん Excel の VSTACK / HSTACK の神ってる機能 複数シートの串刺しVSTACK(3D HSTACK)は Googleスプレッドシートは使えません。残念!


とはいえ、このサイズの違う配列を結合する機会ってのが、あまり思いつかなかったりします。

行毎に空白左詰めなんて処理も Excelだったら REDUCEでFILTER後のサイズの違う配列を VSTACKする処理を REDUCEで繰り返して結果配列を生成なんてケースがありますが、Googleスプレッドシートは LAMBDAヘルパー関数が 配列ネストをサポートできるようになったんで不要なんですよね。。



VSTSAK / HSTACK の サイズが違う配列の結合を応用する

あまりケースがないと書いた サイズが違う配列の結合ですが、発想を変えてみましょう。

たとえば 結合する際に切れ目がわかるように、1行(1列)あけたい。といったケース。

これは データとしてはよろしくないですが、見せる資料として需要があるとは思います。

これを中カッコでの結合でやろうとすると 空が 4つ横並びの配列を用意する必要があって、結構面倒だったんですよね。

空配列を生成する方法は いくつかあります。

{"","","",""}
手作業で4つの空の配列を作成。(簡単だがこれは 可変にできない)

SPLIT(REPT(",",COLUMNS(A1:D2)-1),",",,false)
,をREPTで空セル-1分生成してSPLIT(空白除去なし)

arrayformula(IF(SEQUENCE(1,COLUMNS(A1:D2))>0,))
SEQUENCEで横に1,2,34 を生成 ArrayformulaとIFで空白に置き換え

MAKEARRAY(1,COLUMNS(A1:D2),LAMBDA(r,c,))
MAKEARRAYで1行4列の空配列を生成

CHOOSECOLS("",SEQUENCE(1,COLUMNS(A1:D2),1,0))
空文字をCHOOSECOLSで4回 1列目を取り出すことで 生成

上の空配列を生成してから { ; } で連結よりも、

=IFERROR(VSTACK(A1:D2,,G1:J4))

これだけで1列 空け連結が出来るのは、とっても簡単ですね。

他にも取得したデータの左に1列追加して 表の名前やシート名を差し込んでから結合といった

=VSTACK(IFERROR(HSTACK(A1,A2:D3),A1),IFERROR(HSTACK(G1,G2:J5),G1))

こんな処理もぐっと簡単に実現できるようになりました。



Googleスプレッドシート の 新配列操作系関数はカレンダー処理でいきる!

今回は Googleスプレッドシートに Excelから輸入された新配列操作系関数の 

WRAPROWS
WRAPCOLS
VSTACK
HSTACK

の4つを検証しました。

先週の4つと合わせて8つの関数の検証終了です。

そして今回の新関数シリーズ 残り1つ LET関数、これがあることで この8つの配列操作系関数がよりいきてきます。

逆にLETなしだと 同じ記述の繰り返しが何度も出てくる長い式になってしまいます。

そしてこの LET関数 + 配列操作系関数 がもっとも活きる事例の一つが、カレンダー関連の操作です。次回、LET関数の検証と合わせて 具体的事例を紹介していきましょう!


この記事が気に入ったらサポートをしてみませんか?