
PowerAppsを使っていると必ずと言ってもいいほど出くわすのがThisrecordという文字です。
特にForall関数なんかを使っていると出くわすことが多いのではないでしょうか。
ところがこのThisrecordというのはエクセルなどにはない概念のため非常に難しく感じてしまう存在でもあります。
そこで今回は、このThisrecordについていろいろとみていこうと思います。
PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

レコードとは
まずこのThisrecordについて見てみましょう。
Thisrecordとは日本語に訳すと「このレコード」となりますがそもそもレコードとは何でしょうか。
PowerAppsにおけるレコードとはコレクションにおける横の1行分のデータとなります。
わかりやすいのがUser関数の戻り値です。
試しにボタンを配置してOnselectに
UpdateContext({変数:User()})
と入力し、変数の中身を確認してみましょう。ユーザー情報の入ったレコードが変数に格納されることがわかると思います。

このThisRecordがレコードのデータを取り扱っているということをまずは認識しておきましょう。
ThisRecordは習うより慣れるべき
ではThisが一体何を指しているのかがわかればこのThisRecordについてわかるかと思いますがこの部分を理解するためにはThisRecordを使う関数の内部の動きを理解しないといけないのでこの内部構造を見てみましょう。
Filter関数の内部構造
Filter関数は元のコレクションから条件に合致するレコードのみを抽出したコレクションを返す関数となります。
この時内部構造がどのようになっているのかを見ていきますが、ここではプログラミングの知識が一部必要になります。
- 戻り値専用の変数が必要
- 条件に合致した場合のみ処理を行う場合分けがある
これを念頭に置いて内部処理を見ていきましょう。
- コレクションをレコードの集合体と考えレコードの1番上のレコードを取り出す
コレクションはたくさんのレコードのデータが集まることにより形成されるデータ群です。そのためFilter関数の条件に合致するかをコレクション全体で考えずにレコードごとに判断します。 - レコードが条件に合致するか確認する
- 2の処理で条件に合致した場合のみ戻り値専用の変数にレコードを追加する
- 2番目のレコードを取りだして処理2.と3.を実施する
- 3番目のレコードを取り出して処理2.と3.を実施する
- 以下最後のレコードまで繰り返し
- 戻り値専用の変数を戻り値として設定する

ここでのポイントは、コレクションの評価をする際はレコード単位で行っているということです。
おまけ:Average関数で見る内部構造
実はこの考え方は多くの関数で採用されていてAverage関数(与えた数値の平均を求める関数)でも採用されています。Average関数の場合は
- 戻り値専用の変数(ここでは変数A)とは別に調べる数字の個数を入れるための変数(ここでは変数B)を用意する
- あたえられた数字を変数Aに加算し、変数Bを+1する
- 最後の数字になるまで処理の2を繰り返す
- 変数Aを変数Bで割る
- 変数Aを戻り値として設定する
いずれにしても関数は私たちが与えたデータを分解してから処理しているということを念頭に置いておいてください。
実はすでに使っているThisRecord
Filter関数は
Filter(コレクション名,条件) で使えますが、この条件に合致するかどうか(先ほどの処理の中の2番に相当)はレコード内の情報が条件に合致するかどうかということになります。
例えば以下のようなコレクションがあるとします。

このとき
Filter(リスト,数字=10)
を実行すると実行後のコレクションは以下の通りになります。

この時の動作を確認すると
各レコードを一度取り出し、
その中の数字列の中身を評価(レコードの数字が10かどうか)し、
条件に合致したら戻り値の変数に追加する
という流れになります。
ところで条件として関数の引数で指定した
数字=10
というのは実際には
レコード名.数字=10
でないといけないというのはお判りでしょうか。
というのも、レコード内のデータへのアクセスは
レコード.列名
でアクセスできますが
数字=10
だけでは数字というどのレコードの列名なのかわからないので、パソコンに明示してあげる必要があります。
しかしながらFilter関数は
数字=10
でも正しく反応しています。
ここで重要なのはレコード名の部分がどこに行ったのかということですが、ここでレコード名のところにThisrecordを使ってみましょう。
Filter(リスト,ThisRecord.数字=10)
とすることで
Filter(リスト,数字=10)
と同じ結果が得られることになります。
ここからわかることは、ThisRecordは省略されているということです。
そして、この条件の対象であるレコードとは一体なんなのかというと、取り出したレコードになります。
つまり、Thisrecordとは、コレクションなどの評価をする際に一つ一つ取り出したレコードを指しています。

ではこのThisRecordはどのような関数で使うのでしょうか。公式では以下の関数でThisRecordが使えるとしています。
AddColumns,Average,Max,Min,Sum,StdevP,VarP,Filter,Lookup,Concat,Distinct,ForAll,Sort,With
個々の関数に関する詳細は書きませんが、いずれにしてもそれぞれのレコードを取り出し、そのレコードの中身を指定する場合にThisRecordを使うということで認識しておきましょう。