uniface.hub

ユニフェイスの開発者ブログ


Title PowerApps で SharePoint のユーザー列を更新する
  • 2024年6月6日
  • 岡田梨絵
PowerApps で SharePoint のユーザー列を更新する

PowerApps の Office365 ユーザーコネクタを使って、SharePoint のユーザー列を更新しようとしていろいろとハマったので備忘録を残しておきます。

やりたいこと

  • SharePoint のユーザー列を含むリストを PowerApps のフォームを使って更新したい
  • PowerApps のフォームでは、Office365 ユーザーを選択肢として表示したい

構築

  1. SharePoint でユーザー列を含むリストを作成

これは通常の UI からの操作で作成しました。

  1. PowerApps に編集フォームを追加

「挿入」から「編集フォーム」のコントロールを追加しました。
データソースには、先ほど作成したリストを接続します。

  1. ユーザーの選択肢に Offce365 ユーザーから取得したユーザーを設定

リストの列が自動的に配置されるので、ツリービューからユーザー列のデータカードを展開して
DataCardValueユーザーのコントロールを選択します。

補足
基本的に SharePoint のリストと接続したデータカードはロックされているので、編集する場合はロックを解除してください。
また Office365 ユーザーを使用するためにはデータソースに Office365 ユーザーを追加する必要があります。

右のペインの「プロパティ」を開いて、Itemsプロパティを選択。
初期状態では接続したリストの名前がそのまま記載されています。

ここを Office365 で取得したユーザーのテーブルに変更します。

注意
この関数は 999 件が取得上限のため、取得件数が多い場合はSearchUserV2({searchTerm:<<検索文字>>})で絞り込む必要があります。

これで選択肢が Office365 ユーザーになりました。

問題点

選択肢に何も表示されない(あるいは市区町村名が表示される)

初期のDisplayFieldsプロパティとSearchFieldsCityになっています。
ここを["DisplayName","Mail"]のように変更することで、表示内容や検索対象のフィールドを変更できます。

注意
この設定はデータソース(Itemsプロパティ)を変更すると初期状態に戻ってしまいます。

SharePoint アイテムを更新しようとするとエラーになる

原因は Office365 ユーザーが SharePoint が扱う Claims に一致しないためです。
これはもう頑張って Claims を生成するしかありません……。

こんな感じです。

これを Patch 関数のユーザー列の値に設定すれば更新できます。

更新後の再取得でメールアドレスが取得できない

更新後にもう一度更新をかけようとすると、DataCardValueユーザー.Selected.Emailが取得できず

Claims: i:0#.f|membership| か見つかりません。

のようなエラーとなり、画面上部に Patch 関数でネットワークエラーになったという表示が通知されます。

これはDataCardValueユーザーDefaultSelectedItemプロパティが原因です。
ここを確認すると値がParent.Defaultになっているかと思います。
これは編集フォームのデータカード「ユーザー」のDefaultプロパティを参照しています。

しかし、ここで思い出してください。
SharePoint が扱うユーザーの型は Claims、一方DataCardValueユーザーItemsで扱っているユーザーは Office365 ユーザー。
そう、型が違うんですね。
しかもいやらしいことに、Claims が持つメールアドレスのプロパティはEmailなのに対して、Office365 ユーザーが持つメールアドレスのプロパティはMail
DisplayNameのようにプロパティ名が同じなら引き当てられたのですが、プロパティ名が違うがために取得できなくなっていたのです。

ちなみに、更新後にさもユーザーが取得できていたかのようにデフォルト値にユーザー名が設定されていたのは、このDisplayNameプロパティ名の奇跡の一致によるもの。

しかたがないのでDataCardValueユーザーDefaultSelectedItemParent.DefaultからOffice365ユーザー.SearchV2().valueに変更します。
今回は選択済みのユーザーを固定で取得したいのでSearchV2({searchTerm:Parent.Default.Email})とします。
さらにvalueはテーブルを返してしまうので、1 つのレコードだけを取得する場合はFirst関数を使って最初の 1 件を取得します。
ツライですね。

これでDataCardValueユーザーが扱うデータは Office365 ユーザーのみになるので、選択を変更せずにそのまま再度更新処理を実行してもメールアドレスが取得できるようになり、更新処理でもエラーが無くなります。

さいごに

プログラミングの知識がない人にとっては「型 is 何?」な感覚でしょうし、プログラマーからしたらもどかしいことこの上ないのですが……
それでも PowerApps を触らなくてはならないいつかの誰かのための備忘録でした。