はじめに
Power AppsにはSort関数とSortByColumns関数がありますが、これらの関数の違い(使い分け?)を今回はまとめます。
公式のリファレンスはこちら
今回利用するコレクション
今回は利用するコレクションはこちらです。
ClearCollect( col, { Type: "食品", Name: "りんご", Price: 100, Orders: 5 }, { Type: "衣料品", Name: "Tシャツ", Price: 2000, Orders: 3 }, { Type: "家電", Name: "テレビ", Price: 50000, Orders: 1 }, { Type: "書籍", Name: "ハリーポッターシリーズ", Price: 3000, Orders: 2 }, { Type: "食品", Name: "チョコレート", Price: 200, Orders: 10 }, { Type: "家具", Name: "ソファ", Price: 50000, Orders: 1 }, { Type: "衣料品", Name: "ジーンズ", Price: 4000, Orders: 2 }, { Type: "食品", Name: "牛乳", Price: 150, Orders: 8 }, { Type: "書籍", Name: "ドラゴンボール", Price: 2500, Orders: 1 }, { Type: "家電", Name: "冷蔵庫", Price: 70000, Orders: 1 }, { Type: "衣料品", Name: "ワンピース", Price: 5000, Orders: 3 }, { Type: "食品", Name: "パン", Price: 120, Orders: 6 }, { Type: "家具", Name: "テーブル", Price: 30000, Orders: 1 }, { Type: "書籍", Name: "ハンナンの賭け", Price: 1500, Orders: 2 }, { Type: "衣料品", Name: "シャツ", Price: 2500, Orders: 4 }, { Type: "食品", Name: "オレンジ", Price: 80, Orders: 12 }, { Type: "家具", Name: "ベッド", Price: 60000, Orders: 1 }, { Type: "家電", Name: "洗濯機", Price: 40000, Orders: 1 }, { Type: "書籍", Name: "鬼滅の刃", Price: 3500, Orders: 3 }, { Type: "衣料品", Name: "スカート", Price: 3000, Orders: 2 }, { Type: "食品", Name: "ラーメン", Price: 300, Orders: 7 } )
ChatGPTに依頼して作成してもらいました。
こういったサンプル作ってもらうの便利でいいですよねー
簡単な説明
Sort関数
Sort関数は、"数式に基づいて"テーブルを並び替えます。
数式は Price
のように単一のフィールドを指定するのでもOKです。
数式の結果は、数値、文字列、またはブール値になる必要があります。(レコードとかテーブルはダメだよ。)
SortByColumns関数
SortByColumns 関数は、"1 つまたは複数の列に基づいて"テーブルを並べ替えます。
また、特特定のテーブルと同じ順序に並び替えることも可能です。
並び替え順序の指定
並び替え順序を指定したい場合は、SortOrderオプションにて SortOrder.Ascending
または SortOrder.Descending
を指定します。
SortOrder.Ascending
が昇順で、 SortOrder.Descending
が降順です。
このオプションを指定しない場合、既定では昇順( SortOrder.Ascending
)が設定されています。
並び替え例
オプションである並び替え順序には既定である昇順を一律設定するようにしています。(省略可能ですが、説明のために記載しています。)
特定の列で並び替える
文字
Name列で並び替えを実施する場合は以下のように記載できます。
Sort
Sort(col, Name, SortOrder.Ascending)
SortByColumns
SortByColumns(col, "Name", SortOrder.Ascending)
結果は以下のようになります。
数値
Price列で並び替えを実施する場合は以下のように記載できます。
Sort
Sort(col, Price, SortOrder.Ascending)
SortByColumns
SortByColumns(col, "Price", SortOrder.Ascending)
結果は以下のようになります。
計算結果に基づいて列を並び替える
Price列 × Orders列(価格列 × 注文数列)の計算結果で並び替えると以下のようになります。
Sort
Sort(col, Price * Orders, SortOrder.Ascending)
SortByColumns
// SortByColumns では計算結果に基づいてソートすることはできません。
結果は以下のようになります。
計算結果に基づいてソートしたい場合は、Sort関数でしか実現できません。
複数の列で並び替える
Name列で並び替えをした後に、Type列で並び替えをすると以下のようになります。
Sort
Sort(Sort(col, Name, SortOrder.Ascending), Type, SortOrder.Ascending)
SortByColumns
SortByColumns(col, "Type", SortOrder.Ascending, "Name", SortOrder.Ascending)
結果は以下のようになります。
Sort関数を使ってソートする場合は内から外に順に関数が実行されるので、最初に並び替えを実行したい列を内側に記載することになります。
SortByColumns関数を使ってソートする場合は、右から左に順にソートされるようなので、最初に並び替えを実行したい列を右側に記載することになります。
ちなみにドキュメントの例は間違っていますね。
ドキュメントの実行結果
実際の実行結果
SortByColumnsが違いますね。
正しくはこうだと思います。
SortByColumns( IceCream, "Quantity", SortOrder.Ascending, "OnOrder", SortOrder.Ascending )
とりあえずIssues上げときました。
特定の順番で並び替える
Type列を「食品」が先頭に来るようにし、次に「家具」が設定されるように並び替えると以下のようになります。
Sort
// Sort では特定のテーブルに基づいてソートすることはできません。
SortByColumns
SortByColumns(col, "Type", ["食品", "家具"])
結果は以下のようになります。
このように、SortByColumsでは特定のテーブルに基づいて並び替えることもできます。
なおこのような指定にした場合は、ソート順を指定することはできない他、複数列でのソートもできないので注意しましょう。
複数列で並び替えたい場合は入れ子に設定することになりますね。
SortByColumns(Sort(col, Name, SortOrder.Ascending), "Type", ["食品", "家具"])
or
SortByColumns(SortByColumns(col, "Name", SortOrder.Ascending), "Type", ["食品", "家具"])
おわりに
以上、Sort関数とSortByColumns関数の違いと使い分けでした。
おおよそのソート方法であれば、どちらでも記載することのできるのでそこは好みの問題なところがありますが、どちらかでしか実行できないパターンとかも存在するので、それぞれの関数の特徴を理解できるように目指しましょう!