UiPath で Integration Service を使った Box の自動化をやってみよう

# はじめに
UiPath で Box 上のファイルやフォルダの操作を自動化する場合、幾つかの方法があります。簡単に以下に表でまとめてみました。

Box の自動化 に際して実装方式も Uipath オフィシャルのパッケージも複数あり、どれを利用していいかわからない・・・(@@) となるのですが、この記事では最新の 1の実装方法について紹介したいと思います。

| # | 概要 | 前提条件 | 注意事項 |
|:-:|:-:|:-:|:-:|
| 1 |Automation Cloud で提供している　Integration Service  を利用する | (Box管理者) ユーザーのカスタムアプリ (UiPath for Box) への接続許可  | 2種類のパッケージがあり、Studio 23.10 以上の場合は**統合パッケージ**を利用、それ以下の場合は**個別パッケージ**を利用する  |   |
| 2 | 専用アクテビティを利用し、ロボットから Box API 経由で操作する | (Box管理者) カスタムアプリの作成（Oauth クライアントID/シークレット,またはJWTファイルを事前に用意）   | UiPath.Box.Activities パッケージを利用する  |   |
| 3  |  Box Driveを利用し、通常のファイル操作を行う | ロボット端末に Box Drive をインストールする	  | Box とロボット端末でファイルの同期がリアルタイムに行われず、遅延が発生する可能性がある  |
| 4  | ブラウザーで Box にアクセスして、通常のUI操作を行う  |   |  UI変更の影響を受けやすい |



# Integration Service とは

Integration Service の説明は[公式ドキュメント](https://docs.uipath.com/ja/integration-service/automation-cloud/latest/user-guide/introduction)をご覧ください : 

> 簡単に言うと、Integration Service は以下を行います。
> - すぐに使えるコネクタ ライブラリを使用してオートメーションを有効化する
> - 標準化された認証により、コネクションを容易に設定・管理できる
> - サーバー側のトリガーやイベントでオートメーションを開始できる
> - 簡単に使用できるよう、選定されたアクティビティとイベント (および追加のデータ フィルター) を提供する
> - Studio のデザイナー全員に均一のユーザー エクスペリエンスを提供し、オートメーションの設計を簡素化する

上記の他に個人的には Automation Cloud プラットフォーム全般で利用できること（Studio/RobotだけではなくAppsにも対応）、実装が非常にシンプルなところが利点だと思います。


# 統合パッケージとは

Box の Integration Service のアクテビティパッケージには以下の２種類があります。最初私はこの違いがよくわからず、少し詰まってしまいました。Boxを例にして紹介します。

Studio/StudioX の **バージョンが23.10** 以上であれば、最新のアップデートが入った統合パッケージを利用しましょう

### **UiPath.IntegrationService.Activities** (統合パッケージ）
Box だけではなく全てのサービスのコネクタが含まれた統合アクテビティパッケージとなります。 サービス連携に必要な情報を動的に取得します。動的にサービスから連携に必要な情報を取得しますのでサービス側の変更にも強い構成となっています（SaaSのように使えるイメージ）。アクテビティパネルの「**利用可能**」カテゴリの直下にサービスごとに表示され、その下のアクテビティを配置すると必要なパッケージが動的にダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593090/e1588ec9-c4ea-b4d1-8a5a-44e09d9feb4d.png)


### **UiPath.Box.IntegrationService.Activities** (単独パッケージ) 
サービスごとに用意された個別パッケージ。Studio/StudioXのツールバー「パッケージを管理」から手動でインストールして利用します。アクテビティパネルの「アクテビティ」カテゴリの「Integration Service」の下にサービスごとにアクテビティが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593090/07b6b9e7-bb1b-ebb7-bf87-011a5fe22298.png)


本記事では、統合パッケージを利用して、Box 上のフォルダとファイルの操作をします。今回は開発環境として StudioX を利用します。

# Box 上のファイルのダウンロード

Box の特定のフォルダ内に含まれるファイルを全てダウンロードするワークフローを実装します。最後にワークフローの実装イメージを提示します。

### ワークフローの実装手順

1. 「**box フォルダの項目を取得**」アクテビティをメインパネルに配置します。このアクテビティでは Box上の指定したフォルダ配下のファイルやフォルダを一覧で返してくれるアクテビティです。
このアクテビティはアクテビティパネルの「**利用可能** > Box > UiPath > Integration Service > Activities > Runtime > Activities」の下にあります。
配置すると自動的に UiPath.IntegrationService.Activities パッケージがダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593090/c5b68730-acdd-1d88-43ac-6712246abf4c.png)
「box フォルダの項目を取得」アクテビティ内で 「**新しいコネクションを追加**」をクリックします。既にコネクションがある場合、それを利用してもオッケーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593090/2d7f6e61-5ec0-ed59-00e3-d58bac0abb7d.png)
ブラウザが開いて、Box への接続画面が表示されます。設定する Orchestrator のフォルダを確認し、Connect を選択します。Orchestrator フォルダに設定したコネクションはそのフォルダのコネクションの表示権限があるユーザーやロボットが利用できることに注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593090/35b6e145-b6be-4a2e-464f-0d528845a91c.png)
以下のプロパティを設定します。

| プロパティの項目 | 値 |
|:-:|:-:|
|　フォルダ   | フォルダアイコンから任意のフォルダを指定 （[Box フォルダ ID](https://ja.developer.box.com/platform/appendix/locating-values/#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84id)の指定も可能）  |
|  返す内容 | Files を指定  |
|出力 - 応答オブジェクト| (変数を作成) ファイルリスト|

2.「**繰り返し(コレクションの各要素)**」アクテビティをメインパネルに配置します。項目のリストとして変数「ファイルリスト」を指定します。

3.「**box ファイルをダウンロード**」アクテビティをメインパネルの「繰り返し（コレクションの各要素）」の中に配置します

| プロパティの項目 | 値 |
|:-:|:-:|
|　Box | 前段で作成したコネクションを選択 |
|  ファイル | 詳細エディタで 「CurrentItem.Id」 を入力  |
|出力| (変数を作成) ファイルリソース|

4.「**ファイルを移動**」アクテビティを「繰り返し（コレクションの各要素）」の中、「box ファイルをダウンロード」の下に配置します。

「box ファイルをダウンロード」アクテビティではダウンロード先のフォルダや名前は指定できませんので利用しやすいよう移動する必要があります。ダウンロード先のフォルダはデフォルトでは 「C:\Users\(WindowsユーザーID)\AppData\Local\Temp」となります。

| プロパティの項目 | 値 |
|:-:|:-:| 
|移動元| 詳細エディタで「ファイルリソース.ToLocalResource.LocalPath」を入力 |
|移動先 | 詳細エディタで「 "C:\Users\yourname\Desktop\temp\" + CurrentItem.Name」のようにフォルダのパスとBox上のファイル名を指定します |


上記で完成です！実行して、Boxの指定のフォルダのファイルが全てダウンロードできるか試してみましょう。

### ワークフローの実装イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593090/faa9bc74-5413-bdcb-8b4c-33cb7076289e.png)

# ローカルファイルの Box へのアップロード

今度はローカルのファイルを Box にアップロードする方法を解説します。ワークフローの実装イメージはこの章の最後にあります。

### ワークフローの実装手順
1.「**パスの存在を確認**」アクテビティをメインパネルに配置します。アップロードするファイルのILocalResource型変数を取得します。
| プロパティの項目 | 値 |
|:-:|:-:|
|　パスの種類   | File  |
|  パス | 任意のアップロードしたいファイルのパスを入力  |
|出力 パスが存在する場合の参照| (変数を作成)アップロードするファイル|

※アップロードするファイルが固定の場合、このアクテビティは不要です。次の「box ファイルをアップロード」のフォルダアイコンで直接アップロードするファイルを選択してください。

2.「**box ファイルをアップロード**」アクテビティを配置します。このアクテビティはアクテビティパネルの 「利用可能 > Box > UiPath > Integration Service > Activities > Runtime > Activities」 の下にあります。
配置後、ダウンロード実装時と同様、新しいコネクションを追加します（または既存のコネクションを選択）。ブラウザが開いて、Box への接続画面が表示されます。フォルダを確認し、Connect を選択します。

| プロパティの項目 | 値 |
|:-:|:-:|
|　ファイルリソース   | アップロードするファイル  |
|  Parent Folder | フォルダアイコンから任意のフォルダを指定（[Box フォルダID](https://ja.developer.box.com/platform/appendix/locating-values/#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84id)の指定も可能）  |
|出力 －ファイルをアップロード| (変数を作成)アップロードしたファイル |

※アップロードしたファイル.id でBox上にアップロードされたファイルのIDが取得可能です

上記で完成です！実行して、Box上の指定のフォルダにローカルファイルをアップロードしてみましょう。

### ワークフローの実装イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3593090/f493649f-da37-0367-685f-47fe27ef4aef.png)


# 終わりに

統合パッケージにある各サービスのアクテビティの探し方がわかれば、他のサービス連携も同じように簡単に実装を進めることができるかと思います。是非試してみてくださいね :wink: