SharePointリストでは参照(LookUp)列を使って、リスト間で一対多や多対多のリレーションシップを構築できます。
この参照列をPower Appsで取り扱うとき、Patch・Collect関数で登録したり、各コントロールのDefaultsプロパティを設定するときは若干面倒な記述が必要になります。また、仕様に癖があるため、理解せずに実装するとバグを引き起こす原因になります。
参照列のレコード値
{
'@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
Id: 参照先のアイテムのID,
Value: 参照先アイテムの表示値
}参照列に対して数式から登録したり値を指定するときは、上記のレコードを使用します。
@odata.type…SharePointの参照列を表すODataのエンティティタイプ。ここは決まり文句なので変えない。Id…参照先のアイテムのID。Value…SharePointサイト上で参照元リストを見たときの表示値。列の設定の「上のリストから列を選択」で設定した列の値が参照されている。
使用方法
Patch・Collect関数で参照列に登録する
SharePointに参照元になる親リストと、参照先になる子リストの2つを作成します。


子リストの参照列を持つ親リストに値を登録するときは、このように書きます。
Patch(
親リスト,
Defaults(親リスト),
{
子リスト参照: {
'@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
Id: 1,
Value: "" // 何を入れても反映されないが必須列
}
}
)PatchやCollectで必要な情報は、子リストのアイテムのIdだけです。
Valueは指定したアイテムが持つ値を入れても、関係ない値を入れても、登録に影響しません。Valueはあくまで表示値であって、ここの値をいじっても参照先リストを書き換えることはありません。
ただ、実質的な意味は持たなくてもAPI上では必須列なので、適当に値を""などを設定して列自体は残してください。
ドロップボックス・コンボボックスの初期値を指定する
ドロップダウンやコンボボックスで初期値を指定するには、DefaultSelectedItemプロパティを以下のように設定します。
{
'@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
Id: 1,
Value: LookUp(LookUpTest子, ID = 1, タイトル)
}Valueはドロップボックス・コンボボックスに表示される値になります。通常であればDisplayFieldプロパティで表示させている列の値をLookUpで検索するのがいいと思います。
注意点
上記の方法を使用する際に、いくつか注意点はあります。
存在しないIDを指定してもエラーにならない

子リストにはIDが1・2の2つのアイテムしかありません。
この子リストを参照する列に存在しないId: 3を指定して、親リストにPatchで登録するとどうなるでしょうか?
ボタンのOnSelectに以下の数式を入れて実行してみます。
IfError(
Patch(
LookUpTest親,
Defaults(LookUpTest親),
{
タイトル: "piyo",
子リスト参照: {
'@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
Id: 3,
Value: ""
}
}
),
Notify($"エラーが発生しました: {FirstError.Kind}, {FirstError.Message}", NotificationType.Error),
Notify("登録に成功しました", NotificationType.Success)
)
なんと普通に成功してしまいました。
IfErrorでもErrorsでもエラーは検知されていません。

SharePointサイト上でリストを確認すると、今回登録したpiyoのレコードの参照列には何も表示されていません。
このように正常に存在しないIDを指定してもエラーが発生せず、処理上では正常に完了しているように見えてしまいます。
しかも、何も値が入っていないように見えますが、まだ罠があります。
存在しないIDを登録しても参照を持ち続ける
先ほど親リストに存在しないpiyoへの参照を登録しました。その後に子リストにID: 3のレコードを新規登録するとどうなるでしょうか?


なんと子リストに追加する前には存在しなかったpiyoへの参照が現れました。
SharePointリストでは存在しない子リストのアイテムIDへの参照を登録すると、UI上では登録できずに値が空になっているように見えますが、内部ではIDが保持されままになっていて、子リストにそのIDを持つアイテムが追加されるとその瞬間から参照するようになります。
Valueは指定したID以外の値も持てる
Valueは表示値であると説明しています。
あくまで表示値であり、実際にSharePointが保持している値とは直接的な関係がありません。
なので、誤った値を入れることも可能です。

DefaultSelectedItemの例のコードをいじって、本来hogeであるValueをfugaにしてわざと間違えた状態でSubmitFormしてみます。

登録は正常に完了しますが、実際のレコードは以下のようになります。(※タイトルがスクショでは空欄になっていますが、登録時に偽fugaと入力しました。)

Valueをfugaにしても、実際に子リストのID: 1が持つ値はhogeですのでこちらが表示されています。
今回のようは手打ちで誤った値をいれるのは開発者が悪意を持って仕掛けたトラップでしかありませんが、たとえばLookUpでValueを探すときにデータソースを間違えたり、.IDを持つ別のコントロールを参照したりしてもコンパイル時でも実行時でもエラーにならないので注意が必要です。
まとめ:参照列は便利だけど取り扱い注意
SharePointサイト上で登録したり、Power Appsでも編集フォームを使うようなときであれば、参照列は非常に便利です。
しかし、ちょっと応用的な使い方をしようとすると見過ごしてしまいそうなトラップが現れます。間違ったまま運用して過去のデータが水の泡に…なんてことになりかねませんので、実装時にはテストを念入りに重ねるようにしてください。

コメント