
今回はpowerappsを操作している際に使うことのできる、一時的なデータベースであるコレクションについて解説していきます。
PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

コレクションってなんだ?
コレクションとはPowerAppsを起動しているときに使う一時的なデータベースでこれをコレクションと呼びます。コレクションはP Cのメモリ上に保管されるため素早く動きますが、P C間での共有やPowerAppsを閉じた後のデータ保管はできません。
あくまでも一時的な保管領域と考えましょう。
今回のサンプルコレクション
今回は次のコレクションを参考に操作する方法や作成する方法を見ていきます。
Id | 名前 | 部署 | 役職 | 年齢 |
---|---|---|---|---|
001 | 田中太郎 | 営業 | 部長 | 50 |
002 | 鈴木真一 | 広報 | 課長 | 40 |
003 | 佐藤花子 | 経理 | 30 | |
004 | 山田啓二 | 営業 | 20 |
データイメージ
コレクションは3つの概念で成り立っています。
レコード
データベースの横一行分のデータでエクセルでいうところの行にあたります。
データベースでは1行につき1データが鉄則になります。すなわちレコードは1つのデータを表しているということになります。
レコードは必ず他のレコードと重複しないデータ(プライマリキー)を設定しないと呼び出したい正確な値を呼び出せないので気を付けてください。(内部的にはプライマリキーが保持されていますが表示させる操作をしないと明示されないので使いづらいです。)
カラム
データベースの縦1列のデータになります。エクセルでいうところの列にあたるデータになります。
それぞれのカラムに対してはタイトルが設定されている必要があります。
データ
データベースの一つ一つの要素となります。データベース、カラム、レコードはこのデータの集まりというようにも考えられます。
エクセルでいうところのセルの中の値になります。
画像で見るデータイメージ

コレクションのデータ指定
関数などでコレクションを操作する場合にはレコードやカラムを指定しないといけませんがその指定方法を見てみます。
レコードの指定
レコードを指定するにはLookup関数やFirst関数のようなレコードを戻り値として設定している関数を使うことで指定します。
Filter関数で一つしかレコードを指定しなかったとしてもFilter関数はテーブル(データベース)を返す関数なのでしっかりとレコードを返す関数を指定しましょう。ここについてはこちらで検証しています。

カラムの指定
コレクションのカラムを指定する場合はコレクション名.カラム名で指定することができます。

データの指定
コレクションから直接データを指定することはできません。そのため
- コレクションからレコードを抽出
- レコードからカラムを抽出
という手順を踏むことでデータを指定することができます。 レコードから指定しないと中身のデータにはアクセスできません。例え1行のテーブルであっても、テーブルでカラムを指定するとテーブル(リスト形式)で取得されますので気をつけてください。
Lookup関数でレコードを指定している場合で書くと
Lookup(××××).列名
となります。Lookup(××××)でレコードを取得し、その中の名前のカラムを取得していることになります。

データの確認方法
PowerAppsでコレクションを確認する方法を見てみます。
コレクションタブから
コレクションのタブを開くことですぐに見れることができます。


列や行が当初のものと違うかもしれませんが、これはコレクションの中では順番の概念が存在しないからです。
画面上
画面上で確認するにはデータベースオブジェクトを使用します。
挿入タブ→その他エリア→データベース
とすることでデータベースのオブジェクトを配置することができます。

データベースのオブジェクトを配置したら表示させたいコレクションを選択します。

データベースを選んだら右側のフィールドの編集から表示したいカラム(列)を選択することでデータベース内の表示すべきカラムを表示させることができます。

カラムの追加のエリアでドラッグすることで列の表示順を変えることもできます。

データベース操作
コレクションの操作は基本的に関数で操作することになります。
新規作成
新規にデータベースを作成する場合はClearCollect関数を使います。使い方は
ClearCollect (データベース名,データベースの内容)
となります。
すでに存在しているデータベース(外部のデータベースなど)
外部のデータベースを内部のデータベースに格納する場合は外部データベースの名前で取得できますので
ClearCollect(内部で扱うデータベース名,外部に存在しているデータベース名)
で内部データに格納することができます。
New_TestというコレクションにTestというコレクションを入れる場合は
Clearcollect(New_Test,Test)
となります。
新規で作る場合
新規で作る場合はレコードの内容を記載しないといけません。
レコードは{}で表現でき、どの列にどんな内容を入力すかは:で表現できます。よってレコードを表現するには
{カラム1のタイトル:データ内容1,カラム2のタイトル:データ内容2[,・・・]}
となります。また複数のレコードを表現するには{}を,でつなげることで表現できます。
その場合には
{カラム1のタイトル:データ内容1-1,カラム2のタイトル:データ内容2-1},
{カラム1のタイトル:データ内容1-2,カラム2のタイトル:データ内容2-2}
となります。
よってClearCollect関数で新規にデータベースを作成する場合は
Clearcollect(内部で扱うデータベース名,
{カラム1のタイトル:データ内容1-1,カラム2のタイトル:データ内容2-1,・・・},
{カラム1のタイトル:データ内容1-2,カラム2のタイトル:データ内容2-2,・・・})
のようになります。

今回の例を0から作るには以下の通りになります。
ClearCollect(Test,
{Id:"001",名前:"田中太郎",部署:"営業",役職:"部長",年齢:50},
{Id:"002",名前:"鈴木真一",部署:"広報",役職:"課長",年齢:40},
{Id:"003",名前:"佐藤花子",部署:"経理",役職:"",年齢:30},
{Id:"004",名前:"山田啓二",部署:"営業",役職:"",年齢:20})
修正
カラムを追加
列を追加する場合にはAddColumns関数を使います。
AddColumns(列を追加したいテーブル名,追加列名1,数式1[,追加列名2,数式2...])
となります。AddColumns関数の戻り値がデータベース(テーブル)となりますのでこれをClearCollect関数なんかで受けて新たにデータベースを作成する必要があります。
また、列名を指定する際には文字列で指定する必要があります。
今回の例だと新しく敬称を付けた列を追加する場合次の通りになります。
ClearCollect(New_Test,AddColumns(Test,"名前敬称付き",ThisRecord.名前 & "様"))
カラム名を修正
列名を修正する場合にはRenameColumns関数を使います。
RenameColumns(列名を修正したいテーブル名, 修正前の列のタイトル名1, 修正後の列のタイトル名1[,修正前の列のタイトル名2, 修正後の列のタイトル名2 ... ] )
となります。RenameColumns関数の戻り値がデータベース(テーブル)となりますのでこれをCollect関数なんかで受けて新たにデータベースを作成する必要があります。
また、列名を指定する際には文字列で指定する必要があります。
今回のサンプルから名前列のタイトルを修正してNew_Testに格納する場合は次の通りになります。
ClearCollect(New_Test,RenameColumns(Test,"名前"," New_名前"))
カラムを削除
列を削除する場合にはDropColumns関数を使います。
DropColumns(削除したい列があるテーブル名,削除する列のタイトル名1, [削除する列のタイトル名2])
となります。RenameColumns関数の戻り値がデータベース(テーブル)となりますのでこれをClearCollect関数なんかで受けて新たにデータベースを作成する必要があります。
また、列名を指定する際には文字列で指定する必要があります。
今回のサンプルから名前列を削除してNew_Testに格納する場合は次の通りになります。
ClearCollect(New_Test,DropColumns(Test,"名前"))
レコードを追加
行を追加するにはCollect関数を使います。
Collect(行を追加したいデータベース名,{カラム1のタイトル:データ内容1-1,カラム2のタイトル:データ内容2-1,・・・},{カラム1のタイトル:データ内容1-2,カラム2のタイトル:データ内容2-2,・・・})
とすることで行が追加することができます。この関数は戻り値を使わずとも、元のコレクションにレコードを追加してくれます。
レコードの修正
レコードの修正はPatch関数、Update関数、UpdateIf関数を使うことで修正できます。
Patch関数
Patch関数はレコードを修正しますが、修正するカラム以外の部分はそのまま残してくれます。
書き方は
Patch(修正するレコードを有するテーブル名,修正するレコード,修正内容)
となります。修正内容は{}を使いレコードの作成の時と同じように書きます。
今回の例だと
Patch(Test,LookUp(Test,Id="002"),{Id:"New"})
とすると、IdがNewに変更されますが、レコードないのそのほかのデータはそのまま残りますので以下のようにレコードが修正されます。
Id | 名前 | 部署 | 役職 | 年齢 |
---|---|---|---|---|
New | 鈴木真一 | 広報 | 課長 | 40 |
また、戻り値は修正後のレコードになります。
ちなみに、Default関数というデータのないテーブルのレコードを作成する関数もありますのでPatch(Test,Defaults(Test),{Id:"New"})
とすることでCollect関数の時のようにレコードを追加することも可能です。
全部のレコードにPatchを適用させたい場合はForAll関数を使うことで適用できます。
Update関数
Update関数はレコードを修正しますが、修正するカラム以外の部分は空白になります。
書き方は
Update(修正するレコードを有するテーブル名,修正するレコード,修正内容)
となります。修正内容は{}を使いレコードの作成の時と同じように書きます。
今回の例だと
Update(Test,LookUp(Test,Id="002"),{名前:"New"}
とすると、IdがNewに変更されますが、レコードないのそのほかのデータは消えますので以下のようにレコードが修正されます。
Id | 名前 | 部署 | 役職 | 年齢 |
---|---|---|---|---|
New |
また、戻り値は修正後のテーブルになります。
UpdateIf関数
UpdateIf関数はレコードを修正しますが、テーブルの全体で条件に合致するものに修正を適用させます。Update関数とは違いPatch関数のように修正対象以外のデータはそのまま保持されます。
書き方は
UpdateIf(修正するレコードを有するテーブル名,修正するレコードの条件,修正内容)
となります。修正内容は{}を使いレコードの作成の時と同じように書きます。
今回の例だと
UpdateIf(Test,年齢>30,{Id:"New"})
とすると、年齢が30以上の人に修正が全て適用されます。なお、条件のところにTrueを入れることで全部に適用することができます。
また、戻り値は修正後のテーブルになります。
レコード内を修正し、修正以外のデータはそのまま残す▶︎Patch関数
レコード内を修正し、修正以外のデータは空白にする▶︎Update関数
全部のレコードを一律で修正し、修正以外のデータはそのまま残す▶︎Patch関数+ForAll関数 or UpdateIf関数
レコードの削除
レコードを削除する場合はRemove関数もしくはRemoveif関数を使います。Remove関数は特定のレコードを一つだけ削除することができます。一方のRemoveIf関数はレコード内の条件に合致したレコードを削除することができます。
Remove
Remove関数はテーブル名とレコードを指定することで機能します。
Remove(削除したいレコードを有するテーブル名,レコード)
レコードの部分は{}で指定することも可能ですがLookup関数やFirst関数などレコードを返却する関数を使うのが現実的になります。また、Remove関数は使えば戻り値を設定しなくても元のコレクションからレコードを削除してくれますが、戻り値で受けてあげることも可能です。
今回のサンプルで年齢が20のレコードを削除する場合は
Remove(Test,LookUp(Test,年齢=20))
となります。
Removeif
Removeif(削除したいレコードを有するテーブル名,条件)
条件のところには条件を指定したい列を指定して、どのような条件を指定するかを書きます。
RemoveIf(Test,年齢>=40)
RemoveIf関数は上からレコードを一つ一つ評価して条件に合致するならTrueを返却しそのレコードを削除するというような挙動をしますので条件のところでTrueとするとすべてのレコードが削除されます
Removeif(削除したいレコードを有するテーブル名,True)
とするとレコードがすべて削除されます。
コレクションの削除
コレクションを削除するにはClear関数を使います。
Clear(削除したいコレクション名)
で削除できます。
新たにコレクションを作成するためにコレクションを削除する場合(コレクションの初期化)はClearcolection関数を使うことですでにあるコレクションを削除し、新たにコレクションが入ります。