前章では消耗品の入力を行う為のアプリの作成をしました。そのアプリを円滑に正確に運用する為、PowerAutomateを使った後方支援の方法を説明します。
クラウドフローの設計
PowerAutomateは初級編で説明しましたが、プログラミングは必要ありません。トリガーとアクションを組み合わせてフローを作る、言わば「ノーコード」アプリです。
ただ、ノーコードと言ってもフロー自体は決まった制御をするものなので、プログラミング的思考は必要となります。ここをしっかり行わないと思ったような動作は期待できません。まずは設計をします。
3入力(消耗品使用(餌)、消耗品使用(トイレ)、消耗品購入)に共通することは、入力がされていない状態が続いたら通知をする、という流れです。ただ、3入力はそれぞれ通知のタイミングが異なります。餌の場合は毎日の入力が発生するので1日でも間が空いたら通知、トイレの場合は決まったサイクルは無いものの、少なくとも一週間に1回は交換を行う必要があるので、一週間入力が無ければ通知、購入に関しては、「消耗品終了」というフラグがついたタイミングに購入する必要があり、フラグがついてから1日でも間が空いたら通知が必要、という感じです。
通知の方法については、入力するデバイスに直接通知するのが効果的と考えます。そこで今回は「Teams」を利用します。TeamsはMicrosoft365のビジネスチャットツールで、PowerAutomate上でメール送信と同じような感覚でチャットを送ることができます。チャットが入ると「プッシュ通知」が行われます。プッシュ通知は音・画面で知らせますので、非常に気付きやすいです。
大元の流れはどれも同じなので、まずは1つテンプレートフローを作り、それを修正してそれぞれのフローに変えていきます。
テンプレートフローの作成
テンプレートとなるフローを作成します。本来のフローは日時によるスケジューリングをトリガーとさせますが、ボタントリガーにしておいていつでもテストできるようにしておきます。
どのフローでも日付の比較を行います。PowerAutomateで日付を比較する場合は、それぞれのタイムスタンプの差を取ります。タイムスタンプのままですと数値では無いので、タイムスタンプをナノ秒という単位に変換します。(ここではボタンが押された日時のタイムスタンプ)
ticks(variables(【タイムスタンプ】))
という関数で、ナノ秒に変換できるので、整数で定義した整数に入れます。差分の基準となるナノ秒も定義しておきます。1日分のナノ秒は「864,000,000,000」ナノ秒です。
SharePointリストにアクセスする為、SharePointの「複数の項目を取得」アクションを選択します。サイトのアドレスとリストを入れるとリストを取得できますが、必要なものは一番新しい日時のリストです。並べ替え順を設定しておく必要があります。
ここでPowerAppsの時と同様、SharePointリストの内部リスト名が必要となる為、英数字以外の場合は内部名の調査が必要です。(調査の仕方は前章を参照ください)
【日時の内部リスト名】 desc
と入れれば、日時降順でリストを所得します。リストの1番目だけを持ってくる方法は、「データ操作」アクションに、以下の関数を入れます。
first(outputs(‘複数の項目の取得’)?[‘body/value’])
さらに、ここから日時を取得します。変数に文字列で以下のように関数を入れます。
outputs(‘【データ操作の名前】’){‘【日時の内部リスト名】’}
ボタン押下時のタイムスタンプの処理と同様に、最新リストの日時をナノ秒に変換します。
これで2日時のナノ秒が取得できましたので、その差分を求め、更にそこから1日分の基準ナノ秒の差分を求めることで、2日時の差が1日に対してどうなっているかが数値で明らかとなります。
フロー最後です。求めた差分を「条件」アクションで条件付けします。
- 条件:差分が0以上の値であるか否か(基準1日より離れているか否か)
- はいの場合:Teamsでメッセージを投稿します。あらかじめ投稿する場所を作っておき、そこに決められたメッセージを投稿します。場所の詳細は選択できますが、投稿者は「フローボット」(ロボット)となります。
- いいえの場合:終了アクションでフローを終了します。つまり何もしません。エラーにする必要はないので「成功」を選択しておきます。
このフローを実行する(ボタンを押す)と、ボタンを押した時間から1日以上入力が離れている場合、画像のように、Teamsを導入しているデバイスに通知され、想定通りの動きをしていることがわかります。
実フローの作成(消耗品使用)
このテンプレートフローをもとに、実際のフローを組み上げます。テンプレートフローをコピーしておいて、差異がある部分のみ修正するという方法が早くて確実です。
餌の入力については、最初のトリガーを変更するだけです。ボタンを繰り返しに変更し、タイムスタンプを繰り返しの現在の時刻に変更します。繰り返し間隔は1、頻度は日(つまり1日間隔)。ここではタイムゾーンをUTCにしていますが、UTC+9時間が日本時間なので、UTC+9で設定した方が良いです。UTCの10時に毎日実行、つまり日本時間19時に実行ということです。
トイレの場合は繰り返しは一週間に設定します。
また、基準ナノ秒も一週間になるので、1日分の基準ナノ秒を7倍しておきましょう。また、リスト名もトイレに変更します。
日時は、リストを変えましたが「使用日時」と同じなので、内部リスト名も変わりません。
これで、一週間入力が無いと日本時間19時に通知が来るようになります。(メッセージをトイレ用に変えておきましよう)
実フローの作成(消耗品購入)
消耗品購入については色々と考えないといけません。4消耗品ありますが基本的に流れは同じなので1つのみ説明します。
消耗品終了のフラグは持って来られるので、いつ切れたかは分かります。単純に考えると、切れてから購入入力が無ければ通知を出せば良さそうですが、実情を考えるとそう単純ではありません。
今は管理ができていないので後手後手の対応になっていますが、これがしっかり消耗品の管理ができるようになった場合、消耗品が切れる前に購入するというケースも出てくると思います。なので、フラグの後ろの日付だけを見ていると、買っているのに買っていないという通知が来てストレスとなります。そこで今回は、「フラグ前後一週間をチェックして購入されているかどうか」で通知したいと思います。一週間が長すぎるのか短すぎるのかは実際の運用をして決めていく部分となります。
特筆すべき部分のみ展開して解説します。
今回プラスマイナス一週間の差分を取るため、正の整数だけでなく、負の整数の一週間ナノ秒も基準値として変数を用意しておきます。
消耗品購入のリストを取得します。使用とは違い、リストを対象の購入品の購入履歴で絞らないといけません。「フィルタークエリ」というものを使います。
今回は牧草で、通常と大容量の二種類がありどちらでも対象です。
【牧草の内部名】 gt 0 or 【牧草大容量の内部名】 gt 0
と書きます。gt 0 は「greater than 0」すなわち「0よりも大きい」、orは「または」の意味です。日付降順で並び替え、リスト1番目を取得します。
ここで一点気にしないといけないのは、「まだ一度も購入されていない購入品」の場合です。今までの流れ通りに、1番目のリストを取得しタイムスタンプをナノ秒に変換したいところですが、リストが一件も無いと空データになるのでナノ秒を取得できません。(エラーになります)
そこで、条件アクションを使い、【リストの中身】=【空】がはいの時のみ、任意のタイムスタンプを入れるようにしました。(いいえの場合はスルー)任意値は1900年1月1日にしておきました。こうする事で購入が無くても購入があるフローに入れ込むことができます。
使用の方の「複数の項目の取得」も一部加工が必要です。こちらもフィルタークエリによって、「消耗品終了」のフラグがついた最新のリストを取得する必要があります。フィルタークエリを以下のように設定します。
【消耗品終了】 gt 0
消耗品終了フラグは、リスト上では「はい/いいえ」ですが、フィルタークエリ的には「1/0」で扱われるので、0より大きい で1を取得できます。
こちらも、「消耗品終了」が一度もついたことがないケースを想定する必要がありますが、これは簡単です。「消耗品終了」がついたことがないということは、そもそも通知をする必要がないので、終了アクションでフローを終了させてしまえば良いです。
購入日時ー使用日時のナノ秒差分を取っておきます。
最後の条件アクションです。
- 条件:【差分】>=基準ナノ秒(プラス) または 【差分】<=基準ナノ秒(マイナス)
- はいの場合、すなわち差分がプラスマイナス一週間以上の場合は通知
- いいえの場合、すなわちプラスマイナス一週間以内に入力があった場合は通知
というように、要件を満たすようになります。
これを4消耗品分作成し、完成です。
フローの実行
各フローをオンにすることで、スケジュール済みとなります。これで要件を満たした際にテンプレートフロート同様に通知が送られるようになりました。
実行にエラーがないかは定期的に確認しましょう。メールでの通知が役に立ちますが、フローの実行結果も定期的に確認した方が良いと思われます。
次のステップ
これで、記録の入力&入力忘れの防止ができるようになり、記録を自然と集められる状態となりました。これをしばらく運用した上で、分析ができる状態になったと仮定し、PowerBIレポートの作成に進みます。
コメント