1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Office365Users.UserPhotoV2()で画像は取得できているのにエラーが表示される

Posted at

今回はPowerAppsでユーザーのプロフィール画像を取得するのに使用する Office365Users.UserPhotoV2() にまつわるトラブルシューティングのご紹介です。

Problem

PowerAppsでアプリを構築中、Office365Usersコネクターが提供するAPI Office365Users.UserPhotoV2()でエラーが発生することに気がつきました。ユーザー(Microsoft 365のテナントで登録されているユーザー)のプロフィール画像を取得するために使用していたものです。

エラーメッセージ:

Office365ユーザー.UserPhotoV2 が失敗しました: メソッド 'UserPhotoV2' にパラメーター 'id' の無効な値があります

エラーが起きるのは、Galleryコントロールを使い、ユーザーのメールアドレスを含むレコードからなるコレクションの内容を一覧表示をするScreen(画面)の表示時です。
Galleryコントロールのテンプレートでは、ユーザーのメールアドレスをキー(引数)にしてOffice365Users.UserPhotoV2()を呼び出し、ユーザーのプロフィール画像を取得、その結果を Imageコントロールを使って表示しています:
image.png

アプリを動作確認していると、「アプリ起動後はじめて当該スクリーンに遷移したタイミング」でエラーが発生します。こんな具合に:
image.png

しかしそれとほぼ同時に、Galleryコントロール内に画像がずらりと表示される・・・これがタイトルにある「画像は取得できているのにエラーが表示される」状態です。

Solution

解決策はシンプルで、 Users.UserPhotoV2()関数の引数についてあらかじめ IsBlank()関数によるチェックを行うだけです(ここではレコードの Email カラムにユーザーのメールアドレスが格納されているという仮定でコードを示します)。

変更前:

Users.UserPhotoV2(ThisItem.Email)

変更後:

If(IsBlank(ThisItem.Email), Blank(), Users.UserPhotoV2(ThisItem.Email))

なぜこれでエラーが起きなくなるのでしょうか?

私の推測したシナリオはこうです:

  1. アプリ起動後はじめて当該Screenを表示する。
  2. Screenとその中に配置されたコントロール群の初期表示プロセスが始まる。
  3. Galleryコントロールには最初ダミーのレコードからなるコレクションが渡される。ダミーのレコードの各列(プロパティ)の内容は空っぽ。
  4. その内容(=ダミー)に基づきGalleryコントロールとそのテンプレートに含まれる Imageコントロールその他が初期表示される。
  5. この時、Imageコントロールの Imageプロパティの式 Users.UserPhotoV2(ThisItem.Email)も実行されるが、これはUsers.UserPhotoV2(Blank())と同義となり、エラーが発生する。
  6. その後すぐに Galleryコントロールの Itemsプロパティに設定された式により正式のコレクション(≠ダミーのコレクション)が渡される。
  7. その内容(≠ダミー)に基づきGalleryコントロールとそのテンプレートに含まれる Imageコントロールその他が初期表示される。
  8. この時、Imageコントロールの Imageプロパティの式 Users.UserPhotoV2(ThisItem.Email)も実行されるが、Emailプロパティは空でないのでエラーとならず、プロフィール画像の取得が成功する。

エラーの経緯を確認する

このような推測に至ったのは、PowerAppsが提供する「監視」(モニター)の機能を使用して、処理過程のログを確認できたからです。

監視機能についてはこちらの記事などが参考になるかなと思います:

ログにはこんなふうな出力がされており、正式のコレクションによるGallery表示に先立ち、ダミー(?)のコレクションによるGallery表示が行われている様子が見て取れました:
image.png

ここから上述の推測をして、IsBlank()の利用を思い立ったという次第です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?