Teams会議のレコーディング有効期限を変更するPower Automate フロー

# はじめに
Team会議をレコーディングした時に保存されるファイル、何日か経つと自動で削除されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/40895762-9a42-0a25-1b1e-0eaebc228de2.png)

動画ってサイズが大きいので、容量を圧迫しないための対策かと思います。
組織によっては設定を変えているところもあると思いますが、既定では120日で削除されます。

https://learn.microsoft.com/ja-jp/microsoftteams/meeting-recording#expiration-policy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/08b493a4-3abb-7733-2ef1-92a17207e978.png)

この設定が長すぎる！もしくは、短すぎる！あるいは、消さないでほしい！という人のために、自動で有効期限を変更できるように、Power Automateで変更する方法を探してみました。

# 方法
SharePoint REST API を使用することで変更できるようです。
実際にブラウザ操作した時のリクエストを、開発者ツールで見ることで確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/8ce398c3-ce39-115c-116c-91d146a64238.png)

Power Automate の標準アクションに、`SharePoint に HTTP 要求を送信します`というアクションがあるのでこちらを使用していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/801786ae-503c-1f1f-0636-f30ee2b72741.png)

## リクエスト形式
`POST`で以下のようにリクエストを送信します。

```plaintext:URI
_api/web/GetFileByServerRelativePath(DecodedUrl=@url)/SetExpirationDate?@url={ファイルの相対パス}
```

```json:body
{"expirationDate":"yyyy-MM-ddTHH:mm:ssZ"}
```
日付は単純に ISO 8601 形式 ですね。
ちなみに、有効期限を削除（自動削除されないように）するには、日付の部分を`null`にします。

```json:body
{"expirationDate":null}
```

`GetFileByServerRelativePath`の部分はファイルを特定できれば良いので、下記リファレンスのように`GetFolderByServerRelativeUrl('/Folder Name')/Files('{file_name}')`や、`GetFileByServerRelativeUrl('/Folder Name/{file_name}')`でもよいと思います。

https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest

今回は実際に使用されている形式に合わせて、`GetFileByServerRelativePath`を使用します。
この形式の場合、URI末尾の`?@url={ファイルの相対パス}`にファイルを特定するためのパスが必要になります。


# OneDrive for Business の場合
少し前から仕様が変わって、会議のレコーディングは、レコーディングを開始した人(ボタンを押した人)ではなく、その会議の開催者のOneDrive に保存されるようになりました。
なので、このフローは自分が開催者である会議向けのフローになりますね。
(通常、他の人が開催した会議のレコーディングを編集する権限はないと思います)

ファイルのプロパティが取得できればなんでもいいんですが、今回はトリガーを`選択したファイルの場合`にして手動でフローを実行しようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/b31dd0b1-0ba6-c35b-dbda-2a9043a386ab.png)

トリガーの時点で、有効期限に設定したい日付の入力もしておくことにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1b9d8463-7b21-7091-946e-e6c85e68068c.png)

フロー全体はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ded72a2a-4b0d-a3af-5d2f-4618cd085536.png)

最終的にSharePointコネクタでHTTPリクエストを送りたいので、自分のOneDriveのサイトURLが必要です。
`マイ プロフィールの取得 (V2)`で`個人用サイト`が取得できるので
、これを使いましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/70190e4f-f398-b1d9-67fa-6d5fd1a36dfe.png)

続いて、有効期限を日本時間からUTC標準時に変換しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/c9d814ee-3f91-2f7c-43a7-25915db08a48.png)

最後に、必要なファイルの相対パスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f9e2200c-daed-8957-39cc-7cdd1c12149f.png)

個人用サイトのアドレスから必要な部分を取り出し、ドキュメントライブラリを示す`Document`、続いてフォルダ名・ファイル名と続きます。
これらの文字を`'`(シングルクォーテーション)で囲むと相対パスが作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e0ebcf85-3bca-8021-509f-358f62151c15.png)

フォルダ名・ファイル名はトリガーの`filePath`として取得できているので、残りの部分を個人用サイトを`/`で区切ったりつなげたりいい感じに処理して作成します。

```plaintext:作成
'/@{join(skip(split(outputs('マイ_プロフィールの取得_(V2)')?['body/mySite'],'/'),3),'/')}Documents@{triggerBody()?['entity']['filePath']}'
```

揃えた情報を使ってリクエストを送信すれば完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5096d897-abc7-b10e-8acd-fd192e794057.png)


# SharePoint(チームサイト)の場合
チャネル会議の場合はチームサイトのチャネル名フォルダの中にレコーディングが保存されます。

こちらもはトリガーを`選択したファイルの場合`にして手動でフローを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/af119456-35c1-1cdd-a481-3a4e70daff53.png)

フロー全体はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/49dd438c-ad77-3601-f9b4-fc765ed90331.png)

こちらもトリガーで日付を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a74bf843-719f-c3ff-f066-555cbdac57b9.png)

トリガーで指定したサイトアドレスやライブラリ名はこの後でも使用するので、汎用性を意識して変数に格納しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/521a8e3b-9a0d-3ec8-2a5c-fc91337a1f5c.png)

```plaintext:変数を初期化する：siteUrl
@{trigger()?['inputs/parameters/dataset']}
```
```plaintext:変数を初期化する：driveId
@{trigger()?['inputs/parameters/table']}
```

トリガーの出力だけでは情報が不足していたので、追加で`ファイルのプロパティの取得`をしておきます。相対パスに必要な情報を取得しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/ac80eb12-77c1-7238-7541-5dd8e3992768.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/58b4f33a-c950-304e-1a48-c620a142b973.png)

取得した`完全パス`や、サイトURLを使っていい感じに処理して作成します。
```plaintext:作成
'/@{join(skip(split(variables('siteUrl'),'/'),3),'/')}/@{outputs('ファイルのプロパティの取得')?['body/{FullPath}']}'
```

リクエストを送信して完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5b1cbae2-ebff-ba03-4528-460c00840ba5.png)

# おわりに
方法の解説として、手動トリガーを使ったフローを作成しました。
他にも、例えば`ファイルが作成されたとき`をトリガーにして、定期的なチームのチャネル会議の録画の有効期限を変更することもできると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/65668e2b-7259-f66f-7ab4-17771d11bee4.png)

次回は、前回記事と組み合わせて、自分が参加したすべての会議の録画有効期限を変更するフローを作成しようと思っています！

https://qiita.com/ksgiksg/items/8a455d3fd75127d8d4f7