SharePoint Online と"いいね"機能を使ってなんちゃって未読既読管理をする

SharePoint Online で、カスタムリストのアイテムをお知らせなど通知したい情報として扱っていると、その未読・既読を管理したいという要望はよくあると思います。
今回は"いいね"を"既読"と読み替え、リストビューと評価機能を組み合わせ、いいねしたデータだけが表示される"既読ビュー"、いいねしてないデータだけが表示される"未読ビュー"を作り、なんちゃって未読既読管理機能を作ってみたいと思います。

# 出来上がりイメージ
![qiita20210425.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/3ba0f9dc-9fce-46c1-d4af-c426d0f01e27.gif)

# 手順
1.リストの作成と評価の設定
2.既読用リストビューの作成
3.Power Automate を使って未読用リストビューの作成 
4.Power Apps と Power Automate を使って閲覧時の既読処理の設定(任意)

# 1.リストの作成と評価の設定
まず、サイトを作成し、リストを作成します。

- 以下のサイト作成します。
※作成するサイトはチームサイトにしておくと、評価の設定がGUIから設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/3b6b75c1-d38b-8b92-dbe9-5f0d7973671f.png)

　サイト名:IINEView
　リスト表示名:お知らせ
　リスト内部名:NoticeList

- 次に、リストの設定から、評価の設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/7c3d1132-704a-0336-ebb7-93e8249fbbaf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/a58765bf-edb2-9ebc-e1ac-ea0efee6c1f0.png)
以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/18444bff-9c1f-bbc2-cdd1-92f6a87cd7c1.png)
元の画面にもどってみると、"いいね"が作成されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/8e6a4426-ee3c-be7c-c8d2-ef4fe28fd5ef.png)

- 最後に、以下の列を追加して、いくつかサンプルデータを入力してリストの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/21d5cabd-93a7-a62c-7814-c287a37f16a4.png)

　表示名:詳細
　内部名:Detail
　種類:複数行テキスト

　表示名:公開日
　内部名:PublishDate
　種類:日付と時刻

　表示名:重要度
　内部名:Importance
　種類:選択肢


# 2.既読用リストビューの作成

次に既読用リストビューを作っていきます。
まずは基準となる全件、かつ公開日時が現在時刻より前のものを表示するビューを作成します。

- "新しいビューを作成する"から、AllViewというビューを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/2f450a35-bb20-5433-9b68-c6e18e0d36e7.png)

- 次に、"現在のビューの編集"で、下記のようなフィルター条件を設定します。
また、ビューの名前を全件表示ビューに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/d1f3c701-ed44-e930-55cd-7bb02f3b0ede.png)

- 最後に列の順番を好きに並べ替えて、"ビューに名前をつけて保存"で全件表示ビューを上書きすると、以下のような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/cd441634-193d-1715-603a-5126831165dc.png)

これで、基準となるビューの作成が完了です。
次はこのビューをコピーして設定を追加することで、既読用リストビューを作成します。

- まず"ビューに名前をつけて保存"でReadViewを作成し、その後名前を既読表示ビューで上書きします。
全件表示ビューも同じですが、このビューを見るといつの間にか、いいねと評価したメンバーという列ができています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/b5c857c6-9b1e-d832-1822-cf671e2bc729.png)

- これをフィルターしようとすると、以下のように表示されますので、ここで"@自分"を選択して適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/6f254166-2e68-02de-709b-c7b53e9e0d77.png)
すると、以下のように表示されますので、"ビューに名前をつけて保存"で既読表示ビューを上書きします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/6f3aaa56-d6cf-4849-7116-10a3a56fa085.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/83485317-4ce1-b659-b431-fc4eb58b739f.png)

これで、いいねしたデータだけが表示することができました。

# 3.Power Automate を使って未読用リストビューの作成

次に未読用リストビューを作っていきますが、こちらは少し工夫が必要になります。
先ほどと同様に、ビューをコピーしてみ用リストビューを作成するのですが、以下のようにビューの設定を見てみると、先ほどのフィルタ条件はビューの設定値に現れず、直接編集できないようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/b9b985c5-bc0a-9dad-bc44-37a50edc8b84.png)

ですので、Power Automate を使って、Viewを直接編集する手順になります。

- まず"ビューに名前をつけて保存"でUnreadViewを作成し、その後名前を未読表示ビューで上書きします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/791bbf45-de08-fa52-76d6-ace4db1e97b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/41588eff-90db-2f99-b939-5d980895a274.png)

- 次に Power Automate から以下のようなフローを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/0abf0790-cdaf-7f19-4459-f9b782545573.png)

- フローの編集画面では、"SharePoint に HTTP 要求を送信します"アクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/0d1b92c1-4c5a-c18d-adfa-68c5c4e62d6a.png)
以下の値を設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/86b68dbe-487a-008d-a5d3-2f74a8dec417.png)
サイトのアドレス : 対象のサイトを指定
方法 : GET
URI : _api/web/lists/getbytitle('{対象のリストの表示名}')/views/getbytitle('{対象のビューの表示名}')/ViewQuery
URI(例) : _api/web/lists/getbytitle('お知らせ')/views/getbytitle('未読表示ビュー')/ViewQuery
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/7c0029be-eed1-f0fc-09eb-e2dd9639e202.png)


- 設定しテストすると以下のような値が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/5597e321-2f21-140b-4108-97c6700574c5.png)

- このBodyの値をコピーして、以下のように加工します。
余計な部分の削除と、UserID とかなんとか書いてある部分を囲む、Eqの文字をNeqに変更。

```json:加工前
{
  "d": {
    "ViewQuery": "<Where><And><Eq><FieldRef Name=\"LikedBy\" /><Value Type=\"UserMulti\"><UserID /></Value></Eq><Lt><FieldRef Name=\"PublishDate\" /><Value Type=\"DateTime\"><Today /></Value></Lt></And></Where>"
  }
}
```
```json:加工後Eq→Neqに加工
{
"ViewQuery": "<Where><And><Neq><FieldRef Name=\"LikedBy\" /><Value Type=\"UserMulti\"><UserID /></Value></Neq><Lt><FieldRef Name=\"PublishDate\" /><Value Type=\"DateTime\"><Today /></Value></Lt></And></Where>"
}
```

- テスト画面から、フローの編集画面に戻って、"SharePoint に HTTP 要求を送信します"アクションの設定を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/06aeef45-6bcb-3193-015f-74308762d6d1.png)
サイトのアドレス : 対象のサイトを指定
方法 : PATCH
URI : _api/web/lists/getbytitle('{対象のリストの表示名}')/views/getbytitle('{対象のビューの表示名}')
URI(例) : _api/web/lists/getbytitle('お知らせ')/views/getbytitle('未読表示ビュー')
ボディ : さっき加工した値

- 再度テストを実行し、正常終了すれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/90e98262-cbc9-4718-9c24-05d44e62da84.png)

これで、未読表示ビューが、自身がいいねしていないものだけを表示するようになりました。


# 4.Power Apps と Power Automate を使って閲覧時の既読処理の設定(任意)

ここまででも、いいねしてもらえれば未読、既読管理はできるのですが、どうしてもいいねじゃヤダって場合もあると思います。
そのため、アイテムの詳細画面を既読にするボタンを選択すると、いいねがされるようにフォームをPower Apps でカスタムします。

- メニューからフォームのカスタマイズを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/bcad5478-fae0-6af7-b3c2-e033600c1f29.png)
そうすると以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/1647db8e-5d7c-e519-e585-ba16bb629240.png)

- フィールドの追加から、IDを選択し追加します。画面下部にIDが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/28f183a1-a327-946f-d063-6896f5e0fac4.png)

- 次にボタンを設置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/eb016237-33f3-0fde-e0df-a0906bdc697f.png)

- ボタンか Power Automate を選択し、新しいフローを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/7aa9499e-2458-6534-d382-c6e24a2637a7.png)

- Power Apps のボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/5767b323-8843-f0ef-47a3-ac2784666eb0.png)

- フローの編集画面が表示されたら、Power Apps からのアイテムIDを受け取るために、以下のような変数の初期化アクションの設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/96fa4294-19b7-2f29-183c-0edaa3de52f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/ea2c4331-0786-2c39-db11-5713a5547ae7.png)

- 次に、対象のリストのリストIDも変数の初期化アクションで設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/9aaf62e7-9e02-9a06-5514-c305fc476e6d.png)

- 次に、"SharePoint に HTTP 要求を送信します"アクションを選択し、以下の値を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/b532ff6a-b52d-935c-884c-dcdf636b7856.png)
サイトのアドレス : 対象のサイトを指定
方法 : POST
URI : _api/Microsoft.Office.Server.ReputationModel.Reputation.SetLike(listID=@a1,itemID=@a2,like=@a3)?@a1=%27@{variables('リストID')}%27&@a2=%27@{variables('アイテムID')}%27&@a3=true

- 最後に結果を応答するためのアクションを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/e91bb4ad-397c-14df-a0bb-7318ced3ed80.png)

- これで完成です。内容がわかるように名前を変更しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/4e9a7f57-14f8-c5f5-585c-fe967c14f996.png)

- 元のボタンに戻って、以下のようにフローを呼び出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/7c964f4a-1b28-5264-3b5e-457a20f9b874.png)
既読処理.Run({IDを追加したときに配置されたデータカードの値})
※あとからキャプチャしたので少しイメージが異なります。

- これで保存して公開すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/b4f761eb-1309-0294-f2a2-dbe6c7279bbc.png)
以下のようなカスタマイズされたフォームに変更されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/6f674f14-275e-3274-af4c-9f407c145df6.png)

あとはいいね列を非表示にするなど、見た目を整えてあげれば、出来上がりイメージの完成です。
今回はボタンですが、画面遷移など活用して、なにか違うトリガーで処理を動作させても面白いかもしれません。

# まとめ

"いいね"を使うメリットとしては、手軽である点と、リストアイテムに閲覧さえできれば"いいね"することができるので、リストやリストアイテムに対して編集以上の権限がなくても運用できることです。

デメリットとしては、"いいね"機能を本来の用途でないことで使っているので、アイテムやファイルの人気の傾向で勘違いされるそうなログが残るので、ご注意いただく必要があります。

あと注意点としては、3,000いいねくらいでも動くことは確認していますが、5,000とか超えるとどうなるかちょっとわかりません。
既読した一覧を出力したいとかの場合、Excel出力すれば表示できますが、Excelの限界の文字数に到達すると表示できなくなる場合があります。

カスタマイズすれば当然もっと複雑なビューも実現できますが、そこまで労力かけたくないけどってときに活用いただければと思います。
同じ考え方で、お気に入りやピン止め機能も作れたりしますので、ぜひやってみてください。