【UiPath】ロボット稼働率を見える化する（Orchestrator無し）

　UiPathをスモールスタートで導入する場合、まず開発ツール(Studio)＋有人実行ロボット(Attended Robot)数台で始めて、実行させるオートメーションが増えてきて手狭になったら買い足す、というパターンが多いと思います。

　ただUiPathに限らず大半のRPA製品は買い切りでなく１年毎にライセンス利用料を支払うSubscription方式なので、買い足す判断には今あるロボットの稼働率が高く維持されている事が前提になります。

　そこで必要なのがロボットの稼働率を見える化する手段。[公式](https://www.uipath.com/ja/products/orchestrator)だとOrchestrator(含SQL Server) + ElasticSearch + Kibanaで自動化ログを分析！みたいな記載がありますが、そんなフルセットを用意して使いこなすのは金も時間もかかるので、まずは身近なBIツールで済ませたい。

　誰でもすぐ使えて金もかからない可視化ツール・・・**ある、それはExcel！**（ズコー）
　※どのPCにもOfficeが入ってる前提でしゃべってます。

　というわけでローテクではありますが、Orchestratorにつながってないロボットの稼働率を実行ログから集計し、VBA+Excelで可視化しようと思います。

# 実行ログの場所と形式
　[Robotガイド](https://robot.uipath.com/lang-ja/docs/robot-logs)の"実行ログのターゲット"の項にある通り、ロボットの実行ログはロボットを起動したユーザーアカウント毎に %LocalAppData%\UiPath\Logs（C:\Users\xxxx\AppData\Local\UiPath\Logs） の下に、日付別に生成されます。
　![logfolder.png](https://qiita-image-store.s3.amazonaws.com/0/255097/d14b2a9e-58e2-7c59-cf6e-534afc9b44e1.png)

　ログの中身はログレベルの設定にもよりますが、各オートメーションのstartとendのログ、あとLog Messageアクティビティで意図的に出力したログが出力されています。各行の{ }の中はjson形式になっており、key:valueの対で情報が記載されています。
![logcontents.png](https://qiita-image-store.s3.amazonaws.com/0/255097/1cf8f3b9-923d-682c-d71f-805bf4507d6f.png)

集計する上でのポイントは２点＞

1. 実行ログはロボットを起動したユーザーアカウント毎のフォルダに出力されるので、ロボットの稼働率を知るにはPC内の全ユーザーフォルダからログを収集してこなければならない。
2. ログのコンテンツはjson形式で記載されているので、うまくデータを加工してExcelに取り込む必要がある。

　ちなみにUiPathでよく顔が出てくる[この方](https://medium.com/@miyaichi/using-uipath-reframework-db847e1e96a)の記事の"ログ分析"では、ログのjsonデータをTableauに入れて可視化されてますね。でもTableauもタダじゃないからここではパス。

# Excelマクロでログを集計
こんな感じで作ります。
![design.png](https://qiita-image-store.s3.amazonaws.com/0/255097/0a8e087b-8dd2-168c-869a-a0ecc6485d65.png)

　以下、処理の中で工夫したポイントを解説します。VBAソースは集計用のExcelマクロファイルごと最後に公開してますので、そちらをご覧ください。
### タイムスタンプの書式を変更する
　ログのタイムスタンプ(timeStamp)はISO8601という見慣れない表記法で記載されており、このままではVBAのData型として使えません。
![timestamp.png](https://qiita-image-store.s3.amazonaws.com/0/255097/659ededf-6820-2e3b-83ec-39b1ea4c3371.png)
イイ感じに変換する関数は用意されていないので↓のように自前でDate型に変換します。
`DateValue(Mid(TimeStamp, 1, 10)) + TimeValue(Mid(TimeStamp, 12, 8))`

### ログの整形にPivotTableを利用
　おおもとの実行ログは時系列順に行追加されるので、開始時刻と終了時刻が別の行で表現されます。かつ処理中に出力したログ行も間に入ってくるので非常に見にくい。
　これを[オートメーション][開始時刻][終了時刻]という横方向に整形するのにPivotTableを使いました。データベースならGroup byでタイムスタンプのMin（＝開始時刻）とMax（＝終了時刻）を取れば一発ですが、PivotTableでもタイムスタンプ２つを集計フィールドに突っ込んで、それぞれの集計方法を"最小値" "最大値"に設定すれば同じ事ができます。
![min.png](https://qiita-image-store.s3.amazonaws.com/0/255097/8ad20626-00d1-c40f-dd46-b3ae10f327aa.png)

### 稼働実績の重複カウントを避ける
　時間帯別の稼働率は、"その時間帯にロボットが稼働していた回数÷集計期間"で取るので、↓の絵のように重複してカウントしないように気をつける必要があります。
![double.png](https://qiita-image-store.s3.amazonaws.com/0/255097/a29eba15-c29c-914a-ccad-a16b7ebeb0d1.png)

# できあがり
作成したマクロ付きExcelファイルをGitHubで公開しました。ダウンロードは[こちらのリンク](https://github.com/Umemaru/UiPath_LogVisualization)から。

右上の"Clone or download" > "Download ZIP"を選択し、zipをダウンロード
![download.png](https://qiita-image-store.s3.amazonaws.com/0/255097/860861ec-b6fc-21bd-665c-30da95c9e9e3.png)
zip中の"UiPath実行ログ集計.xlsm"を取り出します。これが集計マクロファイルです。
![contnt.png](https://qiita-image-store.s3.amazonaws.com/0/255097/85714662-c258-c84f-4185-911c06a90a79.png)

　使い方は、集計マクロファイルを実行ロボットがインストールされているPCに置いて、"設定"シートの各種パラメータを好きなように変更して、"ログ集計"ボタンを押すだけ。　※PC内の全ユーザーフォルダからログを収集するので、管理者権限のあるユーザーアカウントで実行して下さい。
![parameter.png](https://qiita-image-store.s3.amazonaws.com/0/255097/df3982ee-c0d8-5b05-def5-92c997ad70bb.png)

　処理が完了すると、"時間帯別"シートに時間帯別のロボット稼働率(稼働回数/集計期間)が表示されます。
![obigraph.png](https://qiita-image-store.s3.amazonaws.com/0/255097/c783f26a-f253-3b15-4741-f7b597e96316.png)
　Excelのカラースケール機能を使って稼働率を濃淡表現してますが、グラフ化しても良いと思います。
![gpraph.png](https://qiita-image-store.s3.amazonaws.com/0/255097/343c4107-e3d1-2d5d-a7f8-045550bb5967.png)

---
　今回はここまで。公開したExcelマクロは使用許諾の中でも一番緩いMITライセンスを選んだので、ソースコメントに記載したコピーライトとMITライセンスへのリンクを残してくれれば、自由に改変して再配布して結構です。