- 2024年6月6日
PowerApps の Office365 ユーザーコネクタを使って、SharePoint のユーザー列を更新しようとしていろいろとハマったので備忘録を残しておきます。
やりたいこと
- SharePoint のユーザー列を含むリストを PowerApps のフォームを使って更新したい
- PowerApps のフォームでは、Office365 ユーザーを選択肢として表示したい
構築
- SharePoint でユーザー列を含むリストを作成
これは通常の UI からの操作で作成しました。

- PowerApps に編集フォームを追加

「挿入」から「編集フォーム」のコントロールを追加しました。
データソースには、先ほど作成したリストを接続します。
- ユーザーの選択肢に Offce365 ユーザーから取得したユーザーを設定
リストの列が自動的に配置されるので、ツリービューからユーザー列のデータカードを展開してDataCardValueユーザー
のコントロールを選択します。
補足
基本的に SharePoint のリストと接続したデータカードはロックされているので、編集する場合はロックを解除してください。
また Office365 ユーザーを使用するためにはデータソースに Office365 ユーザーを追加する必要があります。
右のペインの「プロパティ」を開いて、Items
プロパティを選択。
初期状態では接続したリストの名前がそのまま記載されています。
ここを Office365 で取得したユーザーのテーブルに変更します。
Office365ユーザー.SearchUserV2({searchTerm:Self.SearchText,isSearchTermRequired:false}).value

注意
この関数は 999 件が取得上限のため、取得件数が多い場合はSearchUserV2({searchTerm:<<検索文字>>})
で絞り込む必要があります。
これで選択肢が Office365 ユーザーになりました。
問題点
選択肢に何も表示されない(あるいは市区町村名が表示される)

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

注意
この設定はデータソース(Items
プロパティ)を変更すると初期状態に戻ってしまいます。
SharePoint アイテムを更新しようとするとエラーになる
原因は Office365 ユーザーが SharePoint が扱う Claims に一致しないためです。
これはもう頑張って Claims を生成するしかありません……。
{
'@odata.type':"#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser",
Claims: "i:0#.f|membership|" & Lower(DataCardValueユーザー.Selected.Email),
Department: "",
DisplayName: DataCardValueユーザー.Selected.DisplayName,
Email: DataCardValueユーザー.Selected.Email,
JobTitle: "",
Picture: ""
}
こんな感じです。
これを 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ユーザー
のDefaultSelectedItem
をParent.Default
からOffice365ユーザー.SearchV2().value
に変更します。
今回は選択済みのユーザーを固定で取得したいのでSearchV2({searchTerm:Parent.Default.Email})
とします。
さらにvalue
はテーブルを返してしまうので、1 つのレコードだけを取得する場合はFirst
関数を使って最初の 1 件を取得します。
ツライですね。
これでDataCardValueユーザー
が扱うデータは Office365 ユーザーのみになるので、選択を変更せずにそのまま再度更新処理を実行してもメールアドレスが取得できるようになり、更新処理でもエラーが無くなります。
さいごに
プログラミングの知識がない人にとっては「型 is 何?」な感覚でしょうし、プログラマーからしたらもどかしいことこの上ないのですが……
それでも PowerApps を触らなくてはならないいつかの誰かのための備忘録でした。