yukioのアウトプット

PowerApps、PowerAutomateなど、勉強した内容、実践した内容を、自分にわかるようにかみ砕いてアウトプットしています。

【Power Apps/Power Automate】社用車の車検時期を管理できるようにした話

自分の勤め先でPower Platformが使われ始めて約1年。

まだ興味を示したり、開発に着手してくれる社員はいませんが、「こんなものがあるんだ」というのは社内に浸透してきた矢先、役員からこのような相談がありました。

 

うちの社用車の車検手配(今までは総務部長1人でやっていた)を、人が減って総務の業務負担が増えてきたので、各車両の担当者が管理する運用に変えたい。うまいこと通知したり、アプリで見える化したりできんかな?

 

そのぐらいならできそう!と思ったので

「出来ると思います。作ってみます!」

と即答。2週間ぐらいでサクサクっと仕上げることができましたので、その詳細をまとめようと思います。

 

(1)今まで管理に使っていたExcelファイルを精査

今まではExcelのファイルで管理していたようだったので、それをもらって眺めてみました。

(こういう時に、Excelファイルくれるだけでいいのに、わざわざ印刷してくれるあたり、何だかなぁって思いますwww)

入っていた情報は以下の11種でした。

  1. 車名
  2. 車のナンバー
  3. 購入年月日
  4. 購入年月日(会社的に何期で買ったか)
  5. 新車で買ったか中古で買ったか
  6. その車両の担当者
  7. 車検満了日
  8. 給油所
  9. 車検依頼先
  10. 車検依頼先(電話番号)
  11. オイル交換依頼先

このうち、「3.と4.は一緒の列(年月日だけ)で良いかな?」「新車か中古車かとかいらなくね?」などなど検討を進め、SharePointリストに移植する準備を行いました。

 

(2)SharePointリストの作成

次に、このExcelSharePointリストに移植しました。

以下は、自分の開発者プログラムで作ったリストなので、車のデータをダミーにしています。

作った列は以下の通り。最初はここまでたくさん作りませんでしたが、アプリやフローを作っているうちに必要と判断して追加した列も含みます。

  1. Car(1行テキスト):車種
  2. Title(デフォルトである1行テキスト):車のナンバー
  3. Category(選択肢):普通車か軽自動車か
  4. Owner(ユーザー):車両担当者
  5. MaintenanceLimit(日付と時刻):車検満了日
  6. Store(1行テキスト):車検依頼先
  7. StoreTEL(1行テキスト):車検依頼先の電話番号
  8. Yoyaku(はい/いいえ):予約したかどうかの状態を保管
  9. Buy(日付と時刻):その車両の購入日
  10. Fuel(1行テキスト):給油先
  11. Oil(1行テキスト):オイル交換依頼先
  12. Others(複数行テキスト):備考

 

(3)アプリトップ画面

アプリのトップ画面はこのような形です。

先ほど作ったSharePointリストの中身の一部をギャラリー表示しただけですね。

 

「車検満了日」のテキストラベルは、Colorプロパティを

If(
    Value(ThisItem.MaintenanceLimit-Today())<30,
    Color.Red,
    Color.Black
)

FontWeightプロパティを

If(
    Value(ThisItem.MaintenanceLimit-Today())<30,
    FontWeight.Bold,
    FontWeight.Normal
)

このようにして、車検まで30日を切ったものは「赤い太字」で表示されるようにしました。

それぞれの「見る」ボタンを押すと、後で紹介する「DetailScreen」に遷移するようになっています。

OnSelectには次のような関数を入れています。

Set(gblThisItem,galCar.Selected);
Navigate(DetailScreen)

次の画面で扱うために変数にレコードを入れてますが「ギャラリー.Selected」でどうにかしてもいいと思います。

 

(4)「見る」ボタンを押した先の画面「DetailScreen」

トップ画面のギャラリー内「見る」ボタンをポチっとすると、このような画面に遷移するようにしました。

 

車検期限が記載されたテキストラベルは、先ほどと同じように30日を切ったら「赤・太字」で表示されます。

 

「車検を依頼した」ボタンは、DisplayModeプロパティに

If(And(Value(gblThisItem.MaintenanceLimit-Today())<45,gblThisItem.Yoyaku=false),
    DisplayMode.Edit,
    DisplayMode.Disabled
)

を指定しているので、車検まで46日以上余裕がある場合や、既に予約をした場合は押せないようになっています。

 

車検が近づいてくると、Power Automateが通知してくれる(後述)ので、ユーザーには、車ごとに指定された依頼先に車検を依頼した後このボタンを押してもらいます。

ボタンのOnSelectはこのようにしています。

Patch(
    CarMaintenanceList,
    gblThisItem,
    {
        Yoyaku:true
    }
);
Refresh(CarMaintenanceList);
Navigate(MainScreen);

Patch関数を使って、Yoyaku列だけ更新します。

詳しくはPower Automateフローの紹介時に記述しますが、これで「予約したよ!」状態として記録することができます。

 

車検が終わったら、画面下部の日付選択コントロール

に日付を入れて、「車検が終わった」ボタンを押したら期限が反映されます。

一般的に商用車の車検は、普通車の場合は1年に1回、軽自動車は2年に1回なので、日付選択コントロールのDefaultDateプロパティに

If(gblThisItem.Category.Value="軽自動車",
    DateAdd(gblThisItem.MaintenanceLimit,2,TimeUnit.Years),
    DateAdd(gblThisItem.MaintenanceLimit,1,TimeUnit.Years)
)

を入れておき、MaintenanceLimit列に指定してある日付の1年後や2年後がデフォルトで日付選択コントロールに入るようになっています。

これによりユーザーは、このコントロール周辺で何回もポチポチして期限を設定しなくてもよくなり、操作数が減ります。

仮に、上記関数で動的に設定した日付でなかったとしても、大まかには合っているので、数クリックで期限を設定することができます。

「車検が終わった」ボタンのOnSelectはこちらです。

Patch(
    CarMaintenanceList,
    gblThisItem,
    {
        MaintenanceLimit:dteMaintenanceLimit.SelectedDate,
        Yoyaku:false
    }
);
Refresh(CarMaintenanceList);
Navigate(MainScreen);

同じくPatch関数で期限を更新して、Yoyaku列をfalseに戻しています。

 

(5)鉛筆マークを押したら出てくる画面「EditScreen」

DetailScreenの右上の鉛筆マーク

をクリックすると、詳細な項目を編集する画面に遷移します。

 

画面はこんな感じ

これはただ単純に編集フォームをどーんとのっけただけです。

自動生成アプリで作られる画面と大差ないので、詳細な紹介は省きます。

 

アプリの説明は以上になります。

 

(6)Power Automateで通知するフロー

ただ、こうしてアプリで見える化するだけでは、人手不足で忙しい弊社の社員は必ず車検依頼を忘れます。

そこで、Power Automateにて、車検が迫ったものに関しては、担当者にTeamsで通知するフローを組みました。

全体像はこんな感じ。

小さくてよく分からないかもしれませんwww

詳しく見ていきます。

 

(6-1)トリガー:毎日朝9時10分

毎日動かしたいので、1日ごとに動いてもらうようにします。

将来的に、土日祝日の場合を考慮した形にできないかな~と検討中です。

 

(6-2)現在の時刻を取得し、タイムゾーン変換(ついでに表示形式調整)

「yyyy/MM/dd」の形の日付情報が欲しかったので、この2つのアクションを挟んでいます。

 

(6-3)社有車のリストから全件取得

SharePointの「複数の項目の取得」アクションを使って、社用車のリストから全件取得してきます。

※このリストは10件程度の少ないリストなので、躊躇なく全件取得していますが、巨大なリストでこれをやるとおかしなことになるかもしれません。

「フィルタークエリ」のところに書いている「ID gt 0」の詳細はこちらのブログで説明しています。

yukio-ms365.hatenablog.com

 

 

(6-4)Apply to each

さっき取ってきた項目でApply to eachを回します。

以降はApply to eachの中身の話になっていきます。

 

(6-5)回している対象をピンポイントで取得

なんか回りくどいアクションを1個挟んでいる気になっていますが、なぜかこれを入れないとうまく動作しないのでこうしています。

 

(6-6)車検まであと何日かを計算する

関数を使って、車検まであと何日か?を計算します。

関数はこのように入れています。

 

ticks関数などを駆使していますが、こちらは過去のブログに書いた(MicrosoftMVPのMiyakeさんに教えてもらった)方法を応用しています。

yukio-ms365.hatenablog.com

 

 

(6-7)残り日数によって場合分け

先ほど計算で求めた残り日数が「45日」「30日」「15日以下」のいずれかに当てはまったら処理を実行したいので、次の「条件」アクションを入れました。

左側に見える「createAr・・・」の部分には以下の関数が入っています。

createArray(45,30,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)

この方法はMicrosoftMVPのHiroさんのブログで紹介されています。

過去の私の質問を記事にしていただいたもので、それを応用しました。

mofumofupower.hatenablog.com

 

このようにすることによって、createArrayの中に入れている数値の中に、残り日数が含まれている場合は、この条件がtrue(はい)となり、左側の処理に行くことになります。

false(いいえ)の場合は何もする必要がないので空欄にしています。

 

(6-8)(6-7が「はい」の場合)車検予約したかどうかを見る

ここで(4)の「車検を予約した」ボタンを押したかどうか?(Yoyaku列がtrueかどうか?)を見て、false(いいえ)の場合にのみ、最後のTeams通知の処理を実行し、true(はい)の場合は何もしません。

車検予約したのに「車検予約しろよ~」という通知が繰り返し来ても迷惑ですからね。

 

(6-9)(6-8が「いいえ」の場合)メンショントークンを取得し、Teamsに通知する

最後の処理です。その車両の担当者のメンショントークンを取得し、Teamsのチャットにメンションを付けて投稿します。

Owner列がユーザー列なので、その中身の「Email」を指定することでメンショントークンを取得することができます。

 

(6-10)フロー完成

フローが完成しました。

毎日フローが走り、車検が迫った車が見つかると、担当者にこのような通知が来るようになります。

この通知は「あと15日」の段階ですが、45日の時と30日の時、そして14日~1日でも通知が送信されるようになっています。

ですが、気づいた段階できちんと車検を依頼して、その後アプリを開いて「車検を予約した」ボタンを押しておけば、Yoyaku列がtrueに更新されるので、それ以降に走るフローでは(6-8)の条件で除外され、通知は届かなくなります。

 

(7)まとめ

この程度の仕組みだったらすぐ作れるようになってきました。

ざっくりとまとめてみましたが、「ここ分かりにくい」「この辺りもうちょい詳しく」等ありましたら、この記事のコメントか、Twitter@yukio_365)のDM等でご指摘いただければ、追記・編集したいと思います。

 

ブログ書いていく中で、過去のブログでアウトプットした内容や、過去に教えてもらった内容を存分に活かして作っていたことが分かり、改めてアウトプットの重要性を実感しました。