LINEを使った家計簿作成ロボットに挑戦！

今回は簡単なロボットを作り、身近にあるこんなものもRPAロボットで出来るのだというお披露目をしていきたいと思います。
実演動画も作ったので、忙しい方はそちらだけでも見ていってくださると嬉しいです。

(ところでUiPathがバージョンアップし、一部のActivityが日本語で表記されるようになりましたね。
私は違和感がすごいので、英語に戻してしまいましたが...笑)

#はじめに
今回作成するのは、家計簿自動化ロボットです。
実は私、家計簿をつけるのが苦手でして...
家計簿アプリや手帳も試しましたが、だいたい三日坊主でしたorz
（アプリは開くのが段々億劫になってしまう（゜σ_゜））

そんな私の為に作成したのが、LINEを使用した家計簿作成ロボット。
出先から都度買ったものの金額をLINEにて送信し、その場でカテゴリ分け等も行ってしまうという、
飽き性&後回しするタイプの私にもってこいのものです。

#仕様を考えてみる
###欲しい機能
最低限欲しい機能としては以下のものがあげられます。
・LINEの最新のメッセージを取得し続け、新しいメッセージが送られていないか確認
・金額とカテゴリをユーザーに入力、送信してもらい取得
・月ごとに家計簿Excelを作成
・Excelに書き込み

あまり欲張るとロボットがまとまらなくなってしまうので、今回の実装機能はこれで終わりにします。


###家計簿Excelテンプレート
家計簿用エクセルはテンプレートを用意し、ロボットに月ごとに分けて作成してもらうようにします。
当月分が存在しなければテンプレートExcelをコピーして新規作成し、
既に存在していれば追記していく形です。
ということで、こんなのを作ってみました。
<img width="1334" alt="家計簿テンプレート.png" src="https://qiita-image-store.s3.amazonaws.com/0/234754/5b0f6a50-98b7-a2c6-789c-2e3530baff55.png">
金額とカテゴリNoを「家計簿」シートに入力するだけで、「結果」シートにて合計やらお小遣い残高がわかるようになってます。
つまりユーザーには極力数字を打たせることで、入力ミスを減らす算段です。

日付はロボットが当日の日付を勝手に入力してくれるようにします。

ロボットをいくつか作っていて感じるのが、Excel処理は入力より分岐処理を追加するのが大変です。
（項目を探したり、入力する場所を探したり、入力内容に条件が有る等）
よって**Excelは可能な限りロボットにとって操作しやすいものにすることをお勧めします。**
ロボットに寄せていきましょう。

###ユーザーとロボットの流れ
簡単な流れを書いてみます。
（フローチャートに書いたところ、長くなりすぎたので載せるのを止めました）
①【ロボット（以下ロ）】常にLINEの最新メッセージを取得し、更新されたかチェック
②【ユーザー（以下ユ）】金額を送信
③【ロ】金額を取得
　　　　カテゴリNoを入力するよう促すメッセージを送信
④【ユ】カテゴリNoを送信
⑤【ロ】カテゴリNoを取得
　　　　金額とカテゴリNoをDataTableに格納
　　　　登録終了ならば「よろしく」の文字を送信、他にも登録するものがあるなら金額を入力するよう促すメッセージを送信
⑥【ユ】「よろしく」を送信
　　　（金額が入力された場合は、再度③~⑤を行う）
⑦【ロ】当月の家計簿Excelが存在するかを確認（存在しない場合はテンプレートをコピーして作成）
　　　　Excelに金額とカテゴリNoが入ったDataTableを入力する


・メッセージを受け取るたびにExcelに入力するのもよいのですが、それだとスピードが落ちてしまう為一旦DataTableに格納し、後からExcelに書くようにしました。

#開発環境
Windows8.1
UiPath Studio 2018.4.0 Community
UiPath.UIAutomation.Activities：　18.3.6897.225
UiPath.System.Activities　　　：　18.3.6897.225
UiPath.Excel.Activities　　　　：　2.4.6884.2568

#開発
今回は特に面白いActivityは使わなかった為、何か所か簡単な説明を入れていきます。

##パラメータファイルの作成・設定
パラメータファイルというものを作ります。
ここに文言やパスを入力し、ロボット内で呼び出すようにすると、
変更時にロボットを開いて修正しなくともパラメータファイルを書き換えるだけでよくなります。

呼び方ですが、まずは「Excel Application Scope」と「Read Range」でパラメータファイルのDataTableを取得します。
その後.Netでパラメータキーを設定します。
あとは都度DataTableから項目名を指示するだけで取得することが出来ます。

<details><summary>パラメータファイルの書き方・使い方</summary>
今回使ったパラメータファイルです。
<img width="462" alt="パラメータ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/234754/93ffc5db-6baa-fe1a-1b4f-30e31a32f3fc.png">
キーとなる行（今回はA列）には決して間に空白の行を作ってはいけません。
使用する際は「DataTable.Rows.Find("キーとなる文言").item.ToString」と書くことで、指定した列の文言を呼び出すことが出来ます。



##Excelの準備
####指定Excelの有無
Excelファイルが既に存在しているかは、「Path Exists」にパスを指定すれば
ファイルの有無をTrue・Falseで返してくれます。
ここで注意するのが、FileとFolderの選択がある事。
その設定が間違っていると、ファイルが存在しているのに認識してもらえません。
####Excelをコピー
「Copy File」を使います。
「Path」にコピー元のファイルパスを入力し、「Destination」にファイル名を含めたコピー先のパスを入れます。


##LINEの更新確認
今回このLINEの更新確認は何度も行う処理の為、サブロボットとして別に作りました。
引数として最新のメッセージを送り、LINEでの最新メッセージを取得、比較をし続けます。
（つまり何かしらの更新メッセージが来ないと、ずっとループをしています）
引数はin/outにし、更新があった場合は更新メッセージをその変数に格納します。

![lineMain.PNG](https://qiita-image-store.s3.amazonaws.com/0/234754/54e7c1ad-19c5-7421-6f77-0151de84842a.png)


UiPathにてLINEの操作を行うのは私も初めてだったため、まずはメッセージや入力欄のセレクタを取得して調査を行いました。
残念ながらセレクタのみで最新のメッセージを取得するのは難しそうだったので、
ゴリ押しですがメッセージ欄をCtrl+A、Ctrl+Cすることで全てのメッセージをClipboardに入れ、「Get From Clipboard」で取得、
その後VB.Netで文字列変換し、最後のメッセージのみ取得するようにしました。
またLINEの操作ではSimulateClickの設定だとエラーが発生してしまった為、
「Click」や「Type Into」の処理が遅くなってしまいました。

##DataTableの格納

##Excelの書き込み

<img width="700" alt="excelMain.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/234754/817c7c8a-ef95-a19a-54ca-82c10d1f8299.png">
新しい行に追加するので、一旦Excelを読み込みます。
Excelの最後の行は「TESTDataTable.Rows.Count」といった感じで取得できます。
ここでは「Write Range」のセル指定に注意しましょう。


##完成品
こんな形になりました。
漏れはまだありますが、「Try Catch」後や入力文字が数値化の確認といったエラー関連も追加しました。
![Main.PNG](https://qiita-image-store.s3.amazonaws.com/0/234754/14fc7a4d-af53-a9c8-4bd8-00004f1f4317.png)
入力内容や比較文言、ファイル保存先等は全てパラメータ.xlsxから取得するようにしており、
ロボット内に直接打ち込んでいるものはありません。
よってUiPathがわからない方でも、ファイルの保存先やメッセージ内容を変更することが可能なロボットとなっております。

#実演
実演動画です。（YouTube）
ユーザーが二件の登録をするのにかかったのは50秒ほどでした。
ロボット側の入力処理時間を省けなかったのが悔しいです...
※音が出ます
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/qKq-U0RZIfM/0.jpg)](http://www.youtube.com/watch?v=qKq-U0RZIfM)

#さいごに
今回のロボットは、設計からテストまでで6時間程の作業でした。
これに機能を追加していけば、立派なロボットです。
例えば
・家計簿のカテゴリの追加
・備考記載機能の追加
・お小遣い残高5000円を切った場合、ロボからメッセージが送られる
・カテゴリが追加される際ロボット事態を操作せずともよくなるよう、
　パラメータ.xlsxにカテゴリ最大値を載せるといった対応
・LINEログイン、ログアウト
・処理高速化の為、グループの会話履歴をロボ終了時に行う
・異常エラー対応の追加
といった物があげられます。

家計簿アプリという便利なものがこの世にありながら、それさえ使わない面倒くさがりな私におすすめのロボットでした。
　
今回は身近なものとしてLINEを使用しましたが、アプリのほかにも
スマートスピーカーといったものからもRPAに繋げてみたいものです♪