PowerApps では、データソースから取得したデータを、コレクションという変数でアプリ内に読み込んで保持しておき、ギャラリーやデータテーブルを用いて画面への一覧表示などを簡単に行うことができます。

このとき、コレクションの作成やデータの編集、そしてデータの削除の方法をおぼえておくことで、より自由で柔軟にデータを扱うことができます。PowerApps の使い方を学んでいて、このあたりをおぼえておくと便利そうだなーという関数をまとめておきます。

この記事は、僕が PowerApps を学びながら書くシリーズです。

コレクションのデータの作成

まずはコレクションの作成です。おそらく多くの場合、データソースからデータを読み込みコレクションを作成することが多いかと思います。今回は練習用に次のような Excel データを用意しておき直接 PowerApps のアプリに取り込んで利用しています。また、データ名は「商品」です。

ClearCollect 関数

ClearCollect 関数は、後述する Clear 関数と Collect 関数を同時に実行するイメージになります。つまりは、現在のコレクション内の全てのデータを削除し、新たにコレクションに値をセットします。

ClearCollect(MyCollection, 商品)

Collect 関数

Collect 関数は、現在のコレクションのデータを保持したまま、コレクションの末尾に新たなデータを追加できます。同じデータ項目を持つ複数のデータソースからデータを取得し結合するときなどに利用できると思います。

Collect(MyCollection, 商品)

Collect 関数を利用して、コレクションにレコードを追加することもできます。たとえば、商品のデータに分類をお菓子としてグミを追加してみます。このとき、例えば管理番号は現在のデータの最大値に 1 を足したものをセットしてみます。このためには次のように書きます。

Collect(MyCollection, {価格:150, 分類:"お菓子", 商品名:"グミ", 管理番号:Max(MyCollection, 管理番号)+1})

コレクションのデータの編集

次にコレクションに含まれるデータやレコードの編集です。このあたりを利用できると、データソースには存在しないデータ項目や計算値などを PowerApps アプリ内で作成し利用できます。

Update 関数

Update 関数は、コレクション内のひとつの特定のレコードを丸ごと置換することができます。たとえば、商品のデータの内、分類がお菓子の最初に見つかったレコードを指定した値で置換するには次のように書きます。

Update(MyCollection, First(Filter(商品,分類="お菓子")), {価格:500,分類:"お菓子"})

この場合の注意点は、置換後の値には全てのデータ項目を指定する必要があり、指定しなかったデータ項目は空白になるという点です。そのため、先ほどの例では管理番号と商品名が空白になってしまいました。また、全く同じ値を持つレコードがある場合、そちらも同時に置換するには次のように関数の最後に All を指定できます。

Update(MyCollection, First(Filter(商品,分類="お菓子")), {価格:500,分類:"お菓子"}, All)

UpdateIf 関数

UpdateIf 関数は、指定した条件に一致した複数のレコードを一度に編集することができます。たとえば、商品のデータの内、分類がお菓子の全てのレコードの価格に 50 を足したものをセットするは次のように書きます。

UpdateIf(MyCollection, 分類="お菓子", {価格:価格+50})

この場合、指定しなかった項目は元の値がそのまま保持されます。便利です。

Patch 関数

Patch 関数は、コレクション内のひとつの特定のレコードのデータ項目を編集することができます。たとえば、商品のデータの内、管理番号が 1 のレコードの価格を 150 に変更するには次のように書きます。

Patch(MyCollection, First(Filter(MyCollection, 管理番号=1)), {価格:150})

さらに Patch 関数では、コレクションに新たなレコードを追加することができます。レコードを追加するには Defaults 関数を合わせて利用できます。たとえば、Collect 関数のときと同じようにグミを追加してみます。このためには次のように書きます。

Patch(MyCollection, Defaults(MyCollection), {価格:150, 分類:"お菓子", 商品名:"グミ", 管理番号:Max(MyCollection, 管理番号)+1})

Patch 関数で Defaults 関数を利用した場合と、Collect 関数を利用した場合との違いですが、Patch 関数でコレクションではなくデータソースに直接レコードを追加する場合、データソース側でデータ項目の既定値が設定されているとその値が自動的に入力されます。

AddColumns 関数

AddColumns 関数は、現在のコレクションに新たにデータ項目を追加したテーブルを作成することができ、作成されたテーブルをコレクションとして保存しておいて利用することができます。たとえば、分類と商品名の文字列を Concatenate 関数で連結して、「分類と商品名」という新たなデータ項目を追加するには次のように書きます。

ClearCollect(MyCollection2, AddColumns(MyCollection, "分類と商品名", Concatenate(分類, ": ", 商品名)))

ためしてみると、どうやら AddColumns 関数の結果を元のコレクションに保存しておくように指定すると上手く動きませんでした。

ShowColumns 関数

ShowColumns 関数は、現在のコレクションから指定したデータ項目だけを抜き出して取得することができます。たとえば、分類のデータだけを抜き出して取得し、さらに、Distinct 関数でデータの重複を排除することで分類一覧のデータが保存された新たな「分類コレクション」のようなものを作成することもできます。

ClearCollect(分類コレクション, Distinct(ShowColumns(MyCollection,"分類"), 分類))

RenameColumns 関数

RenameColumns 関数は、現在のコレクションのデータ項目の名前を変更することができます。データソースから取得したデータ項目名が分かりにくい場合などは、分かりやすく変更しておくと良さそうです。たとえば、管理番号というデータ項目を商品番号に変更するには次のように書きます。

ClearCollect(MyCollection4, RenameColumns(MyCollection, "管理番号", "商品番号"))

こちらも元のコレクションに保存しておくように指定すると上手く動きませんでした。新しいコレクションに保存します。

コレクションのデータの削除

さらにはレコードやデータの削除です。コレクションに取り込んだデータから不要なレコードやデータ項目を削除することができます。

Clear 関数

Clear 関数は、コレクションにあるレコードを全て削除することができます。ただし、データの項目の情報は削除されずに残ります。コレクションの全てのレコードを削除するには次のように書きます。

Clear(MyCollection)

Remove 関数

Remove 関数は、データからひとつの特定のレコードを削除することができます。たとえば、商品のデータの内、分類がお菓子の最初に見つかったレコードを削除するには次のように書きます。

Remove(MyCollection, First(Filter(商品,分類="お菓子")))

また、全く同じ値を持つレコードがある場合、そちらも同時に削除するには次のように関数の最後に All を指定できます。

Remove(MyCollection, First(Filter(商品,分類="お菓子")), All)

RemoveIf 関数

RemoveIf 関数は、指定した条件に一致した複数のレコードを一度に削除することができます。たとえば、商品のデータの内、分類がお菓子の全てのレコードを一度に削除するには次のように書きます。

RemoveIf(MyCollection, 分類="お菓子")

DropColumns 関数

DropColumns 関数は、現在のコレクションから指定したデータ項目を削除したテーブルを作成することができます。たとえば、管理番号というデータ項目を削除するには次のように書きます。

ClearCollect(MyCollection3, DropColumns(MyCollection2, "管理番号"))

こちらも AddColumns 関数と同様に DropColumns 関数の結果を元のコレクションに直接保存するように指定すると上手く動かないようでした。

コレクションのレコードの並び替え

そして並び替えです。データを基にレコードを任意の順番に並び替えます。

SortByColumns 関数

SortByColumns 関数は、指定したデータ項目の値に応じてレコードを並び替えることができます。たとえば、管理番号で降順に並び替え、元のコレクションに並び替えた結果を保存しておくには次のように書きます。

ClearCollect(MyCollection, SortByColumns(MyCollection, "管理番号", SortOrder.Descending))

並び替え操作では、複数のデータ項目の組合せで並び替えを行いたい時があると思います。たとえば、価格で並び替え、かつ、同じ価格のものについては管理番号で並び替えを行うというような場合です。そのためには次のように書きます。

ClearCollect(MyCollection, SortByColumns(MyCollection, "価格", SortOrder.Ascending, "管理番号", SortOrder.Descending))

さらに、たとえば並び替え順として自身で指定した分類の順序によって並び替えを行うといったことができます。お弁当、お菓子、飲み物の順序にレコードを並び替えたいといった場合です。SortByColumns 関数では、こうした並び順を自身で指定することもでき、次のように書きます。

ClearCollect(MyCollection, SortByColumns(MyCollection, "分類", ["お弁当", "お菓子", "飲み物"]))

このあたりを使いこなせると、データの利用用途に合わせてかなり柔軟に並び替えができそうです。

Sort 関数

Sort 関数は、SortByColumns 関数と同じようにデータ項目を指定した並び替えも可能ですが、複数のデータ項目の計算値によっても並び替えを行うことができます。たとえば、価格と管理番号を足した値で並び替えるには次のように書きます。

ClearCollect(MyCollection, Sort(MyCollection, 価格+管理番号, SortOrder.Descending))

コレクションのデータの検索や絞込み

さいごが、コレクション内のデータの検索や絞込みです。

Filter 関数

Filter 関数は、コレクション内のデータを検索し、指定した条件に一致したレコードを取得します。たとえば、管理番号が 10 より大きく、かつ、16 より小さいレコードのみを取得するには次のように書きます。

ClearCollect(MyCollection, Filter(MyCollection, 管理番号>10, 管理番号<16))

Filter 関数には、複数の条件を指定することができますが、AND で評価されます。

Search 関数

Search 関数は、コレクション内のデータを文字列で検索することができます。たとえば、商品名に丼が含まれるレコードのみを取得するには次のように書きます。

ClearCollect(MyCollection, Search(MyCollection, "丼", "商品名"))

LookUp 関数

LookUp 関数は、コレクション内のデータを検索し、一致したレコードの最初に見つかったものだけを取得します。たとえば、管理番号が 10 より大きいという条件で実行するには次のように書きます。

ClearCollect(MyCollection, LookUp(MyCollection, 管理番号>10))

Filter 関数のときとは異なり、結果がひとつだけになります。

さいごに

おぼえておくと良い関数の数が多いようにも思えますが、コレクションのデータの扱い方が分かると SharePoint リストのデータや CDS のデータをアプリ内で利用するときの自由度がグッと上がると思います。また、コレクションのデータの扱い方が分かれば、データソースとのデータ取得やデータ書込みにも応用が出来ます。

他にもおぼえておくと便利だよーという関数がありましたら教えてください!