ソート順をリストで指定する方法
まずは問題となるケースの確認です。
次の画像は、GROUPBY関数を使った単純な集計の例です。
E3セルに「=GROUPBY(B3:B10,C3:C10,SUM)」と入力し、店舗ごとの売上合計を算出しています。
GROUPBY関数では第6引数でソート指定が可能ですが、並べ方は(当然ながら)昇順と降順しかありません。また、画像のように第6引数を指定しないと行フィールドの昇順となります(UNIQUE関数のような初出順にはならない)。
これらにより「行フィールドの並び順を思ったように変えられない」、「元のデータの行フィールド順の順番で並べて欲しいのにGROUPBY関数で並べ替えられてしまう」といった問題が生じます。
そこで次の画像では、数式内で行フィールド(店舗)の並び順を指定しています。
E3セル
=LET(a,GROUPBY(B3:B10,C3:C10,SUM), SORTBY(a,XMATCH(TAKE(a,,1),{"東京店","名古屋店","大阪店"})) )
式がかなり長くなっています。
具体的には最初の画像と同じ結果をLET関数でaと名付けています。そしてaの1列目のそれぞれの値(店舗名)が「{"東京店","名古屋店","大阪店"}」という配列中の何番目にあるか(1~3)を取得しています。そしてSORTBY関数を使いその順番を基準としてaを並べ替えています。
さらに式が長くなりますが「XMATCH(TAKE(a,,1),{"東京店","名古屋店","大阪店"})」をbなどと名付けて「SORTBY(a,b)」で締める形にした方が読みやすくなります。
なお、aの1列目には「合計」という値が含まれますがこれはXMATCH関数で順番を取得できずエラーになり、結果的に一番下に表示されることとなります。
次の画像ではシート上のリストを参照してソート順に指定しています。
G3セル
=LET(a,GROUPBY(B3:B10,C3:C10,SUM), SORTBY(a,XMATCH(TAKE(a,,1),E3:E5)) )
配列を直接指定していたのを、セル参照に代えただけの違いです。
元のデータの行フィールドの順(初出順)に並べさせる方法
次の画像では、左側の売上表を行フィールド(店舗)順に並べ替ています。
そしてGROUPBY関数の結果もこの店舗の順番で並ぶようにしています。
E3セル
=LET(a,GROUPBY(B3:B10,C3:C10,SUM), SORTBY(a,XMATCH(TAKE(a,,1),B3:B10)) )
これも数式の内容的には上記例と同じで、XMATCH関数の参照先が「B3:B10」に変わっただけです。これにより配列a中の「東京店」「名古屋店」「大阪店」がそれぞれ1,4,6(B3:B10内で初めて出現する相対位置)に読み替えられ、これを基準としてaが並べ替えられます。
画像ではデータが店舗名でソートされていますが、そうでない場合も店舗の初出順に並べられます。