PowerAutomateを使ってSharePointListsの変更履歴を記録する

# はじめに
SharePointLists（以下リスト）を使ってチーム内のタスク管理をしようとしたときに、リストの変更履歴を別のリストで管理できたら便利だよなぁ。という意見がチーム内で出たので、実装してみました。

そもそもリストは以下のように各項目がバージョン管理されており、すぐに更新前のバージョンに戻すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/79013f3c-4b08-19c0-999b-012970f851df.png)

今回は、このVersion historyのデータをAPIを使って引っ張ってきて、変更履歴用のリストに記録するというフローをPowerAutomateで作ってみます。

# 変更履歴リスト
変更履歴保存用のリストは以下のように作りました。
**いつ、だれが、なにを、どのように変更したのかわかるように**データを格納できるように作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/f2e7e0f0-8ea8-51b2-1c29-983916c255b8.png)

こちらのリストにPowerAutomateでデータを格納していきます。

# PowerAutomateでフローを作っていく
### 新規に空白のフローを作成
トリガーは「アイテムが作成または変更されたとき」を使用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/7420ca4c-87f2-10b8-4b2d-d536ea627832.png)

### 「リスト変更ステータス取得」アクションで、必要な情報を取得
IDは、「アイテムが作成または変更されたとき」トリガーで取得した「ID」
以降は、「アイテムが作成または変更されたとき」トリガーで取得した「ウィンドウ開始のトークンのトリガー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/b5d73b3f-068e-8e25-ddbc-95b15c895a19.png)

### 変数を初期化
バージョンの変数は、「リスト変更ステータス取得」アクションで取得した「開始バージョン」「終了バージョン」をそれぞれ変更前、変更後の変数に格納する。
ただし、そのままバージョンだけを変数に取得しても、後述のHTTP要求の際にエラーとなるため、「リスト変更ステータス取得」で取得したバージョンを整数に直し、512を掛け算する式を変数として入れる必要がある。
**変数に入れる式**
``mul(int(リスト変更ステータス取得の開始or終了バージョン番号),512)``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/3389759e-37e5-7eba-988c-79ac66398a97.png)

### リストのVersion historyデータを取得
Version historyのデータは「SharePointにHTTP要求を送信します」コネクタを使用して取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/71140a78-1cd6-00af-2aa6-170c4ab4b426.png)
上記のような方法で、リスト変更前と、変更後をそれぞれ取得して比較するといったやり方です。
**URIには以下のように設定**
``_api/web/lists/getbytitle('リスト名')/Items(変更したアイテムのID)/versions(バージョン)``

###J SON解析
「JSONの解析」アクションで「SharePointにHTTP要求を送信します」で取得したものをJSONで解析する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/019ddeb1-2dc7-30f1-2f35-4239335f88da.png)

### リスト変更前後のデータを変数へ格納
「JSONの解析」アクションの解析結果を、リストの項目別に変数に入れていく。
（変更前、変更後それぞれ変数に入れる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/25cf9128-800d-567e-41ba-e7e684858be1.png)
>**！！注意！！**
>日時データをUTCからJSTに変換したものを変数に入れようとした際に気づいたこと。
日時データをConvertFromUtc関数でJSTに変換した値を変数に格納しようとしたところ、データがnullの場合エラーが発生したため、if関数を使用し、nullの場合は変数にnullを格納するように設定。
**タイムゾーン変換null判定式**
``if(equals(empty([JSON解析_日時データ]),True),'',convertFromUtc([JSON解析_日時データ],'Tokyo Standard Time','yyyy/MM/dd HH:mm'))``

### 各項目の変更判定とリストへデータ記録
#### 新規作成された項目の判定
変更ではなく、新規作成されたものも変更履歴に記録したい場合は、条件で、開始バージョンの値と終了バージョンの値が等しい時に変更履歴リストに記録するようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/977892f4-b186-cc7e-d584-07c4e2a73603.png)

#### 変更された項目の判定
変更の場合は、「リスト変更ステータス取得」アクションで取得した、各項目の「列が変更されています。[項目名]」がtrueの時に変更履歴リストに記録するようにする。
変更前の値と、変更後の値は、JSON解析結果を格納した変数を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/6b56b6d4-ab2c-6dee-4c4c-fee82335d1a6.png)
>赤枠部分を条件にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/8594dbcf-1b5a-b8dd-22cc-81b7c6c702eb.png)

# PowerAutomateフロー全体図
※フロー全体は縦に長いので折りたたみしています
<details><summary>フロー全体図</summary>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301050/b4b1edcf-9ad8-78e2-af0a-9b034fc82e3a.png)
</details>
# 最後に
変数が多くなり、ずいぶんと縦長のフローとなってしまいました。
もしかしたらもっとスマートにできるやり方があるかもしれませんが、変更履歴を格納する為のやり方・考え方はあまり変わらないと思うので、参考にしていただけたら幸いです。

# 参考
https://mofumofupower.hatenablog.com/entry/2020/07/28/114037

https://gnanasivamgunasekaran.wordpress.com/2016/06/10/sharepoint-rest-api-url-for-accessing-working-in-list-document-libraries-search-and-user-profile-property/