PowerAutomateでSPOのPV・UUを取得する

PowerAutomateによるフロー作成をしていると、SharePointにも触れる機会が増えます。そしてその逆もまた然りです。
いずれもO365に統合され、PowerAutomateはMicrosoft社が展開するPowerPlatformを構成する製品として組織の業務効率化の基軸、SharePointはTeamsのチームと連動して作成されるチームサイトの機能を提供して組織のニュースやファイルの管理の基軸となるからです。

# Problem

ところで、PowerAutomateで提供されているSharePoint系のアクションはいろいろありますが、SPOで構築されたサイトの利用状況（アクセス情報）を取得するためのアクションは今のところ提供されていません。

それでは以下のような情報を取得するにはどうしたらよいのでしょうか？

- あるニュース（ページ）のPVやUU
- あるニュースの「いいね」数やコメント数
- あるサイト全体のPVやUU

# Solution

"SharePointにHTTP要求を送信します" を利用して、SPOが公開するWebAPIから情報を取得します。
実のところ後述の「URI」の内容は、私自身、他の記事を参考にしつつトライ＆エラーで行き着いたもので、「どうしてこうなる？」「過不足がないか？」という質問にはお答えすることができません・・・。

## あるニュース（ページ）のPVやUU

まずニュースやページ個別のPV・UUの取得方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/cd7be38d-0916-889a-6551-f94dba6ae8bb.png)

- 「サイトのアドレス」には情報収集対象のサイトを設定します。
- 「方法」は「GET」です。
- 「URI」には `_api/search/query?querytext='path:https://www.example.com/path/to/site/SitePages (IsDocument:True OR contentclass:STS_ListItem)'&sortlist='ViewsRecent:descending'&selectproperties='Title,ViewsLast7Days,ViewsLast7DaysUniqueUsers,ViewsLastMonths1,ViewsLastMonths1Unique,ViewsLastMonths2,ViewsLastMonths2Unique,ViewsLastMonths3,ViewsLastMonths3Unique,ViewsLifetime,ViewsLifetimeUniqueUsers,Path'&RowLimit=1000&trimduplicates=false` という要領でPV・UUを取得するためのクエリを記載します。
- `www.example.com/path/to/site` の箇所は情報取得対象サイトのURLを指定してください。
- 「ヘッダー」は `Accept` の `application/json;odata=verbose` を記入します。

`ViewsLast7Days` や `ViewsLast7DaysUniqueUsers` という項目名には集計対象期間に応じて多くのバリエーションがあり、[こちらのブログ記事](https://tantumpoint.wordpress.com/2017/10/03/sharepoint-search-get-usage-data-from-search/) でそれらをまとめてくれています。
末尾に `Unique` や `UniqueUsers` が付く項目が期間ごとのUUで、それ以外が期間ごとのPVです。

## あるニュースの「いいね」数やコメント数

続いて、ニュースやページ個別の「いいね」数やコメント数の取得方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/fb487df3-2ffe-e2ab-5646-2a67b8c40e3f.png)

- 「サイトのアドレス」や「方法」「ヘッダー」は先ほどと同じです。
- 「URI」には 「いいね」数の場合 `_api/web/lists/GetByTitle('サイトのページ')/items(id)/likedBy?$inlineCount=AllPages` を指定します。
- コメント数の場合は `_api/web/lists/GetByTitle('サイトのページ')/items(id)/Comments?$expand=replies,likedBy,replies/likedBy&$inlineCount=AllPages` を指定します。
- いずれの場合も `id` には "複数の項目の取得" アクションで取得できるページのIDを指定します。

## あるサイト全体のPVやUU

最後に、あるサイト全体のPVやUU（サイト単位のPVやUU）の取得方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/03da29cd-682a-d8d9-4475-2ce53950f302.png)

- 「サイトのアドレス」や「方法」「ヘッダー」は先ほどと同じです。
- 「URI」には `_api/v2.1/sites/siteId/oneDrive.getActivitiesByInterval?startDateTime=dateTimeA&endDateTime=dateTimeB&interval=day` を指定します。
- `dateTimeA` と `dateTimeB` にはISO8601形式（例： `2021-11-15T03:00:34.1163617Z` ）で取得対象期間の日時を指定します。
- `interval` には `hour` や `week` や `month` も指定できるようです。
- `siteId` には取得対象サイトのIDを指定します。サイトのIDは[こちらの記事](https://qiita.com/teracy164/items/b9c19d1928ba5ba092dc)で解説してくれているように3つの文字列をカンマで連結したかたちになっています。例えば `exmaple.sharepoint.com,07a6be8b-aaaa-bbbb-cccc-0411a6d6ab61,152d6fdc-aaaa-bbbb-cccc-c2b941d2f797` というように。
- 対象サイトのIDを知るために私が採った方法は、「サイトの利用状況」ページをブラウザで開き、そのページの表示時に行われているAjaxリクエストの宛先URLを確認するという方法でした。泥臭すぎて恥ずかしい。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/baaa5d43-f260-390c-ae8d-e4982a8633d8.png)

WebAPIから返されるJSONの中で `actionCount` がPV、 `actorCount` がUUです。