今回はPowerAppsでユーザーのプロフィール画像を取得するのに使用する Office365Users.UserPhotoV2()
にまつわるトラブルシューティングのご紹介です。
Problem
PowerAppsでアプリを構築中、Office365Usersコネクターが提供するAPI Office365Users.UserPhotoV2()
でエラーが発生することに気がつきました。ユーザー(Microsoft 365のテナントで登録されているユーザー)のプロフィール画像を取得するために使用していたものです。
エラーメッセージ:
Office365ユーザー.UserPhotoV2 が失敗しました: メソッド 'UserPhotoV2' にパラメーター 'id' の無効な値があります
エラーが起きるのは、Galleryコントロールを使い、ユーザーのメールアドレスを含むレコードからなるコレクションの内容を一覧表示をするScreen(画面)の表示時です。
Galleryコントロールのテンプレートでは、ユーザーのメールアドレスをキー(引数)にしてOffice365Users.UserPhotoV2()
を呼び出し、ユーザーのプロフィール画像を取得、その結果を Imageコントロールを使って表示しています:
アプリを動作確認していると、「アプリ起動後はじめて当該スクリーンに遷移したタイミング」でエラーが発生します。こんな具合に:
しかしそれとほぼ同時に、Galleryコントロール内に画像がずらりと表示される・・・これがタイトルにある「画像は取得できているのにエラーが表示される」状態です。
Solution
解決策はシンプルで、 Users.UserPhotoV2()
関数の引数についてあらかじめ IsBlank()
関数によるチェックを行うだけです(ここではレコードの Email
カラムにユーザーのメールアドレスが格納されているという仮定でコードを示します)。
変更前:
Users.UserPhotoV2(ThisItem.Email)
変更後:
If(IsBlank(ThisItem.Email), Blank(), Users.UserPhotoV2(ThisItem.Email))
なぜこれでエラーが起きなくなるのでしょうか?
私の推測したシナリオはこうです:
- アプリ起動後はじめて当該Screenを表示する。
- Screenとその中に配置されたコントロール群の初期表示プロセスが始まる。
- Galleryコントロールには最初ダミーのレコードからなるコレクションが渡される。ダミーのレコードの各列(プロパティ)の内容は空っぽ。
- その内容(=ダミー)に基づきGalleryコントロールとそのテンプレートに含まれる Imageコントロールその他が初期表示される。
- この時、Imageコントロールの
Image
プロパティの式Users.UserPhotoV2(ThisItem.Email)
も実行されるが、これはUsers.UserPhotoV2(Blank())
と同義となり、エラーが発生する。 - その後すぐに Galleryコントロールの
Items
プロパティに設定された式により正式のコレクション(≠ダミーのコレクション)が渡される。 - その内容(≠ダミー)に基づきGalleryコントロールとそのテンプレートに含まれる Imageコントロールその他が初期表示される。
- この時、Imageコントロールの
Image
プロパティの式Users.UserPhotoV2(ThisItem.Email)
も実行されるが、Email
プロパティは空でないのでエラーとならず、プロフィール画像の取得が成功する。
エラーの経緯を確認する
このような推測に至ったのは、PowerAppsが提供する「監視」(モニター)の機能を使用して、処理過程のログを確認できたからです。
監視機能についてはこちらの記事などが参考になるかなと思います:
ログにはこんなふうな出力がされており、正式のコレクションによるGallery表示に先立ち、ダミー(?)のコレクションによるGallery表示が行われている様子が見て取れました:
ここから上述の推測をして、IsBlank()
の利用を思い立ったという次第です。