Power Automate×Windowsイベントログで働きすぎをチェックする
はじめに
テレワークになってから半年くらい経ちました。
ふたを開けてみると、サボりよりも働きすぎなどの体調管理が問題視されていたりします。
実際に私も残業の境目がなくなってしまう時があります。
ということで、働きすぎを感知するようなフローを考えてみました。
目的
テレワークにより実稼働時間が見えにくい中で、働きすぎている人がいた場合、マネージャー的な人のTeamsに通知が来るようにする。
流れ
- PowerShellのコマンドでWindowsのイベントログを収集する。
- 取得したcsvファイルを何らかの形でxlsxにする。
- xlsxファイルを対象のOneDriveフォルダにアップロードする。
- PowerAutomate、Office Scriptsが動く。
- Office Scriptsで稼働時間が定時時間を超えていないかチェックする。
- 稼働時間が多い場合に、Teamsに警告メッセージが来る
作成
1.Windowsのイベントログ収集
WindowsのイベントログからPCの稼働時間を取得します。
Windowsのイベントログはコマンドでcsvファイルなどに取り出すことができます。
稼働時間の計算に使えるのは下記のIDあたりかと思います。
6005(7001):起動
6006(7002):シャットダウン(正常
6008:シャットダウン(異常
42:スリープ状態の開始
1:スリープ状態からの復帰
今回はスリープの開始と復帰にだけ焦点を当てて情報を取得します。
保存の時のファイル名を取得日時にする目的もあり、スクリプトファイルの形にしました。
PowerShellスクリプトは下記githubにおいてます。
GitHub - kgnk-hkr/getWindowsEventinfo
csvファイルの中身はこんな感じです。
これをOffice Scriptsで処理できるように、何らかの手段でxlsxファイルの形にします。
私はだいたいExcelの機能で変換しなおしてます。
2.Office Scripts作成
次に、上記で収集したイベントログから、稼働時間を計算します。
ついでに、定時時間を超えているかどうかも確認します。
これらをOffice Scriptsで実施します。
Office Scriptsとは?
Excel on the webで使えるExcelの自動化機能です。
Excel で行う操作を操作レコーダーで記録すると、スクリプトが作成されてとても便利です。
docs.microsoft.com
操作レコーダーで記録した部分のスクリプト
ここでは、主に見た目を整えています。
操作レコーダーで記録すると何をしているのかのコメントも自動で入れてくれます。
稼働時間を計算する部分のスクリプト
スクリプトはTypeScriptまたはJavaScriptで編集することができます。
稼働時間を計算する部分は手動で書き加えました。
やっていることとしては、スリープ開始時間と復帰時間の差分を取り、Timeに格納します。
稼働時間の総時間をSunTimeに格納します。
SumTimeが定時想定の稼働時間を超えていたらAnswerに1を格納するようになっています。
しかし、見てわかる通り、エラーが出ています…
動くは動くのですが、書き方が正しくないようなので要改善です…
スクリプト実行前
スクリプト実行後
3.Power Automate作成
ファイルのアップロードをトリガーに、
稼働時間計算のOffice Scriptsを実行し、
稼働時間によってTeamsにメッセージを送るというフローを作ります。
フロー全体
トリガーの設定
今回は社員が取得したWindowsのイベントログを特定のOneDriveフォルダにアップロードすることをトリガーとします。
ファイルのデータを取得する
Office Scriptsを開始するための条件に使う用の情報を取得します。
値の初期値の設定
定時時間以上の稼働があるか判定するために使う判定基準と判定対象をセットします。
最終的な判定の時にExcel上のデータを抜き出して判定するため、文字列で設定します。
条件の設定
Office Scriptsを実行するために条件分けを入れます。
ファイルコンテンツの種類がexcelであることを判定します。
はいの場合
スクリプトを実行します。
実行するスクリプトと対象のファイルを設定します。
対象のファイルは、アップロードされたファイルを指定しています。
行の取得
稼働時間が定時時間を超えているかを確認するために、スクリプト実行後のファイルから対象のデータを取得します。
一行目を取得してきます。
判定対象に値を格納
取得したデータを設定しておいた「判定対象」に格納します。
Answerの枠に入っている値が判定対象になるため格納します。
outputs('行の取得')?['body/Answer']
条件の設定
判定対象が判定基準と一致している場合は定時時間以上に働いている疑いがあるので、注意喚起するようなTeamsメッセージを送ります。
ファイルのアップロードした人の名前を入れることができるので、どの社員が働きすぎているのかも伝えられます。
4.動作確認
フローが正常に動くと、こんな感じでメッセージが来ます。
改善点
- Office Scriptsでエラーが出ているので、これは改善の必要があります。
- Windowsイベントログの取得とアップロードが手動になっていて手間なので、ここも自動化できたらいいなと思います。
参考サイト様
Office Scriptsってどんな機能? | 初心者備忘録
https://forsenergy.com/ja-jp/windowspowershellhelp/html/62e7642c-51d4-47d1-97fe-62b08197896a.htm
終わりに
今回はスリープ状態での稼働時間しか集計していませんが、シャットダウンなども含んだら、もっと正確な勤務時間が出せるような気がします。
在宅勤務が続くことで、人の目につかないところでオーバーワークをして辛くなる人が出てくるのが恐ろしいので、そのあたりをカバーできるようなフローを考えられるといいなぁと思っています。
今回初めてOffice Scriptsを触りましたが、便利でおもしろかったです!Power Automateで実行できるのもさらにおもしろいですね!