
データソースはMicrosoft Entra IDのユーザー情報を使用します。
- 操作環境:
- OS:Windows 11
- Webブラウザー:Edge
- 使用プラン:Microsoft 365 Business Premium
Entraユーザー情報によるメンバー照会
Microsoft Entra IDのユーザー情報はOutlookの連絡先で照会できますが、以下のような挙動のため、メンバー照会の要件に合わないと感じるかもしれません。
- 更新の反映に時間がかかる
- 環境によっては無効化したアカウントが表示される
- 会議室等のリソースや共有アカウント等、メンバー以外のアカウントが表示される
- Exchange Onlineのメールボックスを持たないユーザーが表示されない
今回は、Microsoft Entra IDのユーザー情報を活用しつつ、必要な情報に絞った上でタイムラグなく照会できるアプリをPowerAppsで作成してみたいと思います。

処理の流れ・項目の整理
処理の流れは以下の通りです。一覧画面で一覧検索とファイル出力するだけのシンプルなアプリです。
- 一覧検索:Microsoft Entra IDからユーザー情報を取得し表示します。
- ファイル出力:ファイル出力フローにより、画面表示されたユーザー情報をSharePointドキュメント上のCSVファイルに出力し、このファイルを起動します。

今回使用する項目については、Microsoft Entra IDのユーザー画面で確認します。
WebブラウザーよりMicrosoft Entra管理センターにアクセスし、左メニューの[ユーザー>すべてのユーザー]を選択します。ゲスト・無効化したユーザー、リソースはアプリに表示させないこととします。

アプリに表示させるユーザーの[プロパティ]タブにて、改めて今回使用する項目を確認します。
- 表示名(DisplayName)
- 携帯電話番号(mobilePhone)
- メール(Mail)

同じ画面の下半分です。
- 役職(JobTitle)
- 部署(Department)
- 勤務先所在地(OfficeLocation)
- 有効なアカウント(AccountEnabled)

[概要]タブのユーザー画像もアプリに表示します。
なお、ユーザー画像はユーザー本人がマイアカウント画面等から設定できます。

アプリの完成イメージ
先にアプリの完成イメージを紹介します。
まずは一覧検索機能です。
- 左:アプリにアクセスすると、一覧画面に全メンバーが表示されます。
- 右上:コンボボックスで部署を選択すると(複数可)、該当メンバーに絞り込みします。未選択時は全メンバーが表示されます。
- 右下:入力欄にキーワードを入力すると、氏名に部分一致するメンバーに絞り込みします。未入力時は全メンバーが表示されます。
また、[User Ccc]メンバーのようにユーザー画像が未登録の場合、画像表示部分はブランクを設定しています。

次にファイル出力機能です。
アプリ右上のダウンロードアイコンを選択すると、Excelが起動し、アプリの画面に表示しているメンバーの情報がファイル出力されます。

出力したファイルのダウンロードは、上メニューの[ファイル>コピーを作成する>コピーのダウンロード]から実施できます。

以下は細かい処理の補足説明です。
- 出力データはExcelでも文字化けしないよう文字コードをUTF-8からShift_JISに変換しています。
- 役職名等の項目にカンマが含まれていても列がずれることなく出力されます(SharePoint上のファイルがcsv形式ファイルのため補足)。
- ファイル出力よりファイル起動の方が速い場合がありますが、ファイルの一次保存先がSharePointドキュメント(排他制御なし)のため、ファイル起動中でもデータがオンラインで反映されます。
アプリ実装:基本部分
Power Appsの画面にアクセスし、左メニューの[作成]を選択し、[空のアプリ]を選択します。
[空のキャンパスアプリ]の[作成]を選択します。

アプリ名を適宜入力し、[形式]は[電話]を選択し、[作成]を選択します。
アプリの編集画面が表示されたら、上メニューの[・・・>設定]を選択します。

左メニューの[全般]設定において、アプリのアイコンや自動保存のオフ/オン等を適宜調整します。
[データ行の制限]は、今回は委任の問題が発生しないため変更不要です。データソースにSharePointリスト等を使用する場合は、上限値の2000に変更することをお奨めします。

アプリの編集画面に戻り、リスト用の画面を追加し、元々用意されていた空の画面を削除します。
左側[ツリービュー]の[新しい画面]を選択し、[リスト]を選択します。これにより[Screen2]という名前のリスト画面が追加されます。
左側[ツリービュー]の[Screen1]を選択して右クリックし、[削除]を選択します。これにより[Screen1]という名前の空の画面が削除されます。

追加したリスト画面の名前を分かりやすい名前に変更します(任意)。
左側[ツリービュー]で[Screen2]を選択して右クリックし、[Rename]を選択し、名前を[BrowseScreen]に変更します。

画面の表示タイトルを設定します。
中央の画面レイアウト上で表示タイトルを選択し、右側[プロパティ]の[ディスプレイ>テキスト]の値を"メンバー一覧"とします。

右上の[+]アイコンはデータ追加用のものですが、今回データ追加機能は不要ですので、ファイル出力用に変更します。
中央の画面レイアウト上で[+]アイコンを選択し、右側[プロパティ]の[ディスプレイ>アイコン]のリストから[ダウンロード]を選択します。

アイコンのイメージが変わりました。
図表4-5のリスト画面の名前と同じように、アイコンの名前を分かりやすい名前に変更します(任意)。
左側[ツリービュー]で[IconNewItem1]を選択して右クリックし、[Rename]を選択し、名前を[IconDownloadItem1]に変更します。

データソースを追加します。
中央の画面レイアウト上の一覧データ表示部分(左側[ツリービュー]の[BrowserGallery1])を選択し、[データ]を選択します。[Office 365]で検索し、 [Office 365 ユーザー]が表示されたらこれを選択します。
さらに、接続ユーザーを選択します。

アプリ実装:一覧検索
検索条件に部署を追加します。
上メニューの[挿入]から、テキストラベルとコンボボックスを各1個追加します。
マウス操作で一覧データ表示部分(左側[ツリービュー]の[BrowserGallery1])を下にずらし、検索条件に関する部品の位置やサイズを整えます。

部署ラベルについて、以下の通り設定します。
- 名前:lblDepartment
- Textプロパティ:"部署:"

部署コンボボックスについて、以下の通り設定します。
- 名前:cmbDepartment
- DisplayFields:["Department"](コンボボックスの値が表示されない場合、["Value"]を["Department"]に変更すると解決します。その後、表記が勝手に["Value"]に戻りますが、コンボボックスの値は問題なく表示されます)
- InputTextPlaceholderプロパティ:"複数選択可, 未選択時は全件抽出"
- Itemsプロパティ:(以下参照)
Distinct(
Sort(
Filter(
Office365ユーザー.SearchUserV2(
{searchTerm:"", isSearchTermRequired:false}
).value,
JobTitle <> "リソース", "@xxxxxx.com" in Mail,
AccountEnabled = true
)
, SortOrder.Ascending
)
,Department
)

一覧データ表示部分左側([ツリービュー]の[BrowserGallery1])の設定を行います。
左側[ツリービュー]の[BrowserGallery1]を選択し、[Items]プロパティを以下の通り設定します。
Sort(
Filter(
Office365ユーザー.SearchUserV2(
{searchTerm:"", isSearchTermRequired:false}
).value,
JobTitle <> "リソース", "@xxxxxx.com" in Mail,
AccountEnabled = true,
IsBlank(cmbDepartment.SelectedItems)
|| IsEmpty(cmbDepartment.SelectedItems)
|| Department in cmbDepartment.SelectedItems,
TextSearchBox1.Text in DisplayName
),
DisplayName,
If(SortDescending1, SortOrder.Descending, SortOrder.Ascending)
)
- 役職がリソースでない
- アカウントが有効
- メールの@より右が組織のドメイン(組織内メンバー)
- 部署コンボボックスで選択した部署(未選択:BlankやEmptyの場合は全件抽出)
- テキストボックスに入力したキーワードを含む表示名(未入力の場合は全件抽出)

左側[ツリービュー]の[BrowserGallery1]を選択し、左側[TemplateFill]プロパティを以下の通り設定します。
If(ThisItem.Mail=User().Email,RGBA(153,217,234,1),RGBA(0, 0, 0, 0))
さらに、右側[プロパティ]の[ディスプレイ>レイアウト]のリストから、[画像、タイトル、サブタイトル、本文]を選択します。

一覧データ表示部分の項目を設定します。
各部品の[Text]プロパティを以下の通り設定します。
- Title1: "氏名 : " & ThisItem.DisplayName
- SubTitle1: "部署 : " & ThisItem.Department & " / 役職 : " & ThisItem.JobTitle & " / 勤務先 : " & ThisItem.OfficeLocation
- Body: "TEL : " & ThisItem.mobilePhone & " / Mail : " & ThisItem.Mail
また、上記項目の値が途中で見切れる場合は、幅を広げる、複数行表示できるようにするなど、適宜調整します。

画像([Image1])の[Image]プロパティを設定します。
IfError(Office365ユーザー.UserPhotoV2(ThisItem.Mail), Blank())

アプリ実装:ファイル出力
まずSharePointドキュメント上に出力用の空のCSVファイルを用意します。アプリ上でCSVファイルをExcelで起動する際、SharePoint上のドキュメントのURLが必要となります。SharePoint上に配置した後、ファイルを開いてURLを確認します。
アプリユーザーがアクセスできるSharePointサイトのドキュメントフォルダーに、[member_list.csv]ファイルをアップロードし、これを開きます。
表示されたURLをコピーしてメモ帳等に控えておきます。

アプリの編集画面に戻り、[ダウンロード]アイコンの[OnSelect]プロパティを以下の通り設定します。
ClearCollect(col_dl, ShowColumns(BrowseGallery1.AllItems,
DisplayName, Department, JobTitle, OfficeLocation, mobilePhone, Mail
));
Set(json_dl, JSON(col_dl,JSONFormat.IndentFour));
UpdateContext({localResponse:PowerAppV2メンバー一覧.Run(json_dl)});
Launch("https://xxxxxx.sharepoint.com/:x:/r/sites/xxxxxx/_layouts/15/Doc.aspx?sourcedoc=%xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx7F%7D&file=member_list.csv&action=default&mobileredirect=true");
なお、この段階ではエラーの赤波線が表示されますが、この後フローを作成すれば解消します。
また、右側[プロパティ]の[詳細>Tooltip]を"表示データのダウンロード"に変更します。

左端の[・・・]アイコンを選択し、[Power Automate]を選択し、[フローを新規作成する]を選択します。
[+ 一から作成]を選択します。

先にフロー全体を示します。
PowerAppsアプリからjson型の出力データを受け取り、JSONの解析を経てCSVテーブルを作成し、SharePointドキュメント上のCSVファイルに出力する処理になります。
また、フロー名は[PowerAppV2メンバー一覧]としました。

この後、各ステップの設定内容を紹介します。
[PowerApps (V2)]ステップでは、[入力の追加]からテキストを追加し、変数名を[json_dl]とします。
[JSONの解析]ステップは以下の通りです。
- ステップの種類:[組み込み>データ操作>JSONの解析]
- コンテンツ:json_dl(前のステップで定義した変数)
- スキーマ:{
"DisplayName": "DisplanName",
"Department": "Department",
"JobTitle": "JobTitle",
"OfficeLocation": "OfficeLocation",
"TelephoneNumber": "TelephoneNumber",
"Mail": "Mail“
}

[CSVテーブルの作成]ステップは以下の通りです。
- ステップの種類:[組み込み>データ操作>CSVテーブルの作成]
- 開始:本文(前のステップの[本文])
- ヘッダー:出力ファイル時の項目名
- 値(式):item()?['xxxxxx']
また、ステップ名の”CSV”と”テーブル”の間のスペースは除去します。除去しないと次のステップの設定で正しく動作しません。

[CSVテーブルの作成]ステップについて、一点補足します。
一度フローを保存して閉じ、再度開いた時、値の見た目が変わります。JSON内の項目が認識され、当初設定した式が表示されなくなります。別の項目に変更したい場合等は、一つ前の画面のように、item()?['xxxxxx']のように式を記述しなおす必要があります。

[ファイルの作成]ステップは以下の通りです。
- ステップの種類:[標準>SharePoint>ファイルの作成]
- サイトのアドレス:CSVファイルを置いたサイト
- フォルダーのパス:CSVファイルを置いたフォルダーのパス(この例では/Shared Documents/General)
- ファイル名:CSVのファイル名(この例ではmember_list.csv)
- ファイルコンテンツ(式):concat(decodeUriComponent('%EF%BB%BF'),body('CSVテーブルの作成'))

右上のアイコンからフローを保存して閉じ、アプリの編集画面に戻ります。

アプリ編集画面右上の[保存]アイコンを選択し、[公開]アイコンを選択します。
[このバージョンの公開]を選択します。
左上の[戻る]を選択し、アプリの編集を終了します。

おわりに
以前紹介したPowerPlatform関連のアプリよりもシンプルなアプリでしたが、コンボボックスによるギャラリー検索やファイル出力といった、実務でニーズがありそうな要素を含めて紹介しました。
メンバー照会機能としては、Microsoft Entra IDの項目だけでは不十分な組織もあるかと思います。不足項目を含めてSharePointリストやDataVerse等でデータを保持し、編集機能を設けて入力補助としてMicrosoft Entra IDの項目を取得できるようにするなど、今回のアプリをベースに発展させても良いでしょう。
当ブログ内の連載記事