UiPathのワークフロー実行時に、パラメタを渡す方法あれこれ


UiPath Friends 運営メンバの @masatomixです。こんにちは。
先日、Friends 運営メンバのSlack に下記のような質問をポストしました。

ワークフローの実行時に渡せるパラメタ (Main.xamlに引数として定義されている変数)ですが、OrchestratorからUnattendedに対して「ジョブ実行」するときにはパラメタとして渡すことができますけど、Attended Robotがタスクトレイからワークフローを実行するときには明示的にパラメタって渡せないですよね。皆さんどうしてますか?
コマンドラインから実行する際には下記のとおりできますが、これだとあんましスマートじゃないんですよね。

"c:\Program Files (x86)\UiPath\Studio\UiRobot.exe" 
execute -p プロセス名 --input "{'param1':'value1','param2':'value2'}"

さて、その際いただいた回答が以下のとおり:

AR前提なら引数使わずにワークフロー内でインタラクティブに入力してもらうケースがほとんどです。
積極的に調べたことがないのですが、おそらく無いのではないかと…。
ARですとユーザビリティ重視で作ることが多いので、UR,ARコンパチなワークフローってあまりないかな…。

そもそもARならワークフローの引数でなくてインタラクティブでイイじゃん、ってなるほどね、、。
と思いつつも、ググってもあまり情報がなかったのと、AR/UR共通ワークフローを作った場合も想定して、備忘としてQiitaにメモしておきます。

ちなみに「ワークフローの実行時に渡せるパラメタ (Main.xamlに引数として定義されている変数)」とは下記のことです。ねんのため。

今回あつかうワークフローは上記のようにparam1:String,param2:String を引数にとり、その値をMessageBoxに表示するだけのモノです。ココに値を渡すにはどうやるのか、って話ですね。

前提

UiPath Studio 2019.10.4 Enterpriseで疎通確認しています。UiPath Orchestrator は2019.10.18です。Orchestratorにはさきほどのワークフローが「ArgProject」というプロセス名でリリースされているとします。

ちなみにタスクトレイ上は、ロボットグループ名が後ろについて「ArgProjct_Main」となることにご注意1

TL;DR

  • Unattended Robot のジョブ実行については、OC画面からパラメタを渡せる
  • Attended Robot のタスクトレイからの実行のばあいは、多分パラメタを渡すことはできない。コマンドラインから起動する場合は、渡すことができる
  • Studioについては、パラメタを渡すドライバとなるXaml をつくればできる
  • 参考までに、ジョブは「ジョブ実行アクティビティ」や「Orchestrator API を用いたジョブ実行」などがあるが、APIを用いる場合はパラメタを渡すことができる

などなど。

やってみる

Unattended Robot でジョブ実行する場合

Unattended Robot にてワークフローを実行するケースですが、引数に値を渡すにはジョブ設定画面で値を渡すだけです。シンプル。

実行すると、

OCの画面で渡した情報が表示されています。OKそうですね。

ジョブの結果画面(ジョブ一覧の右の点々 >> 詳細) をみると、、

渡された値まで確認できました。

Attended Robot でタスクトレイから実行する場合

Attended Robot にてWindowsのタスクトレイからワークフローを実行するケースですが、冒頭のとおりどうもパラメタは渡せないっぽいですね。というわけで、この場合はコマンドラインからパラメタを渡すという代替案を検討してみます。

やり方は公式の 「引数の説明 」にありました。具体的には下記の通り。

"c:\Program Files (x86)\UiPath\Studio\UiRobot.exe" execute -p ArgProject --input "{'param1':'コマンドライン1','param2':'コマンドライン2'}"

このように、JSON形式でパラメタを渡すことができるようです。実行してみると、

JSON形式で渡した情報が表示されました。ただジョブ結果画面を見てみると

渡された値は反映されていないようですね、、。うん微妙だ┐('〜`;)┌。。

Studioから実行する場合

ん、Studioはどうするんだっけ。正当(?)にパラメタを渡す方法はなさげなので、テスト用のXaml (ようはドライバですね)を作成して、そこからパラメタを渡せばOKかな。

実行するときは「ファイルを実行」を選択しましょう。「実行」を選ぶとMain.xamlが実行されちゃいますので。

実行結果は、下記の通り。

OKそうですね2

参考: ジョブ実行APIにおけるパラメタ指定方法

Unattended Robotでの実行の派生パタンで、他のワークフローからのジョブ起動を考えてみます。UiPathのフォーラムの 「入力引数を含む複数ジョブのシーケンシャルな起動方法」にて「ジョブを開始」アクティビティはパラメタを渡せないけど、OrchestratorのAPIを使えばパラメタを渡せるよ、というやりとりがあるので、それを試してみます。

「ジョブを開始」アクティビティはパラメタを渡せない図

サンプルをダウンロードして実行

サンプルを下記のGitHubに置きました。
https://github.com/masatomix/startJobSample
最近の UiPath StudioはGitHubから直接ダウンロードできる ので、落としてみてください。

さてダウンロードしたワークフローは

  • プロセス名(ArgProject_Main)を指定して、プロセスを特定するキー値を取得
  • そのキー値を用いてジョブを起動する
  • その際にパラメタも渡す

というサンプルになっています。

全体の処理シーケンス

ジョブ起動部分(StartJob.xaml)の詳細。JSON文字列を構築し「OrchestratorへのHTTP要求」にてAPIを呼び出して、ジョブを起動しています

「OrchestratorへのHTTP要求」アクティビティでAPIを呼び出す際には、JSON形式で文字列データを渡します。上記のキャプチャ上の「jsonStr」変数ですね。
実際に渡しているのは下記のようなデータで「InputArguments」の部分が、ワークフローに渡されるパラメタになります。

{
  "startInfo": {
    "ReleaseKey": "04b0fd32-cc25-42a4-a5bc-xxxxxxxx",
    "Strategy": "All",
    "NoOfRobots": -1,
    "Source": "Manual",
    "InputArguments": "{\"param1\":\"パラメタ\"}"
  }
}

InputArguments」の部分は、Attended Robotの引数に渡していたデータと形式ですね。一応ですが実際は{"param1":"パラメタ"}というデータなのですが、「"〜"」 の中でさらに「"」を用いるため、\ でエスケープしています。

さて、このJSON文字列を構築するのに、下記の通り文字列操作をゴリゴリやっても良いのですが、


こんな感じでうんざりしそうなので、Dictionaryを使ってオブジェクトを構築し、最後に「Newtonsoft.Json.JsonConvert.SerializeObject()」メソッドを使ってオブジェクトをJSON文字列化するといくぶん楽かもしれません。


さて、こちらのワークフローを実行してみるとOrchestratorにジョブが投入され、結果として先ほどのワークフローが動き出します。


よさそうですね。OC画面上も


OKでした。

-- 2020/07/03追記 --

そういえば「OrchestratorへのHTTP要求」アクティビティでAPIを呼び出す際には、Orchestrator上でロボットたちに適切な権限を付与する必要がありました。今回のジョブの起動については、「プロセスの閲覧」と「ジョブの作成」が必要です。デフォルトでは多分OFFになっているので、その権限を追加します。

やりかたは、

  • ユーザ >> ロール >> Robot >> 右部の点々から 編集

を選択し、下記のポップアップで「プロセスの閲覧」と「ジョブの作成」にチェックを入れて「更新」をクリック、です。

-- 2020/07/03追記 以上 --

以上、ワークフローの引数に情報を渡す方法でした。おつかれさまでしたー。

関連リンク


  1. APIに渡すときとか、あれどっちだっけ?ってなるヤツ 

  2. あちなみに、Studioからの実行はジョブ結果画面には記録されません。