【UiPath】Integration Serviceをワークフローで使ってみる

# はじめに
以前、Integration Serviceを使用して、外部のSaaSをトリガーにしたUiPathのジョブ起動の方法を記事にしました。

https://qiita.com/shuy/items/f227d7c007441fdd1394

今回は、ワークフロー内からIntegration Serviceを使用してみます。

# つかうもの
※クラウド環境は2022年5月時点のもの

* UiPath Automation Cloud(Integration Service) Enterprise版
* UiPath Studio 2022.4.1

# コネクションを作る
前回と同様です。今回もSalesforceのコネクションを作ります。
![コネクション1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/98c8e35a-d69e-2f05-c0e9-d56a87fe5fab.png)

# アクティビティパックをインストールする
ワークフローからIntegration Serviceを使用するには、専用のアクティビティが必要です。
パッケージ管理から「IntegrationService」で検索すると、SaaS個別にいくつかのアクティビティパックがヒットするので、今回使用するSalesforceのアクティビティ（UiPath.Salesforce.IntegrationService.Activities）をインストールします。
![パッケージ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/433aac7d-4874-27fe-d92f-9bd9e5d27776.png)

インストールすると以下のようなアクティビティが追加されます。
![パッケージ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/6df0057b-5e84-be82-fa6c-9b21bd633580.png)

|アクティビティ|説明|
|-|-|
|Delete Record|特定のレコードを削除します|
|Get Record|特定のレコードを取得します|
|Insert Record|レコードを新規作成します|
|List All Records|条件に合致するレコードを全件取得します|
|List Records|条件に合致するレコードを全件取得します（ページ分割します）|
|Update Record|特定のレコードを更新します|
|Salesforce Scope|上記アクティビティはこのアクティビティの中で使用します|

Salesforce以外のアクティビティも基本構成は似た感じです（以下は、Service Nowのアクティビティ）。
![パッケージ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/9e9fb333-7825-4efb-5800-a78d51d8c573.png)

# アクティビティを使う
インストールしたアクティビティを使ってみます。

## Scopeアクティビティ
まずは、SaaS別のアプリケーションスコープアクティビティを配置します。Salesforceの場合は、「Salesforce Scope」アクティビティとなります。
![実装1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/b21e1788-271f-2bab-bde8-c16bb69014ac.png)

アクティビティの「Configure」ボタンを押すと、コネクションを選択できるダイアログが表示されるので、先ほど作成しておいたコネクションを指定します。
![実装2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/ce6296e1-c374-2d30-29bf-a0905b7c83ba.png)

## ListRecordsアクティビティ
ListRecordsアクティビティは、SaaSからデータを取り出すだめのアクティビティです。GetRecordとは異なり、複数件数のレコードを取得することができます。
SQLみたいに指示することができます。
![実装3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/184d64cc-3c82-5dcf-d175-9152ac4acfc4.png)

ListRecordsアクティビティの「Configure」ボタンを押すと、クエリを設定できるダイアログが表示されます。
whereの箇所はSQLのように条件式を書くことができます。なお、フィールドの物理名を知っている必要があります。
取得するフィールド（SQLでいうSelect）は選択できないようです。全フィールドを取ってくる仕様のようです。
![実装4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/b335adc5-cede-ce2b-4ef2-0e5e348d5350.png)

|項目|方向|説明|
|-|-|-|
|Select Object|IN|取得対象のオブジェクト。カスタムオブジェクトも指定可能|
|includeDeleted|IN|論理削除されたレコードを取得対象に含めるかどうか|
|nullsLast|IN|Null値のソート順。Null値を先頭にするか最後尾にするか|
|orderBy|IN|ソート順。Asc（昇順）、Desc（降順）|
|Page Token|IN|取得したいページのトークン値。Next Page Tokenで得られた値を使用する|
|pageSize|IN|1回のクエリで取得できる最大件数|
|where|IN|クエリの検索条件。SQLのように書ける|
|List|OUT|取得されたレコードが格納されるDataTable型変数|
|Next Page Token|OUT|1回のクエリで取りきれなかった場合の次ページを表すトークン値|

上記、スクリーンショットのように、取引先（Account）を取得してみます。
条件は、業種（Industry）が「Energy」で、従業員数（NumberOfEmployees）が5,000人を超えるレコードとし、ソート順は従業員数の降順とします。
上手くいけば、下のように2件（Y株式会社、ダミー株式会社の順）が取得できるはずです。
![実装5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/34d33448-0211-69ff-f78e-399ad20f7a1e.png)

期待通りに動きました。
![実装6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/f55f93c8-b424-2747-b521-48d82bc45acb.png)

# おわりに
ListRecordsアクティビティを使ってみましたが、SQLライクな書き方ができるのはプログラマなら分かりやすい反面、プログラマでないエンドユーザには少々ハードルが高いかもしれません。さらにSalesforce上のオブジェクトやフィールド名（物理名）を知っていないといけないので、UiPathだけでなくSaaSサービス側の知識も必要になります（この辺を楽に実装できれば申し分ないです）。
しかしながら、今までのようにAPIを使ったロジックをイチから組み上げる必要はないため、大きな前進かと思います。今後のサービス改善にも期待したいです。