search
LoginSignup
4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Microsoft Power Apps Advent Calendar 2020 Day 14

posted at

updated at

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

はじめに

前回に続き、NHK番組表APIを利用したアプリを構築します。
番組表APIとの接続にはカスタムコネクタを利用します。

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

概要

NHK、特にEテレが大好きです。

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

なので、見逃し必至、何度NHKオンデマンド(有料)のお世話になったことか

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

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

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

作成

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

①カスタムコネクタの作成

NHKの番組をゆるく検索できる PowerAppsでつくってみたを参照ください。
ただし今回利用するAPIはProgram List API (Ver.2)になります。
サービスはNHKEテレ(サービスIDは"e1"固定)で作りました。

image.png
image.png
image.png
応答のサンプルには上記、Program List API (Ver.2)のテスト機能でレスポンスを取得しインポートすると良いと思います。
image.png

②PowerAutomateで通知機能を構築

今回もOneDrive上のExcelブックのテーブルに、見逃したくない番組ワード一覧を格納します。
image.png

フローの全体図です。
image.png

上から順に説明します。
トリガーには毎日6:00で設定しました。
OneDrive上のExcelファイルのテーブルから全件取得します。
さらに本日の日付を取得するために、現在の時刻を取得しJSTに変換。
image.png

次に、上記①カスタムコネクタの作成で作成した接続を追加します。
image.png

番組表APIのレスポンスの、Key"title"(番組名)の値に対して番組検索ワードによる検索を行います。
image.png

番組検索ワードを含む名前の番組情報を取得したら、指定のメールアドレスに通知メールを送信します。
image.png

こんな感じでメールが届きます
image.png

③(ついでに)PowerAppsでこの先一週間の見たい番組検索アプリを作成

Microsoft Power Apps Advent Calendar 14日目の担当記事ですから、PowerAppsアプリも作ります。

まず、先ほど作ったフローを開いて、[名前を付けて保存]でフローを複製します。
image.png
複製したフローのトリガーを「PowerApps」に変更。文字列型の変数も初期化しておきます。
image.png

APIの呼出では、日付に「PowerAppsで確認」を指定し、PowerAppsからの引数とします。
image.png

メールの送信を削除し、かわりにデータ操作の「選択」と「参加」を追加します。
これで、hitした番組のidを":"(コロン)で繋いで出力します。
image.png
条件の左辺には下記を入力。

empty(body('結合'))

image.png
文字列変数に追加では、「結合」の出力の後ろに":"(コロン)を入力し、区切り文字とします。
image.png

最後に「PowerAppsまたはFlowに応答する」を追加して完成です。
image.png

PowerAppsアプリの作成です。
最初に画面イメージ。
image.png

Appの[OnStart]で、本日から一週間分の検索結果を取得します
image.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

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でHitした番組の詳細情報を取得し、カラムに追加します。
(今回は番組ロゴURLと番組名と放映開始時間を取得しました)

ギャラリーの画像コントロールの「image」プロパティには、先頭に"http://"を付与した番組ロゴURLを指定してください。
image.png

開始時間も整形しておきます。
image.png

まとめ

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4
Help us understand the problem. What are the problem?