ＮＨＫ番組見逃し防止機能をPower Apps と Automate で作成

#はじめに
[前回](https://qiita.com/MiyakeMito/items/a0c6b8b293463392fd35)に続き、ＮＨＫ番組表APIを利用したアプリを構築します。
番組表APIとの接続にはカスタムコネクタを利用します。

ＮＨＫ番組表APIは以下を参照ください。
https://api-portal.ＮＨＫ.or.jp/
アプリを登録しApikeyを取得しておきます。

#概要

**ＮＨＫ、特にＥテレが大好きです。**

カマキリ先生、植物に学ぶ生存戦略、みんなで筋肉体操…etc
これらの番組って不定期に新作が放映されるんですよね。

**なので、見逃し必至、何度ＮＨＫオンデマンド（有料）のお世話になったことか**

でも、これからは違います。

ＮＨＫ番組表APIという便利なツールを手にした今なら、見たい番組が放映される前に通知することができる！

ということで、「**毎朝、その日に放映する番組をチェックし、見たい番組があればメールで通知する**」見逃し防止機能を作成してみようと思います。



#作成

今回も手順は簡単です。
①カスタムコネクタを作り
②PowerAutomateで、通知システムを構築
③（ついでに）PowerAppsでこの先一週間の見たい番組検索アプリを作成（Microsoft Power Apps Advent Calendarの記事なので）

###①カスタムコネクタの作成
[ＮＨＫの番組をゆるく検索できる PowerAppsでつくってみた](https://qiita.com/MiyakeMito/items/a0c6b8b293463392fd35)を参照ください。
ただし今回利用するAPIは[Program List API (Ver.2)](https://api-portal.nhk.or.jp/doc-list-v2-con)になります。
サービスはＮＨＫＥテレ(サービスIDは"e1"固定）で作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a36341fa-82ee-ccf2-1930-9ed6a843c186.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/0e017e2c-8995-728d-5cc9-be9e76f1b42b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/05e13204-bad5-8b6c-5726-ed9ce2c70e8c.png)
応答のサンプルには上記、Program List API (Ver.2)のテスト機能でレスポンスを取得しインポートすると良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/bc09c28d-4717-2a95-8817-3341550076aa.png)

###②PowerAutomateで通知機能を構築

今回もOneDrive上のExcelブックのテーブルに、見逃したくない番組ワード一覧を格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/ae9a0a9a-1486-e69e-b2ac-30d13f2e9829.png)

フローの全体図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/ca6e9cc8-d498-6239-7b7d-1c2e10e5312a.png)

上から順に説明します。
トリガーには毎日6:00で設定しました。
OneDrive上のExcelファイルのテーブルから全件取得します。
さらに本日の日付を取得するために、現在の時刻を取得しJSTに変換。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/56693c9d-8314-1e3f-48bc-1f584863438a.png)

次に、上記①カスタムコネクタの作成で作成した接続を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/e52d6a38-7673-bfb8-bcfd-0ebbc0026367.png)

番組表APIのレスポンスの、Key"title"(番組名)の値に対して番組検索ワードによる検索を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/f363b22a-fef0-9be6-b2b4-9559cf2f935b.png)

番組検索ワードを含む名前の番組情報を取得したら、指定のメールアドレスに通知メールを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/edbbf510-9207-ed31-e9d1-27bb901aaed1.png)

こんな感じでメールが届きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/f2a41c26-c5e3-f60e-0dd8-0777207e96e7.png)

###③（ついでに）PowerAppsでこの先一週間の見たい番組検索アプリを作成
Microsoft Power Apps Advent Calendar 14日目の担当記事ですから、PowerAppsアプリも作ります。

まず、先ほど作ったフローを開いて、[名前を付けて保存]でフローを複製します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/6886064c-c504-ef9a-6e2d-6316844a4fe0.png)
複製したフローのトリガーを「PowerApps」に変更。文字列型の変数も初期化しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/65d2ef3f-2518-360e-3df3-813029b1a656.png)

APIの呼出では、日付に「PowerAppsで確認」を指定し、PowerAppsからの引数とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/e39d7cfe-d9c5-34e4-38d0-8a31e17fe875.png)

メールの送信を削除し、かわりにデータ操作の「選択」と「参加」を追加します。
これで、hitした番組のidを":"（コロン）で繋いで出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/bf1370b8-ecfe-e726-c305-e5a71f64f86b.png)
条件の左辺には下記を入力。

```
empty(body('結合'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a9139746-27bf-17ed-5045-7a7a46688cb0.png)
文字列変数に追加では、「結合」の出力の後ろに":"（コロン）を入力し、区切り文字とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/960815a5-17cc-ea75-1562-6b074eb91794.png)

最後に「PowerAppsまたはFlowに応答する」を追加して完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/3cee2f74-dfef-1a64-d931-ef9e031d8345.png)

PowerAppsアプリの作成です。
最初に画面イメージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/deed1487-def7-86b5-11c4-b82eea420e36.png)


Appの[OnStart]で、本日から一週間分の検索結果を取得します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/cafc9a09-6b12-242c-3830-b6fbe9dc43b9.png)

```
ClearCollect(Nums,[0,1,2,3,4,5,6]);
Clear(Days);Clear(shows);
ForAll(Nums,Collect(Days,Text(DateAdd(Today(),Value),"[$-ja]yyyy-mm-dd")));

ForAll(Days,Collect(shows,Split(NHK番組検索_fromPowerApps.Run(Value).showid,":")));

RemoveIf(shows,IsBlank(Result));

ClearCollect(shows2,AddColumns(shows,"logo_url",First(NHK_Info.getNHKInfoe1("230",Result,{key:"D2HGH23pUXYhRVGKhn4rpRR6y4JCyOjI"}).list.e1).program_logo.url,"title",First(NHK_Info.getNHKInfoe1("230",Result,{key:"D2HGH23pUXYhRVGKhn4rpRR6y4JCyOjI"}).list.e1).title,"start_time",First(NHK_Info.getNHKInfoe1("230",Result,{key:"D2HGH23pUXYhRVGKhn4rpRR6y4JCyOjI"}).list.e1).start_time))
```

簡単な解説を
ClearCollect(Nums,[0,1,2,3,4,5,6]);
ForAll(Nums,Collect(Days,Text(DateAdd(Today(),Value),"[$-ja]yyyy-mm-dd")));
で一週間分の日付を取得し、配列にセットします。

ForAll(Days,Collect(shows,Split(NHK番組検索_fromPowerApps.Run(Value).showid,":")));
で上記で作成したフローを呼び出します。出力結果の各番組IDは":"（コロン）で区切られているため、Split()関数で分割します。

RemoveIf(shows,IsBlank(Result));
フローのループ処理末尾にも":"が付与されてしまうため、上記Split()関数の結果、下図のような値無しのレコードが作成されてしまいます。
この値無しのレコードを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/1dbf42bc-f557-4165-4691-c0a15f43d004.png)

ClearCollect(shows2,AddColumns(shows,"logo_url",First(NHK_Info.getNHKInfoe1("230",Result,{key:"D2HGH23pUXYhRVGKhn4rpRR6y4JCyOjI"}).list.e1).program_logo.url,"title",First(NHK_Info.getNHKInfoe1("230",Result,{key:"D2HGH23pUXYhRVGKhn4rpRR6y4JCyOjI"}).list.e1).title,"start_time",First(NHK_Info.getNHKInfoe1("230",Result,{key:"D2HGH23pUXYhRVGKhn4rpRR6y4JCyOjI"}).list.e1).start_time))
[Program Info API](https://api-portal.nhk.or.jp/doc-info-v2-con)でHitした番組の詳細情報を取得し、カラムに追加します。
（今回は番組ロゴURLと番組名と放映開始時間を取得しました）

ギャラリーの画像コントロールの「image」プロパティには、先頭に"http://"を付与した番組ロゴURLを指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/f4d0c6c7-6327-d737-1a39-cdd50b94249e.png)

開始時間も整形しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/3cb67c2c-ca25-b4e7-36e0-006e9d8d0039.png)


#まとめ
PowerAppsアプリの蛇足感が若干ありますが、見逃し防止機能はこれからの年末年始の特番祭りで活用できそうです。
PowerAppsやPowerAutomateはアイデア次第でとても便利なアプリが簡単に作成できる素晴らしいツールです。
ぜひご活用ください。