PowerAutomateでグループのメンバー一覧をExcelに出力する

## 利用者を台帳管理したいようなニーズにいかが？
Microsoft365ではグループを使って色々なものを管理しています。時にはそういうグループの一覧をExcelなどのファイルに出力して管理したいということもあるでしょう。ある業務システムを利用できるユーザーを、メールが有効なセキュリティグループをつかってコントロールしていて、グループへのメンバー追加はユーザーにまかせているけれども、利用者台帳を別に表として管理しておきたいというようなニーズはありそうです。今回は、PowerAutomateを使って試してみます。

## グループのIDを用意する
いちばん馴染みが深いのは、Teamsでチームを作った時に自動的に作成されるMicrosoft365チームでしょう。それ以外にも配布リスト、セキュリティグループなどがあります。
PowerAutomateではメンバーを取得したいグループの「グループID」を利用します。一番簡単なのはMicrosoft365管理センターから利用したいグループの画面を開いた時に、その画面のURLの中に表示されています。セキュリティグループの場合は「GroupDetails/」とう表示の後ろにある部分です。Microsoft365グループの場合は「TeamDetails/」に表示されているグループIDをあらかじめ取得しておきます。
![スクリーンショット 2024-02-03 12.05.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/7b9894c6-7597-95d8-85a5-71b56d44884b.png)
## Excelで２つのテーブルを用意する
取得したいグループのIDを記載した「取得グループ」テーブルと、結果を出力する「メンバー一覧」テーブルを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/70aebffb-09c1-8011-3d1f-b9613c511911.png)
## グループIDをアクションに渡す
Excelに用意した「取得グループ」を「表内に存在する行を一覧表示」アクションを使って取得し、ループを使ってひとつずつ「グループ　メンバーの一覧を表示」アクションに渡します。
Apply to eachのなかで取得しているので、その中身から「取得グループID」だけを取り出すには、このように式を入力します。
```
item()?['取得グループID']
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/b5cf0435-f772-a0b0-a6a2-b3e1752125dc.png)
いちどテスト実行してみると、グループに参加しているメンバーの名前やメールなどの情報が取得できたことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/c6348b79-aec4-3871-0647-7dfca6f2f75c.png)
あとはExcelのテーブルに書き出してやるだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/c3ba5dbf-76f4-9fb0-e004-c8d6d84dc159.png)
実行してみると、メンバーなどの情報が一覧に書き出されました。あらかじめ複数のグループの情報を一度に取得できるようにしてあるので、右側の取得グループIDを増やせば、自動的に左に出力されるリストも増えいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/d2032e86-7548-6733-0e16-3f7cd7e30df8.png)

## 実行するたびにユーザーが増えていく（涙）
成功によろこび、嬉しくなって再実行してみるとすぐに気がつきます。実行するたびに同じユーザーが増えていくと・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/2e4510af-245d-9a25-3ff2-6d90ef2173c3.png)
これではグループの中身を表す一覧としては使えないので、テーブルに追加する際に、同じユーザーがいなければ追加。いれば追加しないという処理が必要そうです。
まず、ひとつめのループに、メンバーリストを取得する「表内に存在する行を一覧表示」アクションを追加しました。フィルタークエリにこのループの１回ごとに、メンバーリストの中から１グループずつにフィルタをかけて取り出します。こうすることで、複数のグループに同じメンバーが存在した場合にも判定がしやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/24ca4a09-0d97-1589-a083-004ce5d04cc6.png)
こんどは、取得したメンバーを「選択」アクションをつかって配列にしてやります。「選択」はマップモードに切り替えてから、図のように指定して使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/4a03472a-a78a-aa0b-d4e5-f69b0783996c.png)
ユーザーリストを以下のように整えてからテスト実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/4bb62451-a0bc-f4ea-a4be-4b78d747b923.png)
あらかじめフィルタリングされたユーザーの一覧が、配列になっていることがわかります。これで、存在するかどうかの判定がしやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/c30c5b33-8516-912e-dcad-82ff1fd5b48e.png)
ここまでできれば、あとはメンバーリストに行追加する際に、そのリストにすでに追加しようとしているメンバーが含まれているかどうかを判定できます。「条件」をつかって、含まれていない場合にだけ行を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/724760b2-3c27-11b3-ff3b-5b7019cebb2e.png)

## 最後に動作確認
最後に複数の取得グループIDをリストに追加して実行。ちゃんと重複せずにメンバーを取得することができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/605b50ba-ce86-220b-5f18-036f77c06ddc.png)