のいのログ

【Power Apps】SharePointリストの参照列にPatchやCollectで登録する方法と注意点

SharePointリストでは参照(LookUp)列を使って、リスト間で一対多や多対多のリレーションシップを構築できます。

この参照列をPower Appsで取り扱うとき、PatchCollect関数で登録したり、各コントロールの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: "" // 何を入れても反映されないが必須列
        }
    }
)

PatchCollectで必要な情報は、子リストのアイテムのIdだけです。

Valueは指定したアイテムが持つ値を入れても、関係ない値を入れても、登録に影響しません。Valueはあくまで表示値であって、ここの値をいじっても参照先リストを書き換えることはありません。
ただ、実質的な意味は持たなくてもAPI上では必須列なので、適当に値を""などを設定して列自体は残してください。

ドロップボックス・コンボボックスの初期値を指定する

ドロップダウンやコンボボックスで初期値を指定するには、DefaultSelectedItemプロパティを以下のように設定します。

{
    '@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
    Id: 1,
    Value: LookUp(LookUpTest子, ID = 1, タイトル)
}

Valueはドロップボックス・コンボボックスに表示される値になります。通常であればDisplayFieldプロパティで表示させている列の値をLookUpで検索するのがいいと思います。

注意点

上記の方法を使用する際に、いくつか注意点はあります。

存在しないIDを指定してもエラーにならない

子リストにはIDが12の2つのアイテムしかありません。

この子リストを参照する列に存在しないId: 3を指定して、親リストにPatchで登録するとどうなるでしょうか?

ボタンのOnSelectに以下の数式を入れて実行してみます。

Button1.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であるValuefugaにしてわざと間違えた状態でSubmitFormしてみます。

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

Valuefugaにしても、実際に子リストのID: 1が持つ値はhogeですのでこちらが表示されています。

今回のようは手打ちで誤った値をいれるのは開発者が悪意を持って仕掛けたトラップでしかありませんが、たとえばLookUpValueを探すときにデータソースを間違えたり、.IDを持つ別のコントロールを参照したりしてもコンパイル時でも実行時でもエラーにならないので注意が必要です。

まとめ:参照列は便利だけど取り扱い注意

SharePointサイト上で登録したり、Power Appsでも編集フォームを使うようなときであれば、参照列は非常に便利です。

しかし、ちょっと応用的な使い方をしようとすると見過ごしてしまいそうなトラップが現れます。間違ったまま運用して過去のデータが水の泡に…なんてことになりかねませんので、実装時にはテストを念入りに重ねるようにしてください。

シェアしていただけると嬉しいです!
  • URLをコピーしました!

この記事を書いた人

ローコード・RPAエンジニア。DX・業務効率化を専門に開発。

前職では鉄道運転士として働きながら、社内複業でSwift・Power Platformで業務効率化を推進していた。

応援する

コメント

コメントする

CAPTCHA


目次(クリックでジャンプできます)