【Power Automate】イベント開催日をもとに、予約スケジュールを自動登録するフローを作成する

# 概要
ライブコンサートやスポーツ観戦などでチケット抽選申込の期日が決まっているものがある。「抽選申し込み・予約するの忘れていた……」を防ぐ仕組みを作りたい。
本記事ではPower Automateを利用し、中央競馬の指定席予約スケジュールを参考に、予約スケジュール自動登録フローを作成する。

# 設計
・中央競馬のレース開催日の指定席予約スケジュールを自動登録する
・一般抽選の予約スケジュールは12日前の17:00から10日前の18:00までであることから、その期間を自動登録する
・イベントの作成をトリガーにイベントを作成するフローであるため、無限ループ防止策を検討する

# 作成したフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/02ade434-0bc2-28b6-0f64-cae36ab993c6.png)

## 各アクション詳細
### 競馬の予定が作成されたとき
元アクション名：新しいイベントが作成されたとき (V3)
予定表「競馬」で作成したイベントをトリガーに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/67bc3488-3b66-8ded-8206-50b4ea76e947.png)

### タイムゾーンの変換
作成されたイベントから予約スケジュールを作成する為の下準備。
イベント作成時にタイムゾーンをJSTに指定してもトリガーの出力ではUTCに変換されるため、このアクションでJST(UTC+9:00)に変換する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/6494820a-6acf-8428-e5fe-7038e66342f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/36ade7b2-60fc-5f53-3a2f-77504c6c0a4b.png)

convertTimeZone関数を用いることでも対応可能。

### 変数:StartDateTime
元アクション名：変数を初期化する
予約スケジュールの開始日時を格納する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/0fa66ac1-89d3-93a8-7ead-c1299dccfa29.png)

関数部分はアクション「タイムゾーンの変換」の日時から12日を引いた日付をフォーマットし、素のテキストに時刻(T17:00:00)を設定している。


~~~
formatDateTime(subtractFromTime(body('タイム_ゾーンの変換'),12,'Day'),'yyyy-MM-dd')
~~~

### 変数:EndDateTime
元アクション名：変数を初期化する
予約スケジュールの終了時刻を格納する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/0845ed46-c1d6-d010-33e1-c79d05a50eba.png)

変数「StartDateTime」同様、関数部分はアクション「タイムゾーンの変換」の日時から10日を引いた日付をフォーマットし、素のテキストに時刻(T18:00:00)を設定している。

~~~
formatDateTime(subtractFromTime(body('タイム_ゾーンの変換'),10,'Day'),'yyyy-MM-dd')
~~~

### 予約スケジュールの作成
元アクション名：イベントの作成 (V4)
件名に文字列「指定席予約期間:」とトリガーとなったイベントの件名を設定し、開始時刻に変数「StartDateTime」、終了時刻に変数「EndDateTime」を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/20793d89-89db-0e09-68ed-7bdf44ea7c3b.png)

必要に応じてリマインダーをオンにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/e94ec49d-3815-f043-9f43-d6d5409b3911.png)


# 実行イメージ
トリガーとなるイベントを作成する。年末のビッグレースを逃したくないという思いをフローに乗せる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/96fe50b7-07ad-9e17-9417-61970546a450.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/ab4be6ac-caa7-1956-f1e5-af8432c3c998.png)


暫く経つと、予約スケジュールが自動的に作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/49b24ac1-c1d2-e0ca-ff1e-867514b56eaf.png)

# 注意点
## 無限ループの防止策
本記事で作成したフローは「イベントの作成」をトリガーにして予約スケジュールを作成しているため、フローで自動作成したイベントをトリガーにして無限ループを引き起こしてしまう。
そのため、無限ループの防止策を設定する必要がある。


### 予定表IDを別のものに設定する
難易度：低
トリガーに設定しているカレンダーと自動アクションに設定するIDをそれぞれ別のものに設定する。本記事で採用。

トリガーに設定しているIDは「競馬」だが、アクションに設定しているIDは「抽選スケジュール」であるため、無限ループが防止できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/19001ea7-6415-cf76-0610-7ef7816dc3e2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/b0b052e7-3ca1-b03a-7661-5dd726926990.png)

多分これが一番早いと思います

### トリガーの条件を設定する
難易度：中
フロー内で作成するアクションで作成されるオブジェクトのプロパティを基に、トリガーの条件を設定する。

下記の例は、***「イベントの件名が'指定席予約期間'という文字列から始まらない場合、フローを起動する」*** というトリガーの条件。本記事で作成した予約スケジュールの件名は'指定席予約期間'から始まっており、この条件でフローの無限ループ防止が可能となる。
トリガー出力を一度サンプルで取得し、無限ループ防止に利用できるプロパティを検討する必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/350ffada-c731-aa8a-782f-3a76863f4902.png)

~~~
@not(startsWith(triggerOutputs()?['body/subject'],'指定席予約期間'))
~~~

# 参考文献
[指定席ネット予約](https://www.jra.go.jp/card/about/schedule.html)