【UiPath Academy】Level3のデモロボットを作るときの注意点【UiDemo】

#概要
[UiPath Academy](https://academy.uipath.com/)の「Level 3 - Advanced (上級)トレーニング」で、最初に演習として出題されるREFrameworkを活用したUiDemoの自動化について、ドキュメントの説明が絶妙にわかりづらかったので個人的に作成していく中で感じた注意点をまとめています。
作り方を手取り足取り教えるのではなく、公式からダウンロードできる「UiDemo自動化の手引き.pdf」の補完という形なので、「ネタバレやだ！！！！自力で作るの！！！！」という方にも安心…だと思います。

#処理の流れ
###0.最初にやっておくこと
①開発用のマシンとロボットをOrchestratorへ接続しておく
 (Robot、OrchestratorともにCommunity EditionでOKです)
　接続方法はいろはまるさんの[この記事](https://qiita.com/irohamaru/items/a2bbfb4e647f2cb9146b)がとても役に立ちます
②Orchestratorの「キュー」に、今回のデモで使用するキューを作成しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/552bfaab-50c5-aa1e-634c-bba7aff3776c.png)
③理不尽ドキュメントに負けない心を持つ

###1.プロジェクトの作成
最初はプロジェクトの作成です。2ページ目に以下の記載があります。
>プロジェクトをまずは、2つ作成しましょう。
>それぞれに「Dispatcher」と「Performer」という名前を付けます。

ここでまず「プロジェクトとは？」となるかと思います。
ここは律儀に何かしら(プロセスとか)作らず、そのまま読み進めてOKです。

>「Performer」の処理内容に最適な ReFramework テンプレートから作成を始めます。
>Studio の新規作成上にテンプレートとして保存されている「Robotic Enterprise Framework」をクリックし、プロジェクト名を「UiPath_REFrameWork_UiDemo」に変更します。

とあるように、**Robotic Enterprise Framework**の中に作成するよう指示があります。

###2.Dispatcherシナリオの作成
大枠のプロジェクトが作成できたら、まずは自動化の手引きと一緒にダウンロードできるトランザクションファイル(Transactions.xlsx)から各行をキューとしてOrchestratorへアップロードするシナリオを作成します。

ただし、ダウンロードしてきたトランザクションファイルをどこに配置するのかは記載されておらず、
4ページ目でさらっと以下のような記述があります。
>「Dispatcher – UploadQueue」のシーケンスは以下のスクリーンショットの通りになるはずです。

ここに記載の通り、ファイルはプロジェクトフォルダ内のDataフォルダにinputフォルダを作成し、その中に格納するのがベターです。

また、キューアイテムの追加時は**最初にOrchestratorへ作成しておいたキューを指定**しましょう。

###3.Configファイルの編集
Dispatcherシナリオが完成し、無事キューをアップロードできたら次はいよいよそのキューをダウンロードして実処理を行う処理に取り掛かります。
ただし今回は大規模プロジェクト向けのReFrameworkの説明も兼ねて様々な前処理、後処理、エラー処理も含めて作業を行っていくため、Configファイルの編集を行います。

5ページ目に以下の記載があります。
>シート「Assets」上の、QueueName を前回使用した名前と同じものにします。

実際のConfigファイルを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/774b149d-0705-1fca-b046-a247404db7db.png)

そ　ん　な　も　の　は　な　い
また、さらに言えばこの後Dispatcherシナリオを修正するようなステップもないため、今回はこの処理は不要です。
(「Settings」シートに設定したOrchestratorQueueNameで事足ります)

さらに、資格情報の登録が必要ということで記載があり、ご丁寧に「Settings」シートのスクショが貼り付けられていますが、小さすぎて**読めない。**
拡大してみると以下のように記載されています。

| Name | Value | Description |
|:-:|:-:|:-:|
|QueueName|REFramework_UiDemo|   |
|**UiDemoCredential**|**UiDemoCredential_REFramework**|Credential used to log in to UiDemo|

今回は太字にした下の方が資格情報に関する情報なので、下の情報をConfigファイルに記載します。
更に、ここでValueに設定した値と同じ名前でOrchestratorのアセット上にCredential型のアセットを作成します。
（ユーザーIDとパスワードは概略の中に記載されているので自分で確認してください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/00812eb4-310d-ae63-fdb2-678f1ffbc9c8.png)

ここまで終わったら、とりあえずConfigファイルは保存して閉じます。
(開いたままだとロボット実行時にエラーを吐きます)
####アセット名を「Settings」シートに記載する理由
勘のいい方はここで「なぜ資格情報はアセットなのに「Assets」シートに記載しないんだろう」という疑問が生まれるかと思います。
これはREFrameworkの特性で、Assetsシートに記載された情報はInitAllSettings.xamlでGet Asset Value(アセット情報を取得)されますが、ここでは**資格情報は取得されずNullとして返されてしまいます**。
※出力変数がユーザー名、パスワードと2つの情報を取得するための変数ではないため
代わりに、資格情報はGetAppCredential.xamlへアセット名を引数として渡して取得するため、Assetsシートではなく**Settingsシートに記載**します。

###4.UiDemoシステムの起動
ここは特に難しい点はないため、ドキュメントを参照してください

###5.資格情報の取得、ログインフォームへ入力
ここもドキュメント通りで問題ないです。

###6.前処理シナリオにUiDemoを起動する処理を追加する
REFrameworkにデフォルトで存在しているInitAllApplications.xamlに今回使用するアプリケーション(今回はUiDemo)を起動させる処理を追加します。

アプリケーションを起動アクティビティで起動させるアプリケーションを指定しますが、アプリケーションのパスは変動する可能性があるため、アセットに格納するのがベターとの説明があります。
>Orchestrator の Asset を使用することで、値をロボットごとに格納することができます。Asset 名も、環境によって変更する可能性があるため、ハードコーディングは避けるべきです。Config ファイルを使用し。シート「Assets」にAsset 名を次のスクリーンショットの通り書き込みます。

~~日本語が怪しいのは目を瞑り~~Configファイルを再度開き、Assetsシートへドキュメントの通り追記します。
そのあと、必ず**Orchestrator側で同名のアセットを作成しアプリケーションへのフルパスを記載**してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/77ec0778-9dd9-b270-8939-5a38f1097a1b.png)

###7.後処理シナリオにUiDemoをクローズする処理を追加する
ドキュメント上ではわずか2行で語られた部分です。
突然適当になりますが、基本的にスクリーンショットの通りの設定でOKです。
注意点としては、Kill Processではクローズしたいプロセス名を指定する場合は**拡張子なしで指定**します。(以下参照)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/bda711aa-049a-7506-d964-3664d1c29e53.png)

###8.実処理シナリオを作成する
さあいよいよ待ちに待った実処理を作成していきます。
ただし、ドキュメント上で記載がある通りフローチャート型の形で処理を行いたいため、新たにフローチャート型のxamlファイルを作成し、その中に処理を作成していきます。
その場合、必ず**Main.xaml内ProcessTransactionで処理されるワークフローを新しく作成したxamlへ変更**してください。
この処理を忘れるとDispatcherでアップロードしたキュー分虚無を繰り返す悲しいロボットができます。

キューから取得した情報を変数に格納するには、以下の通り説明とスクリーンショットが記載されています。
>シーケンスを作成し、Assign アクティビティを使い、次のスクリーンショットの通り変数の値を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/1b686cda-23d6-e74a-6252-218b7e2473c9.png)

Value側のプロパティなんも見えないね

スクリーンショットが何の役にも立ちませんので、以下の通り記述します。

| 左辺値(To) | 右辺値(Value) |
|:-:|:-:|
|CashIn|in_TransactionItem.**SpecificContent("CashIn").ToString**|
|OnUsCheck|in_TransactionItem.**SpecificContent("OnUsCheck").ToString**|
|NotOnUsCheck|in_TransactionItem.**SpecificContent("NotOnUsCheck").ToString**|

ちなみにこのプロパティの説明についてはUiPathのユーザーズガイド内[キューアイテム (QueueItem) 変数](https://docs.uipath.com/studio/lang-ja/docs/queueitem-variables)に記載があります。

###9.完成！
ここまで出来たら、あとはMain.xamlを実行して動作を見守るのみです。　Orchestratorのキュー監視でちゃんと処理が進んでいるのを見るとちょっと嬉しかったりします。

#最後に
私のように読み替えやドキュメントに記載されていない行間の処理でつまづく人が一人でも減りますように・・・