【UiPath】交通費検索ロボットを作ってみる

UiPathアカデミーを一通り終えたけど、実践的なロボットの作り方がわからない。。。
という人のために、今回は交通費をExcelに記入するロボットの作り方をまとめてみました。

※↓のサイトをベースにしています。大変参考になりました。
[UiPath×Excel。Excelデータを読み取り、ブラウザで交通費検索。無料で使えるRPAツール。](https://www.ex-it-blog.com/RPA-UiPath-Transport-expenses)

本記事の狙いは、上記処理を行うロボットを作る過程で、開発に必要と思われるスキルを習得することです。
具体的には、

- **変数（関数を用いた値変換の方法など）**
- **セレクタ**
- **データテーブル**　←後日追記予定
- **ブラウザ操作**
- **Excel操作**
- **例外処理**　←後日追記予定
- **Orchestratorとの連携**

のあたりを押さえておけば、あとはガシガシ作りこんでいく中で覚えていくと思います。

##概要
交通費の算出には「[Yahoo!路線情報](https://transit.yahoo.co.jp/)」を使います。
以下、今回作るロボットの操作概要です。

**1. 交通費算出に使うExcelファイルを開く**
出発/到着駅が記入されたExcelファイルを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/ee46b912-3014-91ca-e4cd-06dab69667be.png)

ファイルの内容です。
ここから各行の出発/到着駅を取得し、それぞれの交通費を「金額」列に記入していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/9c1bb225-582c-0c98-efa8-228112d756d5.png)


**2. IEでYahoo!路線情報にアクセス**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/c2e2795a-3bf6-0a37-ef84-510425c85a59.png)


**3. 出発/到着駅を入力**
ここからは、操作1で取得した出発/到着駅リストから1行ずつ取得して、出発/到着駅を入力し、検索ボタンをクリックします。
Yahoo!路線情報の仕様で、デフォルトで**最短時間で到着する経路**を優先して検索するようになっているので、今回はその設定で検索するようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/c1b89901-6a05-0d8e-daf3-311f483cc0b2.png)

**4. ルート1の料金を取得し、Excelファイルに貼り付ける**
**最上位に表示されているルート＝最短時間で到着する経路**となるはずなので、ルート1の経路での料金を取得します。その料金をExcelファイルに貼り付けます。
その後、画面上部の「路線情報トップ」リンクをクリックし、検索画面に戻ります。
以降、出発/到着駅リストの行数分、操作3～4を繰り返します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/4956e4ff-04aa-15a0-dcc6-092681ed2bcd.png)

**5. IEを閉じる**
交通費記入が完了したので、IEを閉じます。

**6. 処理結果**
Excelの「金額」列に各区間の料金が転記されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/94a5b73d-86a8-daee-3079-f4a0fbf157db.png)

##動作イメージ
こんな感じで動きます。
![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/186221/b757a811-c5fa-674f-08f9-31b16f3eeb7d.gif)


##開発のポイント
###変数の値変換
今回はあまり複雑な値変換は不要ですが、実装の余地がある箇所としては、Excelに貼り付ける料金の表示です。
画面に表示された料金をそのまま取得すると「310円」のようになりますが、
語尾に「円」とつけずに「¥1,000」といったフォーマットで貼り付けたいとします。
もっと綺麗に整形できるかもしれませんが、以下一例です。
>"¥" + Integer.Parse(変数.toStirng.Replace("円","")).ToString("#,0")

値変換の関数については、VB.NETの関数の知識が多少必要になります。
ただしUiPathは優秀で、インテリセンス機能（候補メソッドを表示してくれる機能）がついているので、
メソッドを探すのにそれほど苦労はしないはずです。
ちなみに2018/10/09現在、Blueprismにはインテリセンスは搭載されておらず、
コードステージでコーディングする際はメモ帳にコードを書くような感覚でコーディングしてました。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/547f3cb9-7045-52ab-2d89-b3ddd5a20114.png)

###Invoke Work Flowで処理を切り分ける
UiPathの場合、実装したワークフローがやたらと入れ子の多い見た目になり、見づらい場面が多々出てくると思います。
なるべく1ワークフローの長さは短く、細かくワークフローを分けたほうが見やすいと思います。
また、共通して使えそうなフローは積極的に部品化していきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/f51977be-d073-997e-c84c-82e4bdd6b09c.png)

###セレクタをガチガチに設定しすぎない
例えば、路線検索結果ページの画面にアタッチする場合、セレクタの設定が悪いとアタッチできません。
セレクタの「title」が**「お台場海浜公園」から「新橋」への乗換案内**で設定されていた場合、新宿から秋葉原の検索結果画面をアタッチすることはできません。
このような場合、*でどの路線検索結果でも画面がアタッチできるようにパラメータを変えてあげる必要があります。
同じ画面を使いまわすロボットを作るときなど、セレクタの設定値はある程度汎用的に設定するべきです。

セレクタについての分かりやすい説明はこちら↓
https://uipath.site/use-uipath/selector.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/d0cc9e29-83bc-12e6-6908-c57ec31d185c.png)

###ログはこまめに吐く
将来、管理サーバーでロボット端末を集中管理するようになると、Orchestratorのログを見る機会が増えると思います。
特に障害が発生した場合、ログが細かく吐かれるように実装していれば、どこまで処理が動いてどこでつまづいたかが特定しやすくなります。
ログを吐く処理を入れること自体は全く難しくないので、後々の運用のことを考慮してこまめに入れるようにしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/67fe882c-22a8-9c83-d8d2-ae506e737ae7.png)

###画面の細かい挙動を吸収する
今回の場合、出発/到着駅を入力した後、候補駅リストがピロ～ンと表示されると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/3931a209-f5d1-99da-5c6e-81ddd6825bb5.png)

例えば、このリスト表示が検索ボタン押下の処理を妨げる可能性があります。
このような、後処理に影響しそうな不要な動作は、キャンセルするように実装してあげたほうが
安定して稼働します。
今回だと、出発/到着駅を入力後、入力欄を一度クリックする処理を挟む、とかですね。

##Orchestratorで動かす
↓を参考にして、本記事で作成したプロジェクトをOrchestratorで動作させます。
[【UiPath】Orchestratorことはじめ](https://qiita.com/irohamaru/items/a2bbfb4e647f2cb9146b)

##サンプル
本記事で作成したロボットのプロジェクト一式をgithubにアップしています。
一部、Excelファイルのパスをマスクしてます。
https://github.com/kktrip/UiPath