(Gスプレッドシート)CHOOSEROWS/CHOOSECOLS関数の使い方

 Googleスプレッドシートで2023年2月に利用可能となったCHOOSEROWS/CHOOSECOLS関数の使い方についてです。

  • CHOOSEROWS/CHOOSECOLS関数を使って、指定した範囲のうち指定した位置の配列(n行目/n列目)を抽出することができます。

機能と構文

 CHOOSEROWS/CHOOSECOLS関数の機能は、「指定した範囲のうち指定した位置にある行(列)を抽出する」というものです。ここで「位置」というのは範囲のうち上からn行目(CHOOSEROWS関数の場合)または左からn列目(CHOOSECOLS関数の場合)という意味で、いずれも数値で指定します。
 構文は次のとおりで、第2引数までが必須です。

CHOOSEROWS(範囲, 行番号1[, 行番号2, …])
CHOOSECOLS(範囲, 列番号1[, 列番号2, …])

 第3引数以降は複数の行(列)を抽出する場合に使いますが、第2引数に配列を指定することで複数の行(列)を抽出することもできます。

基本的な使用例

 次の画像では、CHOOSEROWS関数を使ってB3:D9の範囲のデータ(見出しの行を含まないことに注意)から、2行目だけを抽出しています。

 F3セル

=CHOOSEROWS(B3:D9,2)

 このように、抽出する行の位置(n行目)を第2引数で指定します。



 第3引数以降を使うことで、複数の行を一括して抽出することができます。
 次の画像では第2引数と第3引数で位置を指定し、2つの行を抽出しています。

 F3セル

=CHOOSEROWS(B3:D9,2,5)

 


 また、第2引数に配列を渡すことにより同様に複数の行を抽出することができます。

 F3セル

=CHOOSEROWS(B3:D9,{2,5})

 従来のINDEX関数では配列を渡してARRAFORMULAで囲んでも複数抽出ができませんでした。しかしCHOOSEROWS(CHOOSECOLS)関数では可能となりました。これがありがたいポイントです。
 なお「{2,5}」の部分は「{2;5}」としても同じ結果になります。つまり横並びの配列を渡しても縦並びの配列を渡しても結果に違いはありません。



 やや応用になりますが、SEQUENCE関数で抽出する行番号の配列を生成すれば、多数の行の一括抽出ができます。
 次の画像では2行目から5行目までをまとめて抽出しています。

 F3セル

=CHOOSEROWS(B3:D9,SEQUENCE(4,1,2))

 第2引数の「SEQUENCE(4,1,2)」により「{2;3;4;5}」という配列を生成しています。これで2行目から5行目までを取得しています。
 ただSEQUENCE関数の引数の設定がちょっとわかりにくいのが痛いところです。



 INDEX関数にはない新しい機能として、マイナスの数値を使えば「最後からn行目」を抽出できます。
 次の画像では第2引数を「-2」とすることで最後から2行目を抽出しています。

 F3セル

=CHOOSEROWS(B3:D9,-2)

 


 ここまではCHOOSEROWS関数をみてきましたがこちらはCHOOSECOLS関数の例です。
 B2:D9の範囲のデータ(見出しの行を含むことに注意)から、1列目と3列目を抽出しています。

 F2セル

=CHOOSECOLS(B2:D9,{1,3})

 抽出するのが行か列かだけで、それ以外の機能はCHOOSEROWS関数と全く同じです。



 次の画像では、引数(配列)の指定順を利用して列の並べ替えを行っています。

 F2セル

=CHOOSECOLS(B2:D9,{1,3,2})

 もちろんCHOOSEROWS関数でも同じことはできますが、こうした並べ替えは(見出しを含む)列に対して行うケースが多そうです。「偶数番目の列と奇数番目の列を入れ替える」といった利用法も考えられます。

応用例

SPLIT関数との併用

 SPLIT関数で分割した項目のn番目を取得する、という利用例です。
 従来はINDEX関数が用いられていましたが、ここでもCHOOSECOLS関数が利用できます。

 C3セル

=CHOOSECOLS(SPLIT(B3,"・"),2)

 
 「・」を区切りとしてテキストを分割し、2番目の項目(祇園祭)を取得しています。



 やはりINDEX関数と異なり複数の列を取得ができるというのがポイントです。
 次の画像では複数のテキストを分割したうえで、2番目の項目と3番目の項目を一括取得しています。  

 C3セル

=CHOOSECOLS(ARRAYFORMULA(SPLIT(B3:B6,"・")),{2,3})

 


 ただし複数のテキストをSPLIT関数で分割したうえで「最後から数える」場合は注意が必要です。
 分割したときの項目数が異なる場合、最も多い項目数を「最後」の基準とみなす(つまり次の画像では4番目を最後とみなす)らしく、分割後の項目が3つしかないテキストではうまく取得できていません。

 C3セル

=CHOOSECOLS(ARRAYFORMULA(SPLIT(B3:B6,"・")),-1)

 なお「-2」にすると「天神祭」「秋」「みかん」「玉子焼き」が取得されます(いずれも前から3番目)。やはり式の意図に沿っているとはいえません。 



 解決法としてはMAP/LAMBDA関数を使うやり方が考えられます。

 C3セル

=MAP(B3:B6,LAMBDA(x,CHOOSECOLS(SPLIT(x,"・"),-1)))