2019.01.11

UiPath でブラウザのデータを Excel に貼り付ける

Pocket


イントロ




D.M. です。「働き方改革」というキーワードが盛んに叫ばれるようになった昨今、私のところにある業務に RPA を導入できないかという話がやってきました。一応書いておくと RPA は Robotic Process Automation の略で、いわゆる人間のPC操作を自動化するツールです。今回はそのために RPA のツールである UiPath に入門して得た知見を書きたいと思います。




やりたいこと




RPA についてはいわゆるビジネスのお話が多く、エンジニア向けの事例紹介はあまりありませんでした。なので今回はエンジニアの立場として UiPath の学習方法と簡単な具体例について紹介していきます。




UiPath を選んだ理由




RPA についてはグループ各社でも結構いい成功事例があがってきていて、普及に関しては成熟期、技術的にも PC 操作については何でもできそうというのが見えていたので、ひとまず検証は UiPath をやってみることにしました。




選定理由は以下のようなものがあります。




・とりあえず無料ではじめられる。メアド登録だけで OK。
※商用利用にはお金がかかります。

・アメリカの調査会社 Forrester Wave では RPA ツールの中でも最高レベルの評価。公式ページにも出ています。
https://www.uipath.com/ja/reports/forrester-wave-2018-robotic-process-automation

・国内でも上位の人気。 WinActor 、 BizBobo! 、 UiPath ぐらいのポジショニング。

・デスクトップ型+サーバ型の両面で動作する。将来的な拡張性が高い。
(いちおうエンジニアなのでやや高度なことがやれるほうがいいなと)

・学習がしやすい。下で紹介します。




対象者




・とりあえず UiPath がどんな雰囲気なのか知りたい人。
・エンジニア、または直接 RPA 関連の開発に関わる人。




本稿は学習編と実践編の2部構成です。




学習編




UiPath Studio で開発を始める




開発環境は UiPath Studio というデスクトップアプリを利用します。

[システム的な特徴]
・UiPath Studio はデスクトップで動作する統合開発環境。
・動作環境はデスクトップ PC 1 台のみ。(UiPath は Windows のみで動作)
・動作時は PC 1台を占有する。(人間が同時に画面操作すると流れが壊れる)




UiPath Studio の画面は以下のようになっています。やりたい処理を左のアクティビティ欄から選び、中央のワークフロー欄へマウスでぺこぺこ貼っていき、右のプロパティで詳細を設定して開発します。いわゆるヴィジュアルプログラミングです。








実行は上部のメニューの緑のボタンで行います。出来上がった処理はバッチ処理的に一気に実行されます。デバックモードで1行ずつステップ実行することや、動作時のログを出力することも可能です。




UiPath はヴィジュアルプログラミングが基本ですが、 VB.NET の概念に非常に多く依存しています。変数の扱いは VB.NET そのままですし、簡単なコードをツール内に記載することも可能となっています。エンジニアとしては柔軟性が高いツールとして利用できるのですが、非エンジニアの方には少しこの辺は障壁になるかもしれません。




効率の良い勉強方法




入門者はどう始めるべきか、新しい技術の学習はスタートの障壁が大きくなりがちですが、 UiPath の場合、公式の e ラーニングのサイト UiPath アカデミーが無料で公開されています。コンテンツは主に動画なのですがこれがめちゃくちゃ詳しい。網羅性が高いのでこれをやっていくだけでほぼ全機能をマスターできます。




閲覧にはメアドの登録が必要です。




https://academy.uipath.com/pages/10/my-dashboard




https://academy.uipath.com/learn/course/457/Level1Foundation




ただ UiPath Academy は量がとんでもなく多いので、軽めにスタートしたいなという方にオススメなのは Youtube のエッセンシャル版です。 1つ20分前後の動画が20個ぐらいありますが、基本的な機能と考え方が学べるので、これは開発者はマストと言えます。
https://www.youtube.com/watch?v=cVQMvYBhYyU&list=PLG3LgE4atuv-rxv-MSzXBVrOlxw63tvx1




UiPath は外国製のツールですが日本語の文字情報も多いです。 Quiita にも多数の記事が挙がっています。
https://qiita.com/search?q=UiPath
また Ui Forum という公式の Q&A サイトがあり、詳細な課題について詳しい解答を読むことができます。
https://forum.uipath.com/
個人は無料で使えるため技術ブログなどでも解説があるので、課題に応じて検索してみると多くのヒントが得られるかと思います。




実践編




ケーススタディ




エンジニアの開発業務はチケット管理的なシステムを使っていて、最近は jira など有料なツールも使っているのですが、10年以上前から継続するプロジェクトについては redmine を使っています。ここではタスクのチケットを登録してから1日の終わりに何時間やりましたという情報を入力し、それを月初に集計して社内の別のツールでコストの報告する業務を行っています。今回はこの集計業務を RPA 化できないか検討してみます。




今回のシナリオ




ブラウザで redmine を開き工数のデータを取得し、Excel のフォーマットに工数を集計して貼り付けて保存します。




※前提としてチームの各メンバーは Redmine へ毎日工数を登録しています。それを工数集計担当者が月初に集計します。以下はその大まかな流れです。








※実業務ではこのあとに社内ツールにアップロードするなどまだいろいろあるのですが長大なので、本稿では上記までの流れを UiPath で実現することにフォーカスして説明します。




できあがったもの




以下のようになりました。 UiPath Studio の中央のワークフローを抜粋しています。








1つ1つ何をやっているか説明していきます。




まずは一番上の年月入力ダイアログから。




年月入力ダイアログ




集計する年月を指定したいので、集計担当者がダイアログに入力できるようにします。その値を元に集計対象となる月初日・月末日を生成します。








以下がダイアログの設定の詳細です。 UiPath のアクティビティ的にはメッセージボックスというのを使います。プロパティで表示するメッセージを設定します。入力された値は TARGET_YYYYMM という変数へ保存されます。








実行するとこんなかんじです。








次に受け取った年月を使って月初日と月末日を求めるのですが、ここがやばい。いきなり VB.NET の登場です。 UiPath の各アクティビティは高機能でほぼプロパティ設定だけで動作するのですが、ちょっとした加工をしようと思った場合、プロパティ内に直接 VB.NET のコードを書くことができます。








UiPath はコードを直接記載できる点が非常に柔軟です。通常ヴィジュアルプログラミングなのに突然直接的な実装が介在するとなると非エンジニアの方は開発・保守が困難になるかと思いますが、概ねワンライナー的なシンプルなものに収めておけばなんとか運用にも耐えうるのではないかと個人的には思っています。




ブラウザで redmine の立ち上げ




次はブラウザで redmine の立ち上げます。 URL を設定していますが、ここで先ほど入力した年月の値を使うのがポイントです。








以下がURLの設定部分を拡大したものです。入力された年月の変数のフォーマット変換 + 単純な文字列連結により URL を生成しています。








これでブラウザを開くことができました。




ブラウザのデータはレコーディング機能でデータスクレイピング




redmine の画面では一覧表の形式でユーザーの名前、活動、年月、合計が表示されます。この表の部分を UiPath が認識して取得します。








ブラウザで表示されている内容を取得するには UiPath のレコーディング機能のデータスクレイピングが最適です。








レコーディング機能は超強力です。レコーディングを開始して画面を操作すれば該当アクティビティが自動で記録されワークフローに反映してくれます。




以下の順序でブラウザに表示された内容をデータスクレイピングします。








データスクレイピングを選択すると取得ウィザードが立ち上がります。そこの指示通り表データの要素を選択すると、自動的に表の HTML を認識し、データを取得してくれます。












データスクレイピングは取得対象の HTML を自動的に解釈し、一意になる箇所を特定します。この場合一意になったのは TABLE タグの id 名 time-report です。この「何をもって対象を認識したか」を表すものは、「セレクター」いう概念です。
セレクターは超強力な機能で柔軟にチューニングが可能です。 UiPath が画面のどこを認識しているかハイライトさせることもできます。またセレクターはプロパティ欄に明示されるため、もし正常に認識されない場合はセレクター自体を開発者が修正することで認識精度を高めたりすることができます。




またデータスクレイピングのプロパティでは「メタデータ抽出」の項目で、ヘッダーを認識するか、空データを許容するか、などを設定できます。








取得したデータは VB.NET の DataTable 型の変数に入ります。これはいわゆる連想配列( Map 変数)のようなもので、構造化された表データをそっくり保持することができます。




以上でブラウザからデータをスクレイピングし変数に入れることができました。




Excel 向けにデータ加工




次は、ブラウザで取得したデータを Excel へ貼り付けます。









Excel の表フォーマットは以下のようなイメージで、各セルには値または式が入るようなかたちです。








上記を見るとわかるように、ブラウザから取得したデータそのままでは Excel に貼ることができないため、少し形式を変更する処理を行います。




新規の「データテーブルを構築」アクティビティのダイアログを開き、新しい空の DataTable を定義します。このダイアログでは「列の編集」ダイアログで各カラムごとのデータ型を詳細に設定していきます。








ブラウザから取得した値をセットする列の箇所は、以下の画像のように、空の値をセットしておきます。








逆に Excel に関数の式をセットする必要がある列には、文字列としてその関数自体を記載します。








これで Excel 用の DataTable 変数が定義できました。




この変数に対して、ブラウザから取得したデータを1行1行ループして値をセットしていきます。




このループ処理は正直複雑なので以下の画像で雰囲気だけ感じ取ってください。ヴィジュアルプログラミングでこういう処理を書くのは結構煩雑です。








上記のように加工処理は複雑なので保守性も低いです。可能であれば Excel フォーマットを変更したほうが楽かもしれません。




このようなケースは多々あります。現状業務をそのまま RPA 化するよりも、現状業務を変更してしまったほうが良いわけです。 RPA の開発の本質的な部分は、技術的な困難以上に、現状業務を調整してシンプルなものに改善していく点にあるのではないかと思っています。




以上でブラウザのデータが Excel 用に加工できました。これを Excel の該当位置に貼り付けてみます。




Excel にデータ貼り付け




今回は Excel 内の文言を検索して、その文言の下に移動し、生成した表データを貼り付けるというプロセスを採ってみます。








しかしここは一癖の問題がありました。。




UiPath では Excel 上で自分がどこのセルにいるかの座標を取得することができないのです。








どうやらそういうアクティビティがないようなのですね。。




残念ですが別の方法で解決するしかなさそうです。。




その解決策として採ったのは、以下のアプローチです。








1.「開発工数詳細」の文言を探すのは「範囲内で検索」アクティビティですぐに取得できました。




2.そのセルから下に移動するのも Hotkey で可能した。




3.移動後のセル座標を取得するには、外部の処理を呼び出す必要がありました。




今回はこの3の箇所で突然 VBA を呼んでいます。VBA の関数でセル座標を取得し、その座標を利用してデータの貼り付けを行っています。








Excel を「名前をつけて保存」




最後ですが、ブラウザのデータを貼り付けた Excel ファイルを「名前をつけて保存」します。先ほども紹介したレコーディング機能を使って Excel の画面を操作すればアクティビティが自動で記録されます。








1点、「名前をつけて保存」ボタンについては要素が単体でセレクターを認識できない警告が発生したので、周辺要素の「印刷」ボタンを一緒に指定しています。これを UiPath ではアンカー要素と呼んでいます。




これで Excel を保存することができました。今回の具体例は以上です。




最後に




次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。