PowerAutomateでSharepointのフォルダを作成し権限自動調整
こういう小回りの聞くPowerPointのナレッジはWebでもなかなかないので、2時間くらいかかって調べたのでまとめとく。
一番大きなポイントは下の方にある「Sharepointの特定のドキュメントライブラリのフォルダーから、デフォルトでついてくるグループの広範権限を『外す』ことはできるぞ」というところ。
背景
- 社内向けの複数のプロジェクトに共通的な工数管理やリソース管理SaaS利ツールを提供してメンテナンスしている。
- そして、このツールの利用者向けポータルの建付けでMS Teamsにチームを一つ持っている
- どのプロジェクトも、ツールに溜まったデータを分析する要件があるのでこのチームの裏にあるSharepointのドキュメントライブラリに定期的にデータを自動アップロードしてあげるのも提供しているサービスの一部
- ただし、プロジェクトごとにデータを分離し参照できる人はそれぞれ設定したい
最初、プロジェクトごとにプライベートチャネルを作って、そのチャネルのフォルダにファイルを置いてあげて、プロジェクトごとのアクセス権限をTeams上でよしなに設定してあげればいいかと思ったが、、、Teamsの裏のSharepointサイトの仕様として、Privateチャネルの場合は、そのチャネル用のサブサイトを切り出す という厄介な仕様のせいで、ファイルをアップロードする側の設定が非常にややこしくなってしまう。
本題と外れるので簡単にいうと、Graph API実行用のEntra Appに対して、Sites.Selectedの権限を足すのとともに、各サイト(SiteID)単位で権限を紐つけるRSCというものが、続々と増えて行ってしまうのでプロジェクトが軽く増えるごとの手間が半端ではない。つけるだけなら簡単でも申請手続きが大変なのである。
ここで別案を考える必要が出てきた。
方針
以下をPowerAutomateで作ることで、くだらない権限調整の手作業をなくす。
- 既に、プロジェクトごとのツール環境払出申請用のListがあるのでこれの更新をトリガに
- 単一のドキュメントフォルダに、プロジェクトごとの権限設定がされたデータ格納フォルダを作る
- Listに含まれているプロジェクトの担当者情報を元に、その人達だけに権限を設定してあげる
- 普通にフォルダを作るだけだと、デフォルトでチームのMembersとVisitorsという広い権限がついてしまうのでこれを外す
最終的にできたもの
これが全身。
細かい前提
List
ツールの利用のための環境払出申請は、Listにレコード入れてね、ってことにしてある。
その時に、一意の文字列を適当に決めてもらうことと、担当者、承認者を設定してもらっている。
ポイントと実装
PowerAutomateでの「新しいフォルダーを作成」は重複チェックしなくてもエラーにならない!!
使い方自体の解説は簡単なので省略するが、掲題の通りの挙動をする。既に同名フォルダが存在していても普通に処理をスキップして "Succeeded"になってくれる。
こういうのがコーディング経験者ほどPowerAutomateが苦手に感じる典型。エラー回避とか調べて仕込んでそのあとに気づいて、なによもう、ってなる。
フォルダのメタ情報をとるやつは、たぶん必要
PowerAutomateのSharepoint向けアクションを眺めて「あーたぶんGet FolderしてからGrant access to an item or a folderっていうこれ使うんやろな 」って思ったら、Get Folderというアクションそのものはない。
ここはGet folder metadata using pathというやつを使ってそのフォルダの背番号を取得するので成功。
権限の付与
Grant access to an item or a folderのノードを作って、IDには前項で取得した情報からbody/ItemIdを入れればよい。body/Idではない。Recipientsの方は、複数指定とかで一発で行けるかな、と欲張るとまたトラブルシュートがめんどくさそうだったので、一人ずつEmail項目を渡してあげると割と素直に動く。
権限を外す方
これが既存のフローでは実装ができない。ChatGPTに聞くとSharepointにHTTPリクエスト飛ばせばいいじゃんって意味不明のことを言ってくるが、これがなんと、できてしまった。
Send an HTTP request to Sharepoint という、Sharepoint REST APIを好きなように実行するヤンチャなノードが作れる。MethodはPostを選び、Uriのところに
_api/web/Lists('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')/GetItemById(@{outputs('Get_folder_metadata_using_path')?['body/ItemId']})/UpdateDocumentSharingInfo
とし、下の方の Advanced Parameters のところにHeadersとして
Accept: application/json;odata=verbose
Content-Type: application/json;odata=verbose
Bodyを追加して
{
"userRoleAssignments":
[
{"UserId":"<TeamやSharepointの名前> Members","Role":0},
{"UserId":"<TeamやSharepointの名前> Visitors","Role":0}
],
"validateExistingPermissions":false,"additiveMode":false,
"sendServerManagedNotification":false,
"customMessage":null,
"includeAnonymousLinksInNotification":false,
"propagateAcl":true
}
というのを突っ込んでみる。
すると、、、このスクショは実行前だが、普通にフォルダを作ったときには上位から継承されて「Owners(2行)」「Visitors」「Members」とデフォルトで入る、この下の2行分を消すことができた。
これで要件を満たす自動化になった。Listの担当者は自由に各プロジェクトの人が更新していいことになっているので、緩めではあるものの、各プロジェクトごとに必要な人だけにフォルダのアクセスができる状況が、ハンズフリーでListと連動し続ける。
Discussion