Power Automateで会議室メールボックスの予定を取得して稼働率を可視化する


# はじめに

時々、Outlook/Exchange の会議室の予定を取得して、どれくらい利用されているか可視化したいという相談をいただくことがあります。

試しに、こんな感じで Power Automate で会議室メールボックスに接続して情報を取得して、SharePoint リストに格納して、Power BI で可視化してみました。そのため、今回は、こちらの方法について紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/447c362e-d44c-d9f8-229b-d4ca0e42294f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/549804aa-708f-db90-5aa1-e532c3501189.png)

# 事前準備

## 会議室メールボックスの作成、権限変更

まず、会議室メールボックスを作成します。もちろん、既に使える会議室メールボックスがある場合は、作成する必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c0504307-35df-020a-263d-12cb4fed0692.png)

次に、会議室の予定を取得するために、予定表フォルダーにアクセス権を付与します。今回利用する Power Automate のアクションで会議室のメールボックスの予定を取得する場合、取得するユーザーに対して、Reviewer 以上の権限を与える必要があります。PowerShell で以下のコマンドを実行することで、会議室メールボックスの予定表フォルダーに Reviewer の権限を付与することができます。

```
Add-MailboxFolderPermission -Identity TestRoom1@example.com:\Calendar -AccessRights Reviewer -User masumoritakashi@example.com

Add-MailboxFolderPermission -Identity TestRoom2@example.com:\Calendar -AccessRights Reviewer -User masumoritakashi@example.com
```

このコマンドにより、指定したユーザーに会議室の予定表フォルダーへの Reviewer 権限が付与され、Power Automate を使用して予定を取得できるようになります。

なお、コマンドを実行するためには、Exchange に対する権限が必要で、基本的に一般のユーザーの方に許可されていない操作のため、もし前提条件を満たしていない場合は、管理者の方に依頼する必要があります。

もし、以下のように、会議室メールボックスの予定をダブルクリックして、本文まで表示できる場合、Reviewer 以上の権限があると判断できます。その場合、上記コマンドの実行は不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0262fed5-dd90-146e-ade8-46802abb3cc5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/101a7737-3d66-2a8e-d95b-a5ec69ad938a.png)

## SharePoint リストの作成

データを蓄積する SharePoint リストを作成します。

まず、予定を取得する対象の会議室メールボックスの一覧を格納するリストを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/920ccbcf-cd92-df5c-47da-162063176ea0.png)

次に、予定を格納するリストを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/14fd1421-b3d4-398b-a019-d609a9642ee9.png)

あと、月ごとの稼働時間に関するリストを作成しておきます。
今回は、12 時間 × 20 日辺りで 240 時間の仮データを入れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/05594f68-3711-edba-5790-0d4ea47df074.png)

# Power Automate フローの作成

メインとなる Power Automate のフローを作成します。
いつフローを動かしてどの範囲の予定を取得するかは実際の運用によって違うと思いますが今回は、予定を入れている未来の期間の予定を取得しようと思います。

こんな感じで、取得したい月の初日の 9 時から次の月の初日の 9 時までの日時を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/530fce97-ea8d-db3e-be50-8a905c822c9e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1d7c3aa7-c7dc-ee8f-8425-3fc18f9c1861.png)

```
formatDateTime(
startOfMonth(body('時間への追加_来月')),'yyyy-MM-ddTHH:mm:ssZ')
```

```
formatDateTime(
startOfMonth(body('時間への追加_再来月')),'yyyy-MM-ddTHH:mm:ssZ')
```

次に、会議室メールボックスのリストから情報を取得し、会議室メールボックスごとに予定を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/217bf665-5d0f-4211-5292-b81d74aa0e78.png)

```
https://graph.microsoft.com/v1.0/users/@{items('Apply_to_each')?['Email']}/calendar/calendarView?startDateTime=@{outputs('作成_月初日')}&endDateTime=@{outputs('作成_月末日')}
```

一度フローを実行し、結果の Body をサンプルに使って [JSON の解析] をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/96ea51f6-3b75-9d06-3869-e09204c0711d.png)

最後に、解析した結果を基に、 SharePoint にデータを保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/27e92ee6-9ef3-af19-7cfe-392ce0b34e52.png)

こんな感じでデータが保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5d326361-2ba9-10c5-071c-7358ebfc421e.png)

# Power BI レポートの作成

最後に、SharePoint リストに蓄積した情報を基にレポートを作成します。

こんな感じになるよう作っていきます。不要な列を削除したり、列名を変更したりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e981da68-4ca7-2189-4658-e5a1896683ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a902a5df-ca0e-6d13-3a82-a665c6553a31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/623a08bc-2ab4-61f2-b046-dd57cd6855bc.png)

リレーションシップはこのような感じです。Meeting Info のテーブルにも年月で紐づけるための列を作っておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0bfe5f59-e5db-8f3c-4ee3-7ab369d14b06.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/03763b93-d517-8121-de18-d07d6a8efd9f.png)

会議時間が UTC になっているため、日本時間に変更しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ada1e2ee-e3f1-144c-b069-440f71d0f6a0.png)

開始時間と終了時間を基に、会議の時間を算出します。Power Automate の方でもできますが、Power BI の方が簡単と思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5cdf7751-db9f-3803-8b55-39381f7100c1.png)

こんな感じで、会議を何時間実施したか分かります。終日の予定として数日予定を入れている場合は、上記のように、24 時間 × 日数となります。稼働時間を 8 時間 × 日数にしている場合、稼働率の計算に影響が出そうなので、なるべく終日の予定にせず利用する時間帯だけ予定を入れておいた方が良いと思います。ただ、ざっくり稼働率を可視化するという意味では、そこまで気にしすぎなくてもいいかなと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/049a5f92-5339-6f5f-f7bc-29fabf3e26a8.png)

最後に、会議時間の合計を基に稼働率を算出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e4f7cbf4-0039-4f6f-c956-bc0949e47a48.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e2383aeb-fe87-27c3-4a53-b269931981d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0e448621-9355-e525-41b8-9beb94310192.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8876d839-196a-efd1-0323-651e395271a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e201d81a-9751-40fd-4e91-c015e0357abe.png)

# まとめ

Power Automateで会議室メールボックスの予定を取得して稼働率を可視化する方法について紹介しました。

同じようなことをしようと思っていた方は参考にしていただけると幸いです。