オンプレ系インフラエンジニアがAzureを勉強する

いつか誰かの何かの役に立つと嬉しいな

Power Automate×Windowsイベントログで働きすぎをチェックする

はじめに

テレワークになってから半年くらい経ちました。
ふたを開けてみると、サボりよりも働きすぎなどの体調管理が問題視されていたりします。
実際に私も残業の境目がなくなってしまう時があります。
ということで、働きすぎを感知するようなフローを考えてみました。

目的

テレワークにより実稼働時間が見えにくい中で、働きすぎている人がいた場合、マネージャー的な人のTeamsに通知が来るようにする。
f:id:mitsunooon:20201123231635j:plain

流れ

  • 取得したcsvファイルを何らかの形でxlsxにする。
  • xlsxファイルを対象のOneDriveフォルダにアップロードする。
  • PowerAutomate、Office Scriptsが動く。
  • Office Scriptsで稼働時間が定時時間を超えていないかチェックする。
  • 稼働時間が多い場合に、Teamsに警告メッセージが来る

使うもの

  • Power Automate
  • Office Scripts

作成

1.Windowsのイベントログ収集

WindowsのイベントログからPCの稼働時間を取得します。
Windowsのイベントログはコマンドでcsvファイルなどに取り出すことができます。
稼働時間の計算に使えるのは下記のIDあたりかと思います。
 6005(7001):起動
 6006(7002):シャットダウン(正常
 6008:シャットダウン(異常
 42:スリープ状態の開始
 1:スリープ状態からの復帰

今回はスリープの開始と復帰にだけ焦点を当てて情報を取得します。
保存の時のファイル名を取得日時にする目的もあり、スクリプトファイルの形にしました。
PowerShellスクリプトは下記githubにおいてます。
GitHub - kgnk-hkr/getWindowsEventinfo

csvファイルの中身はこんな感じです。
f:id:mitsunooon:20201123211802j:plain

これをOffice Scriptsで処理できるように、何らかの手段でxlsxファイルの形にします。
私はだいたいExcelの機能で変換しなおしてます。

2.Office Scripts作成

次に、上記で収集したイベントログから、稼働時間を計算します。
ついでに、定時時間を超えているかどうかも確認します。
これらをOffice Scriptsで実施します。

Office Scriptsとは?
Excel on the webで使えるExcelの自動化機能です。
Excel で行う操作を操作レコーダーで記録すると、スクリプトが作成されてとても便利です。
docs.microsoft.com


操作レコーダーで記録した部分のスクリプト
ここでは、主に見た目を整えています。
操作レコーダーで記録すると何をしているのかのコメントも自動で入れてくれます。
f:id:mitsunooon:20201123213420j:plain


稼働時間を計算する部分のスクリプト
スクリプトはTypeScriptまたはJavaScriptで編集することができます。
稼働時間を計算する部分は手動で書き加えました。
やっていることとしては、スリープ開始時間と復帰時間の差分を取り、Timeに格納します。
稼働時間の総時間をSunTimeに格納します。
SumTimeが定時想定の稼働時間を超えていたらAnswerに1を格納するようになっています。
しかし、見てわかる通り、エラーが出ています…
動くは動くのですが、書き方が正しくないようなので要改善です…
f:id:mitsunooon:20201123213611j:plain


スクリプト実行前
f:id:mitsunooon:20201123213152j:plain


スクリプト実行後
f:id:mitsunooon:20201123213205j:plain

3.Power Automate作成

ファイルのアップロードをトリガーに、
稼働時間計算のOffice Scriptsを実行し、
稼働時間によってTeamsにメッセージを送るというフローを作ります。


フロー全体
f:id:mitsunooon:20201123225449j:plain


トリガーの設定
今回は社員が取得したWindowsのイベントログを特定のOneDriveフォルダにアップロードすることをトリガーとします。
f:id:mitsunooon:20201123215626j:plain


ファイルのデータを取得する
Office Scriptsを開始するための条件に使う用の情報を取得します。
f:id:mitsunooon:20201123215713j:plain


値の初期値の設定
定時時間以上の稼働があるか判定するために使う判定基準と判定対象をセットします。
最終的な判定の時にExcel上のデータを抜き出して判定するため、文字列で設定します。
f:id:mitsunooon:20201123215758j:plain


条件の設定
Office Scriptsを実行するために条件分けを入れます。
ファイルコンテンツの種類がexcelであることを判定します。
f:id:mitsunooon:20201123220640j:plain


はいの場合
スクリプトを実行します。
実行するスクリプトと対象のファイルを設定します。
対象のファイルは、アップロードされたファイルを指定しています。
f:id:mitsunooon:20201123221228j:plain


行の取得
稼働時間が定時時間を超えているかを確認するために、スクリプト実行後のファイルから対象のデータを取得します。
一行目を取得してきます。
f:id:mitsunooon:20201123221854j:plain


判定対象に値を格納
取得したデータを設定しておいた「判定対象」に格納します。
Answerの枠に入っている値が判定対象になるため格納します。
outputs('行の取得')?['body/Answer']
f:id:mitsunooon:20201123222002j:plain


条件の設定
判定対象が判定基準と一致している場合は定時時間以上に働いている疑いがあるので、注意喚起するようなTeamsメッセージを送ります。
ファイルのアップロードした人の名前を入れることができるので、どの社員が働きすぎているのかも伝えられます。
f:id:mitsunooon:20201123222059j:plain

4.動作確認

フローが正常に動くと、こんな感じでメッセージが来ます。
f:id:mitsunooon:20201123222606j:plain

改善点

  • Office Scriptsでエラーが出ているので、これは改善の必要があります。
  • Windowsイベントログの取得とアップロードが手動になっていて手間なので、ここも自動化できたらいいなと思います。

その他資料(2020/12/05更新)

発表資料のほうがOffice Scriptsまわりの説明は詳細かもしれません。

www.slideshare.net

終わりに

今回はスリープ状態での稼働時間しか集計していませんが、シャットダウンなども含んだら、もっと正確な勤務時間が出せるような気がします。
在宅勤務が続くことで、人の目につかないところでオーバーワークをして辛くなる人が出てくるのが恐ろしいので、そのあたりをカバーできるようなフローを考えられるといいなぁと思っています。
今回初めてOffice Scriptsを触りましたが、便利でおもしろかったです!Power Automateで実行できるのもさらにおもしろいですね!