RPA(ロボティック プロセス オートメーション)にまつわる国内外の最新情報をお伝えすると共に、自動化推進に役立つ話題や社内の導入事例などについてご紹介します。

テキストの類似度を使ってモジュールを判定してみよう

RPAエンジニア 大庭

Webサイトのリニューアルのとき、リニューアル前のページからリニューアル後のページにデータを移行することがあります。そのとき、リニューアル前のページで使われていたある1つのモジュールが何のモジュールか判断したいとします。人間の場合、ブラウザで表示されるWebページを見たり、ソースの内容からどのモジュールが使われているかを判断しますが、今回はUiPathのRPAロボットによって実験的にモジュールを判定する方法をご紹介します。

「StringSimilarity.NET」パッケージをプロジェクトにインストールする

UiPath Studioの画面の「パッケージを管理」リボンをクリックします。するとウィンドウが表示されるので、ウィンドウ左の「すべてのパッケージ」を選択して、検索ボックスに「StringSimilarity.NET」と入力します。パッケージ一覧の中にいくつか候補が表示されますが、パッケージ名が「StringSimilarity.NET」でバージョンが5.0.0(執筆時点の最新バージョンです)のものを選択します。ウィンドウ右上の「インストール」ボタンをクリックした後に右下の「保存」ボタンをクリックしてプロジェクトにパッケージをインストールします。

「パッケージを管理」ウィンドウ画面

【UiPath モダンデザイン】開発がさらに捗る!今日から使えるオブジェクトリポジトリ

RPAエンジニア 小林


UiPath Studio 2021.10からモダンデザインが導入され、UIオブジェクトを一元管理するオブジェクトリポジトリが使えるようになりました。従来のUiPathにはなかった機能なので難しく感じる人もいるかもしれませんが、実はとても便利な機能です。今回は、オブジェクトリポジトリの使い方や導入の際の考え方を紹介します。

オブジェクトリポジトリは、簡単に言ってしまえばUI要素を1カ所でまとめて管理するための機能です。ロボットを開発する中で、何度も出てくる値や変更するかもしれない値は変数や引数として扱います。それと同様に、UI要素もまとめて管理してしまおうというのがオブジェクトリポジトリの考え方です。

オブジェクトリポジトリの使い方

※オブジェクトリポジトリを使うにはUiPath Studioの「モダンデザインエクスペリエンス」が有効化されている必要があります。詳しくはこちらの記事をご覧ください。

オブジェクトリポジトリにUIオブジェクトを登録する

UiPathのオブジェクトリポジトリではオブジェクトは「どのアプリ」の「どの画面」の「どの要素」かを指定して登録します。今回は例として、BlogトップページにあるRPA BlogへのリンクのUI要素を取得してみようと思います。まず、UiPath Studioでオブジェクトリポジトリの「プロジェクトUI記述子」を右クリックして新しいアプリケーションを作成します。今回はChromeを使うのでアプリケーション名は「Chrome」とします。

オブジェクトリポジトリにアプリケーションを作成する

UiPathのモダンアクティビティが便利~クリックアクティビティ編~

RPAエンジニア 津田

UiPath Studio 20.10からモダンデザインが導入されました。モダンデザインでは多くのアクティビティがより高機能なモダンアクティビティとして刷新されています。アクティビティのほかにも、レコーダー、データスクレイピングなどが新しくなっており従来とは違う新たな機能が使えるようになっています。

慣れるまで時間はかかりましたが、使用してみるととても便利でしたので、その内容を何回かに分けて紹介していこうと思います。

本日はクリック(UiPath.UIAutomationNext.Activities.NClick)アクティビティ編です。

<便利だと感じた点>

  • クリック後、画面遷移までの待機をクリックアクティビティのみで設定できる
  • クリックのオフセットが簡単に設定できる

それでは順番にご紹介します。

UiPathからPythonスクリプトを呼び出す

RPAエンジニア 小林

UiPathは自動化のための様々な機能を備えていますが、フローの中で複雑な計算やAPI連携などをしたいときに、「ここだけPythonで処理できると楽だな」と思う場面があります。今回は、UiPathでPythonスクリプトを扱うためのアクティビティについて紹介します。

準備

まず、前提としてマシンにはPythonがインストールされている必要があります。その上で、UiPathからPythonを実行するためにUiPath.Python.Activitesをインストールします。このパッケージはUiPath Studioのパッケージマネージャーからインストールすることができます。

UiPath.Python.Activitiesのインストール

パッケージをインストールできたら、Pythonスクリプトを用意します。今回は以下のようなコードが書かれたファイル「my_methods.py」で試してみます。ここではシンプルな例として関数1つを扱っていますが、複数の関数が記述されていてもかまいません。呼び出したい関数はUiPath側で指定することができます。例として扱うrepeat_string関数は、引数sとして受け取った文字列を引数nで指定された回数だけ繰り返した文字列を返す関数です。

def repeat_string(s, n):
    result = s * n
    return result

メールトリガーでUiPath Orchestratorのジョブを実行する方法

RPAエンジニア 大庭

普段の業務の中で、ある条件に当てはまるメールを受信したときにUiPath Orchestratorにある特定のプロセスのジョブを実行したい場合があると思います。今回はOutlook VBAを使ってメール受信をトリガーにしてジョブを実行する方法をご紹介します。

前提として、Microsoft Outlookでマクロを編集できるようにしておいたり、マクロに自己署名をつけておく必要があります。

メインのプロシージャのコードは下記のようになります。

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

Const TASK_SUBJECT = "メールの件名"
Const PROCESS_NAME = "UiPath Orchestrator上のプロセス名"
Dim MailMessage
Dim Token As String, ReleaseKey As String

Set MailMessage = Session.GetItemFromID(EntryIDCollection)

If InStr(MailMessage.Subject, TASK_SUBJECT) <> 0 Then
    Token = UiPath_Authenticating 'アクセストークンを取得するプロシージャを実行して戻り値を格納
    ReleaseKey = UiPath_RequestReleaseKey(Token, PROCESS_NAME) 'リリースキーを取得するプロシージャを実行して戻り値を格納
    UiPath_StartJob Token, ReleaseKey 'ジョブの実行を命令するプロシージャを実行
End If

End Sub

このプロシージャは、指定したメールの件名が受信したメールの件名に含まれていたときに、指定したプロセス名のジョブを実行する命令をOrchestratorに対して行います。送信元を指定したり本文に特定の文字列が含まれている場合などを条件にしたいときはIf文の条件を適宜修正してください。

注意点として、このプロシージャはメールを受信したときに実行されるので、Outlookを常に起動させておく必要があります。

また、ジョブを実行するにはいくつかの段階を踏む必要があります。

  1. まず、アクセストークンを取得します(上記コードのUiPath_Authenticatingプロシージャ)。

  2. 次にそのアクセストークンでプロセスのリリースキーを取得します(上記コードのUiPath_RequestReleaseKeyプロシージャ)。

  3. 最後にアクセストークンとリリースキーでプロセスのジョブを実行する命令をします(上記コードのUiPath_StartJobプロシージャ)。

以下はそれぞれの段階に対応するプロシージャのコードです。

アクセストークンの取得(UiPath_Authenticating)

Function UiPath_Authenticating() As String

Dim sURL As String, sHTML As String, Body As String, Token As String
Dim oHttp As Object
Dim Doc, JsonObject

Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
sURL = "https://account.uipath.com/oauth/token"
oHttp.Open "POST", sURL, False
oHttp.setRequestHeader "Content-type", "application/json"
oHttp.setRequestHeader "X-UIPATH-TenantName", "テナント名"
Body = "{""grant_type"" : ""refresh_token"",""client_id"" : ""クライアントID"",""refresh_token"" : ""リフレッシュトークン""}"
oHttp.Send Body

sHTML = oHttp.ResponseText
Set Doc = CreateObject("HtmlFile")
Doc.Write "<script>document.JsonParse=function (s) {return eval('(' + s + ')');}</script>"
Set JsonObject = Doc.JsonParse(sHTML)
Token = CallByName(JsonObject, "access_token", VbGet)

UiPath_Authenticating = Token

End Function

トークン取得の要求を行い、その応答をJSONオブジェクトにしてその中からアクセストークンを取得しています。

リリースキーの取得(UiPath_RequestReleaseKey)

Function UiPath_RequestReleaseKey(ByVal Token As String, ByVal ProjectName As String) As String

Dim sURL As String, sHTML As String, Body As String, ReleaseKey As String
Dim oHttp As Object
Dim Doc, JsonObject, Value, item
Dim i As Long

Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
sURL = "リリースキー取得APIのURL"
oHttp.Open "GET", sURL, False
oHttp.setRequestHeader "Content-type", "application/json"
oHttp.setRequestHeader "X-UIPATH-TenantName", "テナント名"
oHttp.setRequestHeader "Authorization", "Bearer " & Token
oHttp.Send

sHTML = oHttp.ResponseText
Set Doc = CreateObject("HtmlFile")
Doc.Write "<script>document.JsonParse=function (s) {return eval('(' + s + ')');}</script>"
Set JsonObject = Doc.JsonParse(sHTML)
Set Value = CallByName(JsonObject, "value", VbGet)
For i = 0 To 100 'Orchestratorにあるプロセスが101個を超える場合は値を変更
    If CallByName(CallByName(Value, i, VbGet), "Name", VbGet) = ProjectName Then
        ReleaseKey = CallByName(CallByName(Value, i, VbGet), "Key", VbGet)
        Exit For
    End If
Next

UiPath_RequestReleaseKey = ReleaseKey

End Function

リクエストキー取得の要求を行い、その応答をJSONオブジェクトにします。For文でその中から指定したプロジェクト名のリリースキーを取得します。

ジョブの実行を命令(UiPath_StartJob)

Sub UiPath_StartJob(ByVal Token As String, ByVal ReleaseKey As String)

Dim sURL As String, sHTML As String, Body As String
Dim oHttp As Object

Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
sURL = "ジョブ実行APIのURL"
oHttp.Open "POST", sURL, False
oHttp.setRequestHeader "Content-type", "application/json"
oHttp.setRequestHeader "X-UIPATH-TenantName", "テナント名"
oHttp.setRequestHeader "Authorization", "Bearer " & Token
oHttp.setRequestHeader "X-UIPATH-FolderPath", "Orchestratorのプロセスがあるクラシックフォルダのパス"
oHttp.setRequestHeader "Content-type", "application/json"
Body = "{""startInfo"": {""RobotIds"": [],""Strategy"": ""All"",""ReleaseKey"": """ & ReleaseKey & """,""NoOfRobots"": 0}}"
oHttp.Send Body

sHTML = oHttp.ResponseText '必要に応じてログに出力する仕組みを導入する

End Sub

ジョブの実行を命令する要求を行います。必要に応じて応答を出力するプロシージャなどを作成してログとして出力します。

メールトリガーの仕組みを業務の効率化に活用していただければ幸いです。

Pythonのモジュールを使ってWordファイルからHTMLファイルを作成する方法

RPAエンジニア 大庭

この記事はミツエーリンクス Advent Calendar 2020 - Adventarの12日目の記事です。

今回は、Pythonのモジュールであるmammothbeautifulsoup4を使ってWordファイルからHTMLファイルを作成する方法をご紹介します。

この方法を採用する理由として、mammothを使ってあらかじめ指定したHTML形式でWordファイル内の文章をマークアップできることが挙げられます。それによって、既に構築されているWebサイトのコラム記事などを追加する際に、Wordファイルで原稿を書いてそのHTMLファイルを作成するというやり方が実現でき、さらにHTMLファイル作成までの時間を短縮することができます。

環境は、Windows 10にMicrosoft WordとPython 3.9がインストールされていて、pip(Python向けのパッケージ管理システム)からmammothモジュール、beautifulsoup4モジュールがインストールされているものとします。

また、html要素のパーツ(モジュール)の個別処理にはUiPathを使用します。UiPathはRPA(ロボティック・プロセス・オートメーション)の製品の1つで、「要素をクリックする」「文字を入力する」などのさまざまなアクティビティを組み合わせてワークフローを作り、処理を自動化することができます。UiPathを使うことにより、mammothでは対応しきれないモジュールごとの構成に対応させることができます。例えば、mammothでは出力するhtml要素に指定できるclassは1つのみですが、UiPathを使うことで複数のclassを加えることができます。また、後述するPythonを使った処理もUiPathのアクティビティを使用することで自動化できます。

全体の流れは、

  1. Wordファイルのスタイルを設定する
  2. mammothのカスタムスタイルマップ機能を使用するためのテキストファイルを作成する
  3. mammothでHTMLファイルを出力する
  4. beautifulsoup4でhtml要素のパーツ(モジュール)に分割して出力する
  5. UiPathでモジュールごとに個別処理をしてHTMLファイルを作成する

となります。

UiPath Orchestrator APIを使ってジョブを実行する

RPAエンジニア 大庭

UiPath OrchestratorにはさまざまなAPIが用意されています。その中でもStarting a Jobリクエストを使うことで、UiPath Orchestratorにパブリッシュされたプロセスのジョブを、登録したUnattendedマシンで実行することができます。

Cloud版Orchestratorのクラシックフォルダーにプロセスがある場合、Starting a Jobリクエストをするまでの流れは以下になります。

1. APIを使用するためのAccess Tokenを取得する

あらかじめOrchestrator上でAPIを使用するためのUser KeyとClient IDを取得しておきます。その上で、ヘッダーにテナント名を、本文のパラメーターにUser KeyとClient IDをそれぞれ含んだAuthenticatingリクエストをPOST送信します。するとそのレスポンスのJSONからAccess Tokenを取得できます。

ヘッダー 説明
X-UIPATH-TenantName テナント名を指定
本文のパラメーター 説明
grant_type "refresh_token"と指定
client_id Client IDを指定
refresh_token User Keyを指定

2. プロセス固有のRelease Keyを取得する

取得したAccess Tokenとテナント名をヘッダーに、プロセス名をURLに含んだRetrieving Processes According to Their NameリクエストをGET送信し、レスポンスのJSONからプロセスが持つ固有のRelease Keyを取得します。もしくはプロセス名を指定せずにリクエストをし、すべてのプロセスのRelease Keyを取得してその中から目的のプロセスのRelease Keyを取り出します。

ヘッダー 説明
Authorization "Bearer"の後に半角スペースを入れてAccess Tokenを指定
X-UIPATH-TenantName テナント名を指定

3. Orchestratorにジョブの実行を要求する

Access Token、Release Key、テナント名、プロセスがあるOrchestrator上のフォルダパスをヘッダーに含んだStarting a JobリクエストをPOST送信します。リクエストを送信すると登録したマシンでジョブが実行されます。

ヘッダー 説明
Authorization "Bearer"の後に半角スペースを入れてAccess Tokenを指定
X-UIPATH-TenantName テナント名を指定
X-UIPATH-FolderPath Orchestrator上のプロセスがあるフォルダを指定
本文のパラメーター 説明
startInfo (例){"ReleaseKey": "取得したRelease Key","Strategy": "All","RobotIds": [],"NoOfRobots": 0}

上の例ではStrategyをAllに指定していますが、これはプロセスがクラシックフォルダーにある場合に指定ができます。

この一連の流れを例としてマシンのOutlookのマクロに記述することで、以下のような処理が可能になります。

  1. マシン宛てに特定のメールが届く。
  2. そのメールをトリガーにしてOrchestratorにリクエストを送信する。
  3. Orchestratorに登録したUnattendedマシンでジョブを実行する。

このとき、メールに記載された情報を引数としてプロセスに渡すこともできます。渡し方はStarting a Job with Custom Values for Input Parametersリクエストのページにあるように、InputArgumentsの値の中でプロセスの引数名をキーにして渡したい情報はその値にします。

このように工夫次第でさまざまな自動化ができると思いますので、ぜひ試してみてください。