保持ポリシーが設定されたサイトでフォルダをまとめて削除する

# 概要
SharePoint Onlineのドキュメントライブラリから、特定のフォルダを選択することで開始するフローです。
選択したフォルダやその下位フォルダ、およびフォルダに格納されたファイルをすべて削除します。
## ダウンロード
zipパッケージファイルを[github](https://github.com/ksgiksg/Power-Automate/blob/main/SharePoint%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4_20220808133100.zip)に保存しています。

# 目的
以下の「ちょっと困った」をPower Automateで解決するためのフローです。
## ドキュメントライブラリへのアップロード
SharePoint Onlineのドキュメントライブラリには、エクスプローラーからのドラッグ＆ドロップでファイルをアップロードすることができます。便利ですね。

非常にお手軽なのですが、お手軽な反面、間違ったファイルをアップロードしてしまうことが時々あります。

このとき階層の深いフォルダを丸ごとアップロードしてしまった場合、このフォルダを削除するにはひと手間必要なことがあります…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/645ad520-4ae5-dda6-f961-29009337e340.png)

## 保持ポリシーについて
保持ポリシーが設定されている場合、複数のアイテムが保存されたフォルダを削除することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/abaed0c2-d830-3b7e-c8d0-ff681f7d9972.png)

ファイルや何も入っていないフォルダは削除することができるのですが、階層の深いフォルダを削除するためには、最下層から順にすべてのフォルダを空っぽにしないと削除できないので、前述の通りうっかりフォルダをアップロードしてしまった場合には非常に手間になります…。

# フローの概要
「選択したファイルの場合」をトリガーに、選択したフォルダ以下のファイル・フォルダを取得し、ファイル→下位フォルダ→上位フォルダの順に削除します。
途中で選択したアイテムがフォルダではなくファイルだった場合のエスケープ処理を入れています。
<details><summary>全体画像</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8c250385-0c28-87ea-aa2a-a35905dddbec.png)
</details>

## Triggerおよびinputsの抽出部分
<details><summary>画像</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0ce85395-253f-f7ee-d8d5-3d674905e9fe.png)

</details>
トリガーの「サイトのアドレス」「ライブラリ名」をそれぞれ、ご自身の環境に合わせて変えるだけで、他は弄らなくても良いようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8411d5ec-f32b-fbb5-f104-b6fba0c56b80.png)

トリガーやアクションのInputを取得する方法はHiroさんの記事を参考にさせていただいています。
[Power Automateの裏側をみてみよう！ (1/2)](https://mofumofupower.hatenablog.com/entry/2020/03/17/000000)


サイトアドレスやグループIDを変数として使用したい場合、ユーザーに直接入力してもらうのが簡単ではあるのですが、トリガー・アクションのInputを利用することで標準のプルダウンから選択できるので、IDのような小難しい値を調べてもらう手間がなくなるので気に入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/965c4795-cc3e-7d25-407b-33d057ae2770.png)
配布するようなフローでは特に！(∵)

## 前処理
<details><summary>画像</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/dc86a72b-d4e3-a045-8d67-a7c559cc2428.png)
</details>

ここでは選択アイテムがフォルダかどうか調べたり、選択フォルダの中のファイル・フォルダを一覧で取得、必要なプロパティのみをマップしています。

のちのアクションで、ファイルとフォルダには別のアクションを行うため、フィルター処理して2つにわけることもしています。

:::note warn
注意
「ファイルの取得 (プロパティのみ)」で取得できる件数には上限(5000件)があります。
上限を超える場合は少し下位のフォルダを選択するなどして再度実行してください。
:::
## ファイル削除の実行
<details><summary>画像</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/19389d09-b0f6-5cf9-7a76-df714a9d257b.png)
</details>
特に説明はありません。

フォルダと違い、ファイルには下位アイテムが存在しないため、特に順序を気にせずに削除することが可能です。

## フォルダ名でソート
<details><summary>画像</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/9d8f1442-9451-4734-e65a-8c410156fbd4.png)

</details>

フォルダパスの文字数が長い順に配列を並び変えています。
下位フォルダを含むフォルダ全体への処理は、再帰処理を使うのが一般的だと思うのですが、単一のフローで自信を再帰させることはできないため、再帰以外の方法をとる必要があります。
(ソリューションで子フローを呼び出せばできるのかな…？)

再帰を使わない方法として、パスが長い順に削除することで、下位層のフォルダから削除することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/45e94d49-09c8-4b31-b1ac-c9c11d51fb81.png)

尚、Power Automateでは標準でソートを行うメソッドが存在しないため、こちらの方法を使用しています。
[How to implement Sort with Microsoft Flow in 3 actions within a loop](http://johnliu.net/blog/2018/12/how-to-implement-sort-with-microsoft-flow-in-3-actions-within-a-loop)



## フォルダ削除の実行
<details><summary>画像</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/baa6316e-3a1d-12ae-f1f0-abcff3f80d1e.png)
</details>

並び替えができたらあとは順に削除します。
フォルダを削除する標準アクションは現時点ではありませんので、HTTP要求から実行します。
[REST を使用してフォルダーとファイルを操作する](https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest)
　

　


解説は以上です！