清水理史の「イニシャルB」
MicrosoftのRPA「Power Automate UI flows」を試す
『できるUiPath』の経費精算デモアプリをUI flowsで自動操作してみる
2020年4月13日 06:00
Microsoftからウェブブラウザーとデスクトップアプリの自動操作ができるRPAツール「UI flows」の提供が開始された。
現状はプレビュー版だが、「Microsoft Power Automate」による従来のバックエンド処理に加えて、Excelのデータを読み込んでウェブアプリにデータを自動入力するといったフロントエンド操作も可能となっている。せっかくなので、書籍『できるUiPath』で使用したExcelからウェブアプリへの自動経費入力処理を、このUI flowsで実行してみた。
FlowからPower Automateへ
Power Automateは、これまで「Microsoft Flow」と呼ばれていたサービスの進化版だ。
SharePointやOneDrive、Outlookなどの同社のサービスや、サードパーティーのサービスを自動的に操作できるのが特徴だ。SharePointのデータ更新などを自動的に検知してメールを送信するなどのバックエンド処理を実行させたり、PowerAppsのロジック部分を記述するのに使われていたが、2019年末、RPA機能である「UI flows」のプレビュー版を追加し、新サービスとしての提供が開始された。
Power Automateのメリットは、豊富なサービスに対応している点、動作の起点を設定しやすい点、操作が簡単な点にある。
Excel Online、Microsoft Teams、Office 365 Outlook、OneDrive for BusinessなどのMicrosoftのサービスはもちろんのこと、Salesforceなどの外部サービスと連携したり、HTTPリクエストを使って外部のREST APIを活用することもできる。
そして、これらのサービスに対して何か処理を実行するだけでなく、これらのサービスを起点としてワークフローを実行できる。例えば、SharePointのリストが更新されたとき、メールを受信したときなど、豊富なサービスを起点として、設定しておいた処理を起動できる。
一方、操作に関しては、「アクション」と呼ばれるカード状のコマンドを並べていくだけで処理を記述できる上、各処理で扱うデータも自動的に選択できる。
例えば、Excelからデータを取り出す場合、「Excel Online」の「表内に存在する行を一覧表示」というアクションを選択し、「場所」「ライブラリ」「ファイル」「テーブル」などの情報をドロップダウンメニューから選択していくだけで、処理の元となるデータを指定できる。
そして、このデータをTeamsに投稿するのであれば、Teamsの「メッセージを投稿する」というアクションを配置し、「メッセージ」欄をクリックする。すると、上に配置したExcelのアクションから「タイトル」や「金額」といった表内のデータが選択肢として表示されるので、投稿したいデータを選ぶだけでいい。
しかも、元データが表形式の場合、繰り返し実行することが明らかなので、自動的に「Apply to each」というアクションを追加して、繰り返し処理できるように構成してくれる。
もちろん、関数や式を使って凝った処理をすることも可能だが、基本的には「やりたいことを並べ」「使いたいデータを指定する」という、シンプルな操作で自動処理を記述できる。
メールの添付ファイルを自動的に保存する、OneDriveの表を更新したらTeamsにメッセージを投稿する、などといったように、単純ながら繰り返し行われる処理を自動化するのに適したサービスだ。
デスクトップアプリやウェブアプリの操作が可能に
今回、このPower Automateに追加された「UI flows」は、クラウドではなく、端末側で動作する自動処理用のモジュールだ。「デスクトップアプリ」と「ウェブアプリ」の2種類が存在し、Power Automateの処理の中から、これらを呼び出すことができる。
これにより、例えば、OneDriveに保存されたExcelの表データを参照する処理をPower Automateで記述し、そのデータを元に実際にPC上でウェブアプリやデスクトップアプリを操作して、データを直接入力するといった処理の作成が可能になる。
まさに、UiPathなどのRPAツールと同じような操作が可能になったわけだ。
実際にUI Flowsを利用するには、以下のような手順で環境を整える必要がある。詳細はこちらのサイトを参考に準備するといいだろう。簡単なチュートリアルも用意されているので、基本的な動作を勉強することもできる。
- UI Flowsのインストール
- Chromium版Edgeの用意
- Edge拡張機能:Microsoft Power Automate
- Edge拡張機能:Selenium IDE
- オンプレミスデータゲートウェイのインストール(Power Automateからトリガーする場合)
なお、Edgeの拡張機能は、UI Flowsのインストーラーからインストールされるが、筆者の環境では、すでに稼働していた古いバージョンが、うまく更新されなかった。拡張機能のインストールや更新がうまくできなかったときは、ウェブブラウザーから直接インストールできる。ただ、筆者が試した時点ではMicrosoft Storeのバージョンは古かったので、Chromeウェブストアで「Microsoft Power AutomateのUI flows」をインストールすることをお勧めする。
『できるUiPath』のサンプルでテスト
では、実際に処理を作ってみよう。今回実行するのは、『できるUiPath』で紹介した経費精算アプリの処理だ。「できるネット」で公開されているコンテンツのレッスン8~10に相当する。
そのレッスン8でも紹介しているUiPathのワークフロー(左)を見てもらえば流れが分かるが、Excelのデータを読み込み、経費精算アプリをウェブブラウザーで開き、Excelから読み込んだデータを1行ずつ処理し、件名や金額などを自動的に入力する処理となる。
本来であればステップバイステップで詳しく作り方を紹介したいところだが、そうすると文量がいくらあっても足りないので、ここではポイントのみを紹介することにする。
今回、Power Automateで作成したフローは2種類ある。
1つは繰り返し処理をPower Automate側(Apply to each)で実装したもの、もう1つは繰り返し処理をSelenium IDE(for each)で実装したものだ。
Power Automateで繰り返しを実装
まずは、前者から見ていこう。こちらは、大きく3つのステップで構成される。
2.Run a UI flow for web 1
UI Flowsのフローを呼び出す。呼び出す「OpenExpenseDemo」は、「http://www.expense-demo.com/」を開く処理だ。このデモサイトでは、登録する経費がランダムに割り当てられた固有の番号によってグループ化されるようになっており、固有番号をURLに指定することで過去に入力した経費を参照できるようになっている。
このため、Selenium IDEの「store attribute」を使って、この固有番号を取得するようになっている(この処理がないと繰り返し処理で1行ずつ別々のグループとして登録されてしまう)。
3-1.Run a UI flow for web 2
このデータをSelenium IDEを使って自動入力していく。UI Flowsで作成した「InputExpense」は、2.で取得した固有番号込みのURLを使って経費精算アプリのデータ入力ページを開き、そこに値を入力していく処理となる。
ウェブアプリ上の「タイトル」「種別」「金額」「備考」欄を指定し、「type」で値を入力するが、入力する値を「${titleText}」などの変数にしておくことで、Power Automate側から参照できるようにしておく。
実際に入力する値は、Power Automate上で指定する。Selenium IDE側で作った変数に対して、それぞれExcelの値を割り当てていく。
3-2.行の更新
経費精算アプリは、値を入力すると処理番号が発行される。この値をSelenium IDEで取得し、元データとなるExcelの表の「番号」欄に書き戻す。これにより、Excelの表側を見るだけで、データが入力されたことを確認できるようになる。
こちらの方法は、『できるUiPath』で紹介した操作と同じことを実現できているが、いくつかの工夫が必要だった。まず、ウェブブラウザーの処理を2つに分けている。Power AutomateからUI flowsを呼び出す場合、処理が終了するとウェブブラウザーも終了する。
これは、「Apply to each」の中でも同じことで、1回目の処理が終わるとウェブブラウザーが終了し、次の処理ではもう一度新しくウェブブラウザーを起動することになる。今回のデモサイトの処理では、これがあまり好ましくない。
前述したように、経費精算アプリのウェブアプリは、起動時にランダムで複数入力処理をグループ化するための固有番号を発行する。このため、Apply to eachの中だけで処理を完結させようとすると、繰り返し処理の度に固有番号が新たに発行されてしまう。これを避けるために、ウェブブラウザーの起動処理と、データ入力処理を分けて記述している。
これは、ログインが必要なウェブアプリなどでも同じだ。繰り返し処理の中ですべて完結させようとすると、毎回、ログイン処理が実行されてしまうため、同様にログイン処理を外部に分けて実行する必要がある。
なお、こちらの処理は、繰り返しでウェブブラウザーが毎回起動するため、データ量が多いとすべての処理が完了するまでにかなり時間がかかるのが難点となる。
Selenium IDEで繰り返し
もう1つは、Selenium IDEで繰り返し処理を実行する方法だ。起動したウェブブラウザーのセッション内で繰り返し処理を実行するので、前述した前者の課題をクリアできる。
2.選択
この処理は必須ではないのだが、シンプルにするために追加した。Excelから取得したデータをUI Flowsに受け渡す際、標準の出力のままでは余計なデータが含まれているので、これを排除し、必要なデータのみに絞り込んでいる。
3.Run a UI flow for ウェブ
Selenium IDEで記述したExpenseDemoInput2を呼び出し、2の選択で出力されたデータをSelenium IDEへと受け渡す。
Selenium IDE側では、Power Automateから受け取ったデータを「store json」で変数に格納し、これを元に繰り返し処理を実行する。
ウェブブラウザーを開き、経費を登録する画面まで遷移させる。この段階で、グループ化のための固有番号が発行されるが、こちらは同一セッション内で全処理が完了するので、この番号を意識する必要はない(後から参照する場合に備えてURLは取得しておく)。
繰り返し処理は「for each」で実行する。元となるデータにPower Automateから受け取ったデータの変数を指定し、各行のアイテムを「jsonItem」として処理する。
「execute script」を使って「return ${jsonItem}.title」と各行のアイテムの値を取り出し、これを「type」を使ってウェブアプリの各欄に入力していけばいい。
こちらの方法は、ウェブブラウザーの起動が1回で済むため、繰り返し件数が多くても、さほど処理に時間はかからない。実用性を考えると、こちらの方法がお勧めとなるだろう。
ただし、前者では、1件(1行)入力が完了するごとに発行されるコード番号を取得し、Excelに書き戻したが、Selenium IDEからExcelを操作することはできないため、その処理が実装できなかった。受け取ったjsonの値を更新して、そのままPower Automateに戻せばよさそうだが、今回は、そこまで調べて実装することができなかった。
Selenium IDEの知識が必要
以上、『できるUiPath』のデモサイトをPower AutomateのUI Flowsを使って実現してみたが、複数の方法があってなかなか悩ましい。
簡単なのは、なるべくPower Automateで処理を実行し、どうしてもクライアント側で実行したいもののみをUI Flowsで記述する方法だ。やり取りする値をGUIで選択できるので、フローの作成が分かりやすい。
ただし、この方法は、全体的な処理の時間が長くなる傾向がある。UI Flowsは呼び出しから実行、実際の操作まで、処理速度があまりスピーディーとは言えない。なので、繰り返し処理などは、今回の後者のようにSelenium IDEで処理してしまった方が効率的だ。だがそうなると、Selenium IDEの知識が必要となる上、Power Automateならではの操作性の良さが発揮されない。
現状は、この2つの世界があまりシームレスにつながっているとは言えない状況で、ユーザーが意識して使い分けなければならないのが課題と言えそうだ。
とは言え、今回の例は、UiPathのようなデスクトップ型のRPAが得意とする分野なので、アウェイで不利とは言え、同じ場所で戦えるようになった意味は大きい。今回は触れなかったが、デスクトップアプリも操作できる。
冒頭でも触れた通り、もともとクラウドサービスとの連携や動的な変数の扱いやすさでは定評があるので、その手軽さが、ウェブブラウザーの操作にも反映されることを期待したいところだ。