【UiPath Apps】Excelをデータテーブルにして動的フォームを作成する

今回の記事では、前の質問に応じて回答が変更される動的なフォームを作成します。一番簡単な実現方法はAppsとの連携が簡単なData Serviceの機能を利用することです。ただ今回はExcelをデータテーブルにして実現します。

前回の記事でも同様にAppsとStudio Webを使ってExcelをデータテーブルにした自動化を実現しているのでぜひ参考にしてください！

https://qiita.com/kumatech/items/2d8262cf3f22caa46fc6

<H2>開発環境</H2>
ワークフロートリガーを利用するため、23.10以上のStudioがあれば本記事で行った開発を実施することができます。また、記事内でご紹介したStudioの式生成機能を利用する場合にはStudio24.10以上のStudioを用意してください。


<H2>今回作成するもの</H2>
今回はオフィス用品を発注するためのフォームを作成します。分類と商品名の項目があり、分類の選択結果に応じて商品名のプルダウンの選択肢が変わる仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/5d54106f-88c2-42fb-c072-d2e6e6b63e2d.png)


今回は前回と異なり **ワークフロートリガー** の機能を使ってStudioで作成したワークフローを呼び出します。

https://docs.uipath.com/ja/apps/automation-cloud/latest/user-guide/rule-trigger-workflow

[ワークフローをトリガー] の機能はボタンをクリックしたときにあらかじめ作成したプロセスを呼び出し、結果を取得してアプリの画面に即時に反映させることができます。この機能を用いて、動的に変化するフォームを作成しましょう！


<H2>事前準備</H2>
以下のテキストをコピーしてオフィス用品リストという名前のExcelをデスクトップに作成しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/a7125c98-0f16-f4d8-3854-b9b749d7e3a7.png)

| 商品名 | 分類 | 単価 |
|:-----------:|:------------:|:-----:|
|文具           |ボールペン    |100   |
|文具           |ノート        |200   |
|文具           |ホッチキス    |300   |
|文具           |蛍光ペン      |150   |
|文具           |消しゴム      |50    |
|PC周辺機器     |マウスパッド  |500   |
|PC周辺機器     |USBメモリ     |1000  |
|PC周辺機器     |ヘッドセット  |3000  |
|PC周辺機器     |LANケーブル   |800   |
|PC周辺機器     |マウス        |1500  |
|紙製品         |コピー用紙    |1000  |
|紙製品         |付箋          |200   |
|紙製品         |メモ帳        |150   |
|紙製品         |ファイル      |300   |
|紙製品         |クリアファイル|100   |
|オフィス家具   |デスクライト  |3000  |
|オフィス家具   |デスクトレー  |1000  |
|オフィス家具   |ペン立て      |500   |
|オフィス家具   |ゴミ箱        |1000  |
|オフィス家具   |カレンダー    |800   |


<H2>表示画面の編集</H2>

Appsからタイトルをつけてアプリを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/7678aa30-db69-d737-1fb4-e9cd8bc60348.png)

今回も前回同様、テンプレートのフォームDを選択しました。入力項目にはプルダウンが2つだけが残るようにします。表示名に合わせて項目名もそれぞれCategory、Itemに変更しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/18a86ff7-7111-a062-587b-6dc32c8b6269.png)

<H2>オートメーションの構築</H2>
表示画面ができたので次は裏で動くワークフローを作成します。

<H4>1．テンプレートを利用</H4>
あらかじめ用意されているテンプレートを使用して開発を進めます。Studioのトップ画面からテンプレートに進み、Appsと検索してください。Apps-Workflow communicationというテンプレートが出てくるのでそれを利用していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/b41b530e-93ab-7941-8a44-d193d7989923.png)

もし検索しても出てこない方はMarketplaceより取得して利用してください。

https://marketplace.uipath.com/listings/apps-workflow-communication-template

https://docs.uipath.com/ja/studio/standalone/2024.10/user-guide/workflow-from-a-template

ワークフローの名前はRetrieveExcelDataとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/f69f413e-c967-41fe-7508-177028fbc713.png)


<H4>2．Excelデータ取得ワークフロー</H4>

Excelのデータを読み込む1つ目のワークフロー、**01_ReadExcelData.xaml** を作ります。
Studioの画面左上から[新規]をクリックし、新しいシーケンスを作り名前を付けます。作成したら左のプロジェクトパネル上で表示されるので、後でわかりやすいようにInvokedWorkflowsのフォルダに移動させます。またファイルを右クリックして、**[エントリ ポイントを有効化]** をクリックしてください。この工程を忘れると後でAppsで参照できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/a7871606-0ce7-8790-43af-8047922b9bc3.png)

先に引数を二つ作ります。
| 引数名 | 方向 | 引数の型 |
|:-|:-:|:-|
| outDataTable | Out  | System.Data.DataTable |
| outCategoryList | Out  | System.Collections.Generic.List<System.String>  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/9c885c00-9473-9fd1-c98a-49ab568570c0.png)


続いて[Excelファイルを使用]と[範囲を読み込み]の二つのアクティビティを配置して、Excelのデータを読み込みます。読み込まれたデータテーブルは先ほど作成した引数に保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/4bd80199-2e40-a94c-99e0-5935d78a01cf.png)

:::note info
Excelプロセススコープのプロパティから[Excelウィンドウを表示]の設定をオフにすることでワークフローを呼び出し時にExcelが開かれず、より高速に通信できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/510b1359-94dc-9531-8d9a-1d86b21b013a.png)
:::

次にプルダウンに分類の一覧を表示させるためにExcelの2列目をリスト型として出力します。[代入アクティビティ] を配置し、左辺には先ほど作成したoutCategoryListを使用します。右辺を設定するために式エディターを開きます。
1列目をリスト形式で出力する式は複雑なため、生成AIに式を作ってもらいましょう。

> **outDataTableの1列目をリスト形式に変換して**

これだけで十分な式を作ってくれました。素晴らしい！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/99586e10-e9bc-4bf4-7b17-8c721060c689.png)

ただこのリストのままでは分類が複数含まれてしまいます。
| 分類 |
|:-|
|文具           |
|文具           |
|文具           |
|文具           |
|文具           |
|PC周辺機器     |
|PC周辺機器     |
|PC周辺機器     |
|PC周辺機器     |
|PC周辺機器     |
|紙製品         |
|紙製品         |
|紙製品         |
|紙製品         |
|紙製品         |
|オフィス家具   |
|オフィス家具   |
|オフィス家具   |
|オフィス家具   |
|オフィス家具   |

一意の値だけ取得できるように追加のプロンプトを渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/9d3241c7-1c62-b4e5-a394-784301af1b48.png)

これも自然言語で式を指定するとうまく一意の値だけ取れました！
| 分類 |
|:-|
|文具           |
|PC周辺機器     |
|紙製品         |
|オフィス家具   |

保存して1つ目のワークフローは完成です。

<H4>3．データテーブルのフィルターワークフロー</H4>

1つ目のプルダウンでは分類を選択しました。次は1つ目の分類の選択結果に応じて、2つ目のプルダウンの選択肢を変えるためのワークフロー、 **02_FilterTable.xaml** を作成します。先ほどと同様にシーケンスを作成して**エントリポイントを有効化** してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/cd4e8bc8-b1d9-e2dd-7f3b-e527aaaacb9e.png)

引数は3つです。
先ほど読み込んだテーブルと1つ目のプルダウンで選んだ選択肢を引数として渡し、その分類と一致するアイテム名を出力します。

| 引数名 | 方向 | 引数の型 |
|:-|:-:|:-|
| inDataTable | In  | System.Data.DataTable |
| inCategoryName | In  | System.String |
| outItemList | Out  | System.Collections.Generic.List<System.String>  |

変数も1つ作成します。
| 変数名 |　変数の型 |
|:-|:-|
| FilteredTable | System.Data.DataTable |

変数と引数の設定ができたら[データテーブルをフィルター] アクティビティを配置し、[データテーブル]の項目には、先ほど作成したinDataTableを設定します。[フィルターを設定]から、フィルタの左辺には先ほど同様、AIに式を生成してもらいます。

> **inDataTableの1列目**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/fd1f70c9-1d3c-8eb2-bee6-a62f00230095.png)
    
右辺には、inCategoryNameにします。これによって1つ目のプルダウンで選択された値、つまりinCategoryNameと一致するデータのみが残ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/04bf7026-8923-e811-509e-e914153bbf6e.png)

最後にデータテーブルをリスト形式に変換します。[代入]アクティビティを配置し、左辺にはoutItemListの引数を設定します。右辺の式は生成AIに作ってもらいます。

> **FilteredTableの2列目をリスト形式に変換して**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/925712df-0602-95ad-ad29-8ee8686bbebb.png)

これでワークフローの作成は完了です！

<H4>4．ワークフローのパブリッシュ</H4>
パブリッシュして、Orchestratorにデプロイしておいてください。
下記の記事の「Studioからオートメーションプロジェクトのパブリッシュ」と「プロセス登録」の項目が完了すればOKです。

https://qiita.com/hamam/items/f6779e91253f26fcab40#studio%E3%81%8B%E3%82%89%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%B7%E3%83%A5


<H2>アプリとオートメーションの連携</H2>

アプリにワークフローを起動するルールを作成します。

1. アプリを読み込み時　→　01_ReadExcelData.xamlを呼び出し
2. 分類のプルダウンを選択時　→　02_FilterTable.xamlを呼び出し



<H4>アプリを読み込み時のルール設定</H4>

事前に作成したワークフローをアプリで参照できる状態にしておいてください。

https://docs.uipath.com/ja/apps/automation-cloud/latest/user-guide/connecting-your-app-to-an-orchestrator-tenant


準備ができたら画像のように左のパネルから一番上の階層を選択した時に右側のパネルに表示させるルールを作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/88c56347-0e22-dfd4-bd9c-3b474d321745.png)

[ワークフローをトリガー] のルールを配置して、01_ReadExcelData.xamlを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/6e9a110c-29e0-afd4-1be6-37bd71b84ee7.png)

これで1つ目のワークフローの準備は完了です。

<H4>ワークフローの結果を分類のプルダウンに設定</H4>
01のワークフローから出力されたoutCategoryListを分類のプルダウンのリストに当てはめてみましょう。方法は簡単です。分類の項目を選択して、[リストのソース]を見つけます。
プロセス > InvokedWorkflows_01_ReadExcelData_xaml > outCategoryListの順番で選択するとリストを設定することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/ac0aebb7-7ada-f2da-5590-63eb17aefcec.png)

<H4>分類のプルダウンを選択時のルールを設定</H4>
分類のプルダウンが選ばれたときに、選択された値に応じて次の商品名のプルダウンの選択肢を変更できるようにします。そのためには、分類のプルダウンが変更されたときにワークフローを起動します。分類のボタンが選択された状態で、[ルールを編集] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/96305a65-306b-d32a-2df3-37556efe0a0b.png)

[ワークフローをトリガー] のルールを配置して、02_FilterTable.xamlを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/379443f0-da62-4c1c-44ac-3b7c5008e509.png)

[入力の上書き] からワークフローの引数を設定します。

**①inDataTable**

左辺には、02_FilterTableのinDataTableを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/b5f9ac24-7860-484f-c2f0-896689a0e2c3.png)

右辺には、01_ReadExcelDataのアウトプットを出力を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/097e92f8-79ac-8a64-b297-92076a28e773.png)

**②inCategory**
左辺には、02_FilterTableのinDataTableを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/938fb37d-b06b-68a7-3a99-2bf5d585d7b8.png)

右辺には、分類のプルダウンで選択された値を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/955f6d54-3d40-7e67-a7fe-66f75c3d1523.png)

<H4>ワークフローの結果を商品名のプルダウンに設定</H4>
最後の工程です。02のワークフローの結果を商品名のプルダウンのリストのソースとして設定します。02のワークフローのアウトプットであるoutItemListをリストのソースに代入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/e2a92db5-0bb8-3c33-40e3-9b0db7efeb7e.png)

これですべての開発が完了しました！

<H2>プレビュー</H2>

最後に動作を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/422d6bc8-7942-62f7-f3c9-04b5952e5594.png)

紙製品を選択すると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/32beb765-0d6c-df8d-93f8-0cb01b44d47f.png)

無事に紙製品の商品だけ表示されるようになりました！
少しラグを感じるかもしれませんが、そこまで違和感はないです。

<H4>最後に</H4>

今回はローカルのExcelファイルをデータテーブルとしてアプリを作成しました。ほかの人にもこのアプリを使ってもらう場合には、ワークフローの中で、共有のファイルサーバーに置いたExcelファイルをダウンロードする処理を追加するとよいかもしれません。スプレッドシートなどでも作成可能です。
ぜひ今回のアプリをベースにカスタマイズした素敵なアプリを作ってみてください！