【UiPath Apps】UiPath AcademyのレガシーサンプルをWindows11で動かしてみた（1/2)

## サマリー
UiPath AcademyでAppsについて学び、Windows11でサンプル「UiPath Bank Teller Application」を実行してみましたが、動作しませんでした。学習を兼ねて修正を行い、動作するようにしました。

UiPath Studioを使って開発をしたことはあるけれど、Appsは初心者の方向けの記事です。

## 環境
作成していた時期は2025年2月です。
UiPathはコミュニティエディション、Studioは2025です。
PCのOSはWindows11です。

## アカデミーのAppsサンプル構成
- Apps：「UiPath Bank Teller Application」
- プロセス（アテンデッド）：GetAccountDetails、BankTellerCustomerDetails、BankTellerGetRisk、BankTellerDeferProcess
- 操作対象：レガシーアプリケーション（ローンの管理を行う黒画面アプリ）

Appsからプロセスを呼び出し、プロセスがレガシーアプリケーションを操作します。
Appsで入力された値をプロセスの入力引数とし、出力引数をAppsで参照します。

![Apps構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053584/cc111a7b-d2b2-457a-84d1-b5636bed16c7.png)

## 事前準備
UiPathアカデミーからダウンロードした4個のnupkgを、オーケストレータ―のAttendedフォルダーにアップロードし、プロセス登録しておきます。
同じくレガシーアプリケーションをダウンロードし、PCに配置しておきます。

## Apps作成
UiPathアカデミーの動画を見ながら、UiPath Bank Teller Applicationを作成しました。
2個のページを持ち、各ページのボタンから、プロセスを呼び出す構成です。ワンクリックで複数のプロセスを呼び出すこともできます。

![サンプル構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053584/8cc4ca78-9041-4dd6-8633-6a883660d1f4.png)

### アカデミーの動画と異なっていた点
- テキストボックスはラベルとセットになっており、ラベルとテキストボックスを別々に追加する必要はありませんでした
- スイッチ（トグル）には、ロボットの出力変数をバインドできませんでした。そこで、テキストボックスに変更しました。式エディタ―でプロセスの出力引数の値から条件分岐でメッセージを出し分けできます
- プロセスのReportStatusアクティビティに設定した値を、Appsのスピナーで受け取る方法がわかりませんでした　→Assistantには表示されますので、実装対象外としました

![スイッチの代替.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053584/cd1e39a2-7b37-4219-9d53-5f47da5ba8cb.png)

## 「UiPath Bank Teller Application」に何を入力するか
レガシーアプリケーションのフォルダーにある、TerminalDb.xlsx　を開いて眺めると、データの構造が見えてきます。
- Cutomersシートは、顧客一覧です
- Productsシートは、顧客が保有するローンの一覧です
- 2つの一覧表を結びつけるのは、CustID列です
- 普通口座（ACCOUNT）と、カーローンや住宅ローンは同じデータ列を持ちますが、扱いが異なります。ローンは繰延できますが、普通口座は繰延できません。

![Productsシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053584/cbd2a807-5ad4-4460-9a92-2cb6b099337f.png)

1. Account Details（口座の詳細）ページで入力するのは、Productsシートの、ProductType（商品タイプ）列がACCOUNTである行のContractNumber（契約番号）列です
1. Defer Process（ローン繰延）ページの画面右上、CustomerID（に入力するのは、CustomersシートのCustomerIdentification（顧客ID）列です
1. Defer Process（ローン繰延）ページの画面下部、Contract Number（契約番号）に入力するのは、Productsシートの、ProductType（商品タイプ）列がACCOUNTではない行の、ContractNumber（契約番号）列とproductType（商品タイプ）列、そして繰延月数を整数で入力します

※レガシーアプリケーションがエラーにならないように、実行する前にはすべてのExcelを閉じました

## 動作状況
1. レガシーアプリケーションが起動しない
→　C:\の直下にDEMO_APPフォルダーを配置することが前提でした。配置場所を誤っていました。

1. レガシーアプリケーションが、実行中に終了してしまう
→　^A^Cと表示されて終了します。

レガシーアプリケーションは、黒画面にテキストを表示する、懐かしい見た目のアプリケーションです。Webシステムのように、セレクターを取得して商品名や契約番号をピンポイントで取得することができません。そこで、Ctrl+AとCtrl+Cでクリップボードを経由して画面全体の文字列を取得し、必要な情報を抽出しています。しかし、Ctrl+Cは黒画面において終了コマンドとして機能します。

手操作を行ってみると、Ctrl+Shift+A→Ctrl+Shift+Cにより、終了することなく操作できました。

※レガシーアプリケーションのIDとパスワードは、TerminalDb.xlsxのSystemシートに書いてあります

## ワークフロー修正
### 準備
アカデミーからダウンロードした4個のnupkgを、拡張子zipに変更して展開しました。Windowsレガシでしたので、lib\net45フォルダーからxaml等のプロジェクトファイルが取り出せました。

project.jsonをテキストエディタで開いてみると、"studioVersion": "20.10.2.0"でした。
コミュニティエディションのStudioはUiPath Studio2025です。Studioからプロジェクトを開くと、WindpowsレガシはWindowsに自動変換されます。

4個のプロジェクトのうち、変換成功2個、失敗2個でした。
正攻法があるかとは思いますが、今回採用したのは、以下の簡易な方法です。

変換できたMain.xamlを見てみると、Main.xamlからサブのxamlを呼び出す構造です。
サブのxamlは、ファイル名から4個のプロジェクトで共通であることが推測されました。
Main.xaml以外のxamlを、変換成功したプロジェクトから変換失敗したプロジェクトに上書きコピーしました。

### 修正
1. Ctrl+AとCtrl+Cを、Ctrl+Shift+AとCtrl+Shift+Cに変更しました
1. レガシーアプリケーションのウィンドウセレクターを再取得しました
1. GetCustomerDetails.xamlの複数代入の右辺に、トリミング関数.Trimを追加しました
1. オーケストレータ―にパブリッシュして、プロセスを最新バージョンにしました
1. Assistantから実行し、エラーが出ないことを確認しました

.Trimを追加するのは、Apps画面に表示された出力引数の末尾に、空白が残っていたためです。Appsに表示された値を流用する場合、Apps側で空白を削除するより、プロセスで削除するほうが、全体の手間が少ないです。

## Appsを動かしてみる
Appsをプレビューし、実行したところ、想定の動作ができました。

![改修前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053584/6f4e4272-3127-454c-ae19-4e038c575f5c.png)

### 改善アイディア検討
- バインドしたテキストボックスは、コピーペーストができませんでした。ローンを複数保有している顧客の場合、繰延するローンの情報を目視で転記するしかありません。間違えるとリカバリーに時間を要します。
- テキストボックスをバインドや無効化（編集不可）することにより、文字が薄い灰色の斜体字になるのが見づらく感じました。
- 実行開始時にスピナーをON、完了時にOFFだけですと、エラーのときはスピナーがぐるぐる表示され続けます。

次の記事に、改修の内容を掲載します。