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

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

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

```console
"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に引数として定義されている変数)」とは下記のことです。ねんのため。
![param](https://imgur.com/9obS9Km.png)

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


## 前提

UiPath Studio 2019.10.4 Enterpriseで疎通確認しています。UiPath Orchestrator は2019.10.18です。Orchestratorにはさきほどのワークフローが「``ArgProject``」というプロセス名でリリースされているとします。
![p00](https://imgur.com/fiNoo5i.png)
![p0000](https://imgur.com/dGtjyzm.png)

ちなみにタスクトレイ上は、ロボットグループ名が後ろについて「``ArgProjct_Main``」となることにご注意[^1]。
![p000](https://imgur.com/uEnnCnu.png)

[^1]: APIに渡すときとか、あれどっちだっけ？ってなるヤツ

## TL;DR

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

などなど。

## やってみる

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

Unattended Robot にてワークフローを実行するケースですが、**引数に値を渡すにはジョブ設定画面で値を渡すだけ**です。シンプル。
![p01](https://imgur.com/4MtqWJQ.png)

実行すると、
![p02](https://imgur.com/G24LI1c.png)

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

ジョブの結果画面(ジョブ一覧の右の点々 >> 詳細) をみると、、
![p03](https://imgur.com/BFNcHti.png)

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



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

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

やり方は公式の 「[引数の説明](https://docs.uipath.com/robot/lang-ja/v2019/docs/arguments-description) 」にありました。具体的には下記の通り。

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

このように、JSON形式でパラメタを渡すことができるようです。実行してみると、
![p04](https://imgur.com/8ra9wWs.png)

JSON形式で渡した情報が表示されました。ただジョブ結果画面を見てみると
![p05](https://imgur.com/yA69xrx.png)

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

### Studioから実行する場合

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

**実行するときは「ファイルを実行」を選択**しましょう。「実行」を選ぶと``Main.xaml``が実行されちゃいますので。
![p07](https://imgur.com/2fGhCuX.png)

実行結果は、下記の通り。
![p08](https://imgur.com/M6iB9lb.png)

OKそうですね[^2]。

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


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

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

「ジョブを開始」アクティビティはパラメタを渡せない図
![p09](https://imgur.com/fcUMhd9.png)



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

サンプルを下記のGitHubに置きました。
https://github.com/masatomix/startJobSample
最近の [UiPath StudioはGitHubから直接ダウンロードできる ](https://qiita.com/masatomix/items/cb9c265f1d8010bed50b#studio%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99git%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99)ので、落としてみてください。

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

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

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

全体の処理シーケンス
![p10](https://imgur.com/OoT9NKb.png)

ジョブ起動部分(``StartJob.xaml``)の詳細。JSON文字列を構築し「OrchestratorへのHTTP要求」にてAPIを呼び出して、ジョブを起動しています
![p11](https://imgur.com/yfQMqi1.png)

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

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

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

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

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


![p13](https://imgur.com/4M5vaM2.png)
さて、こちらのワークフローを実行してみるとOrchestratorにジョブが投入され、結果として先ほどのワークフローが動き出します。

![p14](https://imgur.com/JwmpJWa.png)
よさそうですね。OC画面上も

![p15](https://imgur.com/o7p99xq.png)
OKでした。

-- **2020/07/03追記** --

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

やりかたは、

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

を選択し、下記のポップアップで「プロセスの閲覧」と「ジョブの作成」にチェックを入れて「更新」をクリック、です。
![role](https://imgur.com/AiPmjTE.png)

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



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


## 関連リンク

- 「[入力引数を含む複数ジョブのシーケンシャルな起動方法](https://forum.uipath.com/t/topic/227049)」
- [引数の説明](https://docs.uipath.com/robot/lang-ja/v2019/docs/arguments-description) 
- [JavaScript API Wrapper を用いたサンプル](https://github.com/masatomix/uipath-orchestrator-api-node/tree/develop/src/samples/job)
- [UiPath StudioはGitHubから直接ダウンロードできる ](https://qiita.com/masatomix/items/cb9c265f1d8010bed50b#studio%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99git%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99)