Power Apps で Outlook の予定表に予定を登録しよう


# はじめに

例えば、Power Apps でトレーニングを管理するアプリを作成したとします。
この際、トレーニングの管理者がアプリでトレーニングを作成して公開する際、トレーニング管理者の予定をおさえておくために、Outlook の予定表にもデータを登録しておきたいというニーズがあるとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4fac91a8-1459-1c4e-f596-572f3f87919f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e00f0816-aa30-8f0c-d4ed-e53b31ce6402.png)

今回は、こちらのシナリオをベースに、Power Apps で Outlook の予定表に予定を登録する方法を紹介します。

# Outlook コネクタの利用

まず、Power Apps で Outlook コネクタに接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6c5a71e1-bd5e-3e1b-0bd2-cb01863c38d2.png)

# Power Apps で自分の予定表の ID を取得する方法

少し癖があるのですが、Power Apps から自分の予定表の ID を取得する方法は以下のような感じになります。

```
Set(
    gblMyCalender,
    LookUp(
        Office365Outlook.CalendarGetTablesV2().value,
        name = "Calendar" Or name = "予定表"
    ).id
);
```

今回は、`[App]`の`[OnStart]`プロパティに上記処理を記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a8a7ce11-1580-dfdd-3174-28cd8262ea5e.png)

:::note warn
Outlook (Exchange) の予定表について、内部的には ID で値を持っており、予定を登録する際などには、この ID を明示的に指定する必要があるため、上記のような方法で ID を取得します。

また、Outlook などで利用している予定表の名前について、基本的には日本語 (予定表) で取得できると考えますが、英語 (Calendar) で作成されている場合もあるため、念のため、上記のような方法で取得しています。
:::

# 予定の登録

今回は、以下のようなコンポーネントに存在する、"公開" というトレーニングを公開する際に押すボタンに処理を書きたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ed8b849b-45b4-6f19-73d7-70789708c98c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/757718b6-b26f-a560-7e00-70670da61872.png)

具体的な処理は以下のような感じです。

```
Office365Outlook.V4CalendarPostItem(
    gblMyCalender,
    "【日程仮押さえ】" & gblSelectedClass.Title,
    gblSelectedClass.StartTime,
    gblSelectedClass.EndTime,
    "(UTC+09:00) Osaka, Sapporo, Tokyo",
    {
        requiredAttendees: LookUp(
            'Environment Variable Values',
            'Schema Name' = "ms_TrainingAdminEmail"
        ).Value
    }
)
```

gblSelectedClass は、このアプリで選択したトレーニングの情報が格納される変数のため、適宜置き換えてください。

一応、以下のようなデータが入っており、日時については、SharePoint の "日付と時刻" 型のデータとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/fcc52bce-9274-3d01-6c30-e7cccf0b54a9.png)

また、requiredAttendees に記載している内容について、今回は、以下のような環境変数で設定した情報を利用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/27f1e199-cb0e-14d8-dd9a-f2dfaca2abd5.png)

こちらを利用するにあたって、あらかじめ以下のデータを追加しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/68c39c6e-c6b2-649f-c93f-8f6a1edabc5f.png)

:::note
Office365Outlook.V4CalendarPostItem の "requiredAttendees" とアプリの利用者が同じ場合は個人の予定となり、異なる場合は、会議の主催者がアプリの利用者となり、"requiredAttendees" に会議出席依頼が送信される動作となります。
:::

実際に動かしたところ、以下のように、testuser1 (環境変数で指定したトレーニングの管理者) に対して会議出席依頼が送信されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/87e3da3b-4967-bb0d-f7a3-c35fc4800d0c.png)

# Power Automate と連携して予定を作成する場合

一応、Power Automate と連携して予定を作成する場合の例も紹介します。

## Power Automate フローの作成

まず、以下のような感じで、"Power Apps V2" トリガーのフローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e3142576-b1d3-b335-6b89-00644e1c4d40.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8cc98ca7-ab3d-1abe-51d1-3874ad5bcc70.png)


Power Apps から受け取る引数 (Power Apps から受け取る情報) は以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/717a9ee9-c4d6-f882-65c8-6261d86b0139.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/defd5680-bc44-3c1a-ad8f-3bcb92c14e04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7536358f-7575-6868-0931-cbc440ee200d.png)

続いて、Outlook コネクタで予定 (イベント) を作成します。
それぞれ、以下のような感じで引数を指定します。
予定表 ID がカスタム値となっていますが、こちらは、Power Apps から渡された、**アプリ実行者の予定表の ID です。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ac73ca8c-45b9-a8d3-fa7d-4289217cbb04.png)

日時の箇所は、以下のような感じで、formatDateTime 関数で変換しておきます。

```
formatDateTime(triggerBody()['text_1'])
```

一見難しそうですが、文字を直接入力する必要はなく、以下のような感じで該当する引数を選択してあげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1fecdbd1-e1fb-fef6-7af8-f9e5ed32bc95.png)

今回は、必須出席者は環境変数にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/baff7210-c6b2-b532-efa5-51304bf00f87.png)

最後に、念のため、このフローが失敗した際に通知を飛ばすようにしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f44c7a6e-8010-97db-0e76-fef7c3330d76.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f04b5c01-4d3b-c1be-9bc7-559c023afdf3.png)

## Power Apps からPower Automate フローの呼び出し

Power Apps 側では、まず、以下のように作成したフローを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6b610ec9-2b01-1f32-4028-dc9ee41e8979.png)

その次に、フローを実行したい箇所に以下のような処理を書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/07527aaf-4526-a213-da39-9f12e96ddcd0.png)

今回の場合は、以下のような感じで情報を渡してあげます。

```
トレーニング管理者日程仮押さえフロー.Run(
    gblSelectedClass.Title,
    gblSelectedClass.StartTime,
    gblSelectedClass.EndTime,
    gblMyCalender
)
```

# まとめ

今回、トレーニングの管理アプリを例に、Power Apps で Outlook の予定表に予定を登録する方法を紹介しました。

何かの予約をするアプリ、勤務状況をシェアするアプリなど、ついでに Outlook の予定表にも予定を登録したいというニーズはあると思います。

特に、自分の予定表の ID を取得するところについて、少し癖があるので、参考にしていただき、様々なサービスと連携するアプリ作成時に参考にしていただけると幸いです。