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

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の値の中でプロセスの引数名をキーにして渡したい情報はその値にします。

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

PowerPointの特定のテキストボックスからテキストを取得する方法

RPAエンジニア 大庭

PowerPointのスライドにあるテキストを抜き出したいとき、手動で行う場合はそのテキストボックス内のテキストを選択し、コピーする作業を繰り返し行う必要があって大変ですが、UiPathを使って自動化することができます。今回は、この作業をUiPathで行う場合の方法をご紹介します。

準備として、PowerPointのテキストボックスの名前を確認します。

  1. PowerPointのウィンドウ上部にあるリボンの「ホーム」タブの「図形描画」グループにある「配置」をクリックし、表示されたリスト内の「オブジェクトの選択と表示」をクリックします。または、リボンの「ホーム」タブの「編集」グループにある「選択」をクリックし、表示されたリスト内の「オブジェクトの選択と表示」をクリックします。実行すると、ウィンドウ右側に「選択」ウィンドウが表示され、ここでスライドごとに含まれているオブジェクトの名前が確認できます。

  2. 「選択」ウィンドウが表示された状態で、中央の「スライド」ウィンドウ内の目的のテキストボックスをクリックすると、「選択」ウィンドウの該当するテキストボックスの名前が選択された状態になるので、名前を確認できます。また、名前をクリックすると変更できる状態になるので、テキストボックスの名前を変更することもできます。

ここからはUiPathでのロボットのフローを説明します。

  1. 予め確認した複数のテキストボックスの名前を配列型変数などに格納しておきます。

  2. 繰り返し(コレクションの各要素)(UiPath.Core.Activities.ForEach)アクティビティを使い、1.の配列型変数をコレクションに指定します。

  3. For Each(繰り返し(コレクションの各要素))アクティビティのスコープ内でフルテキストを取得(UiPath.Core.Activities.GetFullText)アクティビティを使います。そのセレクターを「スライド」ウィンドウのテキストボックスの要素の動的セレクターにします。具体的には、セレクターの「name」属性の部分をFor Each(繰り返し(コレクションの各要素))アクティビティのitem変数で置き換えます。注意点として、UI Explorerを開いて親要素である「スライド」ウィンドウのセレクターを追加しておく必要があります。こうすることで、UiPathが「選択」ウィンドウ内のテキストボックスの要素ではなく「スライド」ウィンドウ内のテキストが含まれるテキストボックスを指定の要素として認識します。また、出力に適当な変数を指定します。

  4. 3.で出力した変数を1行を書き込み(System.Activities.Statements.WriteLine)アクティビティで出力し、テキストボックス内のテキストが出力されていることを確認します。

参考として、子要素を探す(UiPath.Core.Activities.FindChildren)アクティビティを使うことで、「選択」ウィンドウからテキストボックスの名前を取得する処理も自動で行うことができます。その場合、取得した子要素のコレクションをFor Each(繰り返し(コレクションの各要素))アクティビティで指定し、そのスコープの中で属性を取得(UiPath.Core.Activities.GetAttribute)アクティビティを使い、要素の「name」属性、つまりテキストボックスの名前を取得します。後は上記と同じように、その名前をGetFullText(フルテキストを取得)アクティビティで「スライド」ウィンドウのテキストボックスの要素の動的セレクターに代入します。

この方法で、UiPathでPowerPointのファイルを扱うロボットを開発してみていただければ幸いです。

ロボットの実行ログとして残したい情報

RPAエンジニア 小林

ロボットを扱っていて思ったように動作しないとき、どのように動いたか、どこまで処理が進んだのかという動作の道筋を見たいときがあります。UiPathでロボットを実行した場合、自動でログファイルに情報が書き出されますが、知りたい情報によっては自分で別のファイルに書き出すほうが便利です。今回は自分用(あるいはチーム用)のロボット実行ログを書き出すにあたって、どのような情報を出力したらよいか考えてみます。UiPathを例に話を進めますが、他のRPAでも共通して使える考え方です。

なお、UiPathで通常「ログファイル」と言えばUiPath Studioの「ログを開く」ボタンからアクセスできる実行ログを指しますが、以下では「ロボット開発者が動作記録のために成果物とは別に書き出すファイル」を「ログファイル」と呼びます。ログファイルの書き出し形式は開発者が扱いやすい形式で構いませんが、基本的には文字列を追加書き込み(UiPath.Core.Activities.AppendLine)アクティビティを使ってテキストファイルに追記していく方法が便利です。

実行時の状況を再現するための情報

ロボットがどのような環境で何を操作したのかがわかると後で状況が再現しやすくなります。また、過去に正常に動作したときの記録があれば、エラーが起きてしまっても設定を見比べて手がかりを得ることができます。具体的には、以下のような情報を残しておくと良いでしょう。

Workflow Inspectorを使ってみよう

RPAエンジニア 大庭

先日、UiPathコーディング規約とワークフロー品質評価キットがUiPathの公式サイトで公開されました。そのワークフロー品質評価キットの中に、UiPath Go!のサイトからダウンロードできるWorkflow Inspectorがあります。これは、開発したプロジェクトの品質を自動で検査し、レビューをしてくれるツールです。

Workflow InspectorはUiPath Studioプロジェクトとして提供されていて、このプロジェクトをUiPath Studioで開いて実行し、表示されるウィンドウで評価したいプロジェクトのフォルダを指定すると、その評価レポートがExcelファイルとして出力されます(Microsoft Excelをインストールしている必要があります)。

チェック項目としては、

  • 命名規則違反(デフォルトでは変数及び引数がアッパーキャメルケースかどうかを判定するようです)
  • 複数の同じ表示名(表示名に重複がないかどうか)
  • 未使用の変数(作成した変数の中にワークフローで使用されていないものがあるかどうか)
  • 必要最小限でない変数のスコープ(変数のスコープが適切かどうか)
  • 不必要なシーケンスやフローチャート(空のシーケンスやフローチャートがないか、もしくは1つのアクティビティのみなのにシーケンスやフローチャートで囲っていないか)

などがあり、全部で24項目あります。これらは、ダウンロードしたWorkflow Inspectorの「WorkflowInspector\Config\JP」フォルダ内にある「Checklist.xlsx」で確認や設定ができます。なお、「ワークフローの命名規則」の項目だけはデフォルトでは検査しない設定になっています。

レビューの結果は「WorkflowInspector\Reports」内に保存されます。この結果を見て適宜修正することでより品質の高いワークフローができます。

ロボットを再利用するときやチームで共有するときなどには、ロボットの可読性や保守性、安定性はより一層重要になってきます。今回ご紹介したWorkflow Inspectorを使うことでプロジェクトの品質管理がしやすくなります。そしてチーム全体でUiPathコーディング規約を理解してワークフロー品質評価キットを使うことで、プロジェクトの生産性をより向上させることができるのではないかと思います。