0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Power AutomateでGraph APIから得た自分がアクセスできるSPOサイト一覧のCSVファイルにする

Last updated at Posted at 2024-07-06

こんな人のための記事です

ロールを持っていないのでPowerShellからConnect-SPOServiceのようなコマンドが使えないけれど、自分や指定したユーザーがアクセスできるチームに紐づくSPOサイトの一覧を取得したいようなニーズを持つ人にお勧めです。

うまくPower Appsに組み込めば、サイト管理アプリのようなものも作れると思います。
文末のおまけに、他のユーザーが実行すると、その人のチャットに結果が届く仕組みも紹介してみます。

概要はこんな感じ

  1. Power Automateのクラウドフローで、自分がどのグループに所属しているのかIDの一覧を取得します
  2. Graph APIでグループが紐づくサイトの一覧を順番に取得して配列に記録します

ちなみに、自分がどのグループに所属しているかもGraph APIを使って取得することができますが、若干違いがありました。このあたりも違いについて書きました。

グループを調べる方法

「グループの一覧」と「自分が所有および所属しているグループの一覧」の違い

標準の中にあるOffice 365 Groupsコネクターを使います。
image.png

コネクターの中には、「グループの一覧」と「自分が所有および所属しているグループの一覧」という使えそうな2種類のアクションがありました。それぞれ実行してみて、件数を比較してみます。
image.png

私の環境の場合、結果は「グループの一覧」が14件、「自分が所有および所属しているグループの一覧」は10件でした。
image.png

ちなみに、件数を数えるには、アクションの中でlength関数を「作成」を使います。配列の数を数えています。

length(outputs('グループの一覧')?['body/value'])

Entra IDをつかってテナント内のグループ数を数えると全部でグループが14ありました。どうやら、全社はすべてのグループ。後者は自分が所属しているグループという扱いのようです。今回は後者の自分が所有および所属しているグループの一覧」を使いましょう。
image.png

Graph APIでも取得できる

余談ですが、Graph APIでも自分が所属するグループを取得することができます。みんな大好きGraph Explorerを使って確かめます。以下のエンドポイントを入力して「Run query」をクリックしてみてください。

https://graph.microsoft.com/v1.0/me/memberof?$top=100

image.png
$top=100 というのは、100件まで表示しなさいというおまじない。一定数以上はこれをつけておかないと端折られてしまうようなのでいちおうつけています。

こちらのエンドポイントも、クラウドフローに組み込んでみましょう。

get /me/memberof は、Office 365 Usersコネクターの 「HTTP要求を送信します」アクションを使って実行できます。いろんなコネクターにHTTP要求を行えるアクションがありますが、得手不得手があります。

HTTP要求はPremiumコネクターが必要と思ってしまいがちですが、Graph APIにかぎっては意外と標準コネクターで使えるものがありますので試してみるとお得です。
image.png

結果を見てみると、Groupsアクションで取得したほうは10件に対して、Graph APIだと11件取れました。
多い1件のIDをEntra IDで確認してみたところ、すでに存在しないグループIDでした。 

どうやらGraph APIでは消えたIDも覚えていて、Groupsコネクタのほうは削除されたグループを無視してくれるようです。無視してくれたほうが実態に合っていますので、こちらを使いましょう。

フローを組み立てる

JSONの中身を見て項目を検討する

自分が所属するグループの一覧から、1グループ分の中身を見てみましょう。
displayNameはグループ名です。グループ名はチーム名でもあります。
resourceProvisioningOptions は、このグループがチームに紐づくグループであることを示しています。じつは、ViVa Engageで作成されたコミュニティーや、Projectなどもチームと同じように背後にSharePointサイトを持つことができます。種類がわかるのでこの項目も取得しておきます。
createdDateTimeはグループが作成された日時。これはチームが作成された日時でもあり面白いので使おうと思います。
image.png

Apply to eachでIDごとにGraph APIでSPOサイトのURLを取得する

いよいよ、取得したIDからSPOサイトのURLを取得します。実際には以下のようなエンドポイントを使います。

https://graph.microsoft.com/v1.0/groups/グループID/sites/root

ためしに、先ほど取得したIDをつかって実行してみます。
Office 365 Groupsコネクターの「HTTP 要求 V2 を送信する」アクションを使います。
image.png

IDを直接URLの一部に組み込んで実行します。
image.png

取得できたのが以下のような値です。「webUrl」の項目でSPOサイトのURLが取得できました。うまくいきそうです。
image.png

アイテムのIDをGraph APIのサイトIDの部分に差し込んで回します。
image.png

グループの一覧ですでに取得できている3つの項目と、HTTP要求を通じて取得できた項目とを、「作成」アクションをつかってひとつのJSONにまとめました。これが1グループ分になります。
image.png
Apply to eachの内容を取得するための式は以下の通りですので参考にしてください。

item()?['displayName']
item()?['resourceProvisioningOptions']
item()?['createdDateTime']
outputs('HTTP_要求_V2_を送信する')?['body']?['webUrl']

エラーが出る場合は、波括弧の形がちがうか、各変数の後ろのカンマが抜けていると思います。

1ループごとに配列に追加する

ループの中に「作成」で要素をまとめることができましたが、このままでは1回ループが回るごとに上書きされてしまいます。ループの外に結果を持って出るには変数が必要です。

そこで、Apply to eachの前に「アレイ」型で初期化をした変数を用意します。
ループの中では、「作成」の結果を「配列変数に追加」アクションを使って、先ほど初期化したアレイ変数に入れていきます。
image.png

仕上げのCSV 出力

配列になったJSONを作成することができたので、仕上げにCSV化してSharePoint Onlineの適当なドキュメントライブラリに保存してみます。

ファイルコンテンツの直前に加えている式は、UTF-8のBOMです。これを付けておくとCSVファイルをExcelで開いたときにも文字化けしません。
image.png

decodeUriComponent('%EF%BB%BF')

このあたりの事情については、こちらの記事を参考にしてください。

resourceProvisioningOptionsは単独の配列

image.png

出力できたCSVファイルをExcelで開いてみました。良い感じに私が参加しているチームとそのサイトURLが取得できました。
ただ、よく見てみるとresourceProvisioningOptionsが配列のようになっています。値が入っていますが1つしか値のない配列のようです。値がひとつしかないなら、一つ目だけ取得したほうがすっきりします。

配列の中身を決めているのはこの部分でしたね。
image.png

2番目の式の中身を以下のようにお尻に[0]をつけて0番めの値だけを取得するように変更してやります。ただ、そのままだと配列が空の場合にエラーとなって他の値も取得できなくなってしまうため、以下のようにちょっと複雑な感じがしますが条件分けすることでエラー回避しました。

items('Apply_to_each')?['resourceProvisioningOptions']
↓
if(equals(length(items('Apply_to_each')?['resourceProvisioningOptions']), 0),'',items('Apply_to_each')?['resourceProvisioningOptions'][0])

すっきりしました!
image.png

おまけ

今回はCSV化してSPOドキュメントライブラリに保存しました。クラウドフローは実行のみユーザーを指定することで、このクラウドフローを実行した人のアカウントに対してフローを実行させることもできます。

例えば、実行すると、そのユーザーのTeamsにボットから結果が届くなんてどうでしょうか?

HTML化してトリガーを押したユーザーにチャット送信

CSVの代わりにHTMLテーブルを使います。Apply to eachから取り出したグループの配列変数を与えてやります。
Teamsの「チャットまたはチャネルでメッセージを投稿する」のRecipientには、クラウドフローのトリガーから「
image.png

ユーザーの電子メールを設定してやります。ボタンを押した人がこれでわかります。本人に送ってあげる仕組みがこれで実現できています。
image.png

実行のみユーザー設定

クラウドフローの詳細画面表示右側にある「実行のみのユーザー」の「編集」ボタンをクリックします。
image.png

実行させたいユーザーや、そのユーザーが含まれているグループを入力します。
SharePointへのCSVは管理者として保存します。チャットも管理者から送信します。チャットの送信先はトリガーのIDを使うので問題ありません。グループはクラウドフローのボタンを押したユーザーの情報を取得したいので、「実行専用ユーザーによって提供されました」を選択します。

この状態で、なんのロールも持たないユーザーにクラウドフローのURLを渡して実行してもらいましょう。

image.png

本人のチャットに、ユーザーさんが参加しているグループと、そのグループが紐づくSPOサイトのURL一覧が届きました!
image.png

 まとめ

Graph API をつかうと、用意されたアクションだけでは対応できない要望にも応えられます。HTTP要求を送信するアクションのコネクターにはいくつも種類があるので、Graph Explorerで試して使えそうなものがあれば、片っ端からどのコネクターのものが利用できるか使ってみるとよいでしょう。

実行専用アクセス許可にはグループが設定できるので、トリガーの情報もつかうと簡単なボットのように使えます。

こちらもどうぞ

Power Automateのクラウドフローについて、TIPSのような記事を書いています。
こちらも参考にしていただけると嬉しいです。
皆様良いPower Automate Lifeを!

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?