Files ConnectでGoogle DriveをSalesforceに接続

今回は、Files ConnectでGoogle DriveをSalesforceに接続することができたので、その手順紹介します。
# Files Connectとは?
Files ConnectとはSalesforceが提供するGoogle Drive, Box, OneDriveなど外部のストレージにあるファイルをSalesforce内で参照またはコピーすることができる機能です。
[Salesforce Files Connect](https://help.salesforce.com/s/articleView?id=sf.collab_admin_files_connect.htm)

![google-drive-option.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/2f56e170-6689-b492-70d9-e393aa824cb5.png)


# 設定手順
[ヘルプページ](https://help.salesforce.com/s/articleView?id=sf.collab_admin_files_connect.htm&type=5)と大体同じですが、自分としてはわかりやすい手順としては以下になるかと思います。
1. [Google] Google Drive APIを有効化
1. [Google] Google で「プロジェクト」を作成
1. [Google] Google で「認証情報」を作成
1. [Salesforce] Google ドライブのAuth. Providerを作成
1. [Google] Callback URLをAuthorized redirect URIsに追加
1. [Salesforce] Files Connectを有効化
1. [Salesforce] Permission Setを作成し割り当て
1. [Salesforce] Google ドライブのExternal Data Sourceの定義
1. [Salesforce] ユーザーごとのData Sourceでは、Salesforce でユーザーを認証
1. [Salesforce] グローバル検索に外部データを含める（任意）

## 1. Google Drive APIを有効化
まず連携したいGoogleアカウントのGoogle Developer Console (https://console.developers.google.com/) へ移動して Google Drive APIを有効化します。検索窓に[Google Drive API]と入力すると出てきます。

![google-drive-api-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/2505d494-aed8-b693-8b81-2f93b72bcda0.png)
このEnableを押すと有効化になります。
![google-drive-api-enabled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/72a1ae6d-1767-9228-91bb-57957baa3997.png)

## 2. Google で「プロジェクト」を作成
次に、同Google Console内でプロジェクトを作成します。
### Console 画面でプロジェクトを作成
![google-new-project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/7751c30e-c10c-b384-be31-57ef39de1128.png)

### プロジェクトに任意の名前
プロジェクトに任意の名前をつけます。
![google-project-name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/35f532ea-d932-197d-1eb2-0f9cd9ca2429.png)

## 3. Google で「認証情報」を作成
### Auth Consent Screenを作成
こちらは最低限の画面を作成すればいいです。Credentialsを作成する際、SalesforceからGoogleへのアクセスを許可する認証の際の画面を一つは作成しておく必要があります。
Internalを選ぶと同ドメインアカウントのみのアクセスになりよりセキュアになります。
![Oauth-consent-screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/0efd2a71-d4db-39af-5f5c-ec830d6c3517.png)

### 開発者連絡先
開発者連絡先はご自身か管理者がいれば、その方のメールを入力。
![developer-contact-email.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/f6a63bdf-b005-47a2-a85f-28321876f03f.png)

### Credentials を作成
![google-credential-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/e8717f91-e6b8-6fc6-9a08-bd3af0d7c507.png)

### Credentialsが作成後
Credentialsが作成されるとこの管理画面になります。
![google-credential-successful.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/8ed218b7-28c5-ea43-243b-5fcf5044e70d.png)
（Client IDとConsumer Secretが作成され、次のAuth. Providerの工程で利用します）

### Credentialsを表示
Salesforceをクリックすると、右半分に情報が出てきます。`Client ID`と`Client secret`は次の「Google ドライブのAuth. Providerを作成」で使います。
![google-credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/280263c2-90c1-a8ee-7050-06de8d0e69cf.png)

## 4. Google ドライブのAuth. Providerを作成
次ですが、Google DriveへのアクセスをOAuthで認証します。これをすることによって、ユーザーがGoogleアカウントで認証し、必要な権限（例: Google Driveへのアクセス）を付与するプロセスをSalesforce内で安全に管理できます。
![salesforce-auth-provider-select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/449acadf-536a-771f-aaa5-db39729cda20.png)
Provider Type は`Open ID Connect`を選択。
ここで、上記ステップでGoogle Consoleで作成したProjectから取得した`Client ID`Consumer Keyに、`Client secret`をConsumer Secretに充てます。

![Auth-providers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/b8feddd1-ef36-1bc7-e0ba-c435fc98b277.png)

### 必要情報：
| 項目 | 値 |
|:-|:-|
| Provider Type  | Open ID Connect  |
| Name |  GoogleDrive（任意） |
| URL Suffix  | GoogleDrive （任意） |
| Consumer Key | {Client ID} (GoogleのProject内で入手） |
| Consumer  Secret  | {Client secret} (GoogleのProject内で入手） |
| Authorize Endpoint URL  | `https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force` |
| Token Endpoint URL  | `https://accounts.google.com/o/oauth2/token` |
| Default Scopes |  `openid email profile https://www.googleapis.com/auth/drive` |

![Auth-providers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/f1142f06-e6cb-6ff2-e4fb-0a0a14c053e0.png)

参考: [Google ドライブの認証プロバイダーの作成](https://help.salesforce.com/s/articleView?id=sf.admin_files_connect_google_auth.htm&type=5)

## 5.Callback URLをAuthorized redirect URIsに追加
これが面倒なのですが、上記で作成したSalesforceのAuth. Providersの情報のうちの一つ「Callback URL」をコピペして、GoogleのProject内にあるAuthorized redirect URIsに追加する必要があります。
![Authorized redirect URIs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/7955eb27-17a5-7adb-7045-c9b300e88d9f.png)


## [6. Files Connect を有効化](https://help.salesforce.com/s/articleView?id=sf.admin_files_connect_enable.htm&type=5)

ここで、Files Connectの挙動を設定しますが、`Copy`と`Reference`の二つがあります。
- `Copy`
Salesforce に外部ファイルのコピーを保存します。ファイルが Chatter グループと共有されている場合、外部システムへのアクセス権がなくても、すべてのグループメンバーがファイルにアクセスできます。
- `Reference`
Salesforce 外に保存されている外部ファイルを参照します。ファイルプレビューが使用できないため、ファイルのダウンロードには外部システムへのユーザーアクセス権が必要です。(ユーザーは個人設定の [外部システムの認証設定] セクションでシステムのログイン情報を入力する必要があります)

![files-connect-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/aa320052-8fd7-a8af-ceeb-6cfb243249c0.png)

コピーをすると、ストレージにあるファイルをまるまるコピーしてSalesforce Filesに保管するので今回のストーレージ省略の目的に合致しないので、`Reference`（参照）でいきます。`Copy`の利点はそのままSalesforceからのEmailなどの添付として利用できます。`Reference`の利点は常に最新のファイルバージョンが表示されるのですが、添付では使用できないようです。

## 7. Permission Setを作成し割り当て
次にFiles Connect Cloudを有効にするPermission Setを作成し、適用したいユーザーに対して割り当てます。とりあえずGoogleDriveという名前で、ライセンスはSalesforceに限定。場合によっては別のライセンスでも可能です。
![permission-set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/a4e0ab76-b648-e5e2-e044-3a1fc4686d05.png)

次にFiles Connect Cloudをの権限をSystem Permission内に探して、チェックを入れます。
![permission-set-files-conenct-cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/2fe50994-cc86-fdd3-cb27-8cb63e22999f.png)

![Files-connect-Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/5dd75c3f-8663-7b11-2034-f53cd5b29872.png)

次に、このPermission Setを利用するユーザーに割り当てます。
![permission-set-assignment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/dbebdc4f-5c05-3910-5b90-45618a07d738.png)

Nextボタンを押せば割り当て完了です。
![permission-set-asignment-edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/9e4cc5b4-0316-f154-ff44-1d51dc18c195.png)


## 8. Google ドライブのExternal Data Sourceの定義
Permissionを割り充てた後、External Data Sourceを定義していきます。先にPermissionを割り当てないとFiles Connectの選択肢が出てきませんので順番注意。
![External-data-source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/44d232b8-c0bf-fb02-c40e-31b43efaa52f.png)

`Start Authentification on save`にチェックを入れていると、Google アカウントを利用したOauthのフローが始まりますので、承認していきます。
![google-auth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/dc170c3d-e988-b6f4-c851-f84f692fffc2.png)

Allowで進むと、Authenticatedになります。
![google-authenticated.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/9761c099-dcda-1808-efe6-01a2ef1def75.png)

さらに、先ほどのPermission Setに戻り、External Data Source Accessで、上記のExternal Data Source (GoogleDrive)を左から右へ移動させ、PermissionSetでアクセスできるSourceへと追加します。

![permission-set-external-data-source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/e7aceb8b-02bf-29ad-2eee-f288229341cb.png)

これで追加完了です。
![permission-set-external-data-source-allow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/4a640421-a696-0e6c-02a8-9d100d3e9462.png)


## 9. ユーザーごとのData Sourceでは、Salesforce でユーザーを認証する
とりありえず、Filesのタブからファイルをみてみます。
![files-google-drive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/fc99cda3-2cda-6ecc-7537-d1d9d9223a28.png)
そうするとまた、認証をせよとのこと。再度GoogleのOAuth画面で認証すると見事ファイルフォルダが見えました。
![files-google-drive-authrized.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/63bfe715-e51e-638d-e946-53faf0013b86.png)

実際に添付していくには`Add Files`でこちらの画面を開きます。
![add-files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/3d163442-ba0b-d18b-0c85-7828897d0277.png)

追加選択画面です。
![access-files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/88c49a75-d8c6-5336-7eec-4098622d21a4.png)

追加してみると、ReferenceとしてGoogle Driveのロゴがついたファイルが追加されていきます。
![added-files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/4fe01480-ef4a-ee1a-36df-8192763e5ff1.png)

プレビューはやや小さいけど見れるだけプラス。複数枚のPDFやSlidesなどは一ページ目のみです。実際に下部のボタンを押せばGoogle Driveの実際のファイルへ飛びます。これがReferenceでの挙動になります。
![preview-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/3cf026cd-ea90-0a69-5739-f2aa9c1354de.png)

![hibari-cafe-kumamoto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/96fd9faa-a568-9b52-0c18-b5cfdfadb1cb.png)

添付したものは、あくまで参照リンクなので、ファイルサイズはまさかの「ー」（無）。これで、組織内のファイルストレージを圧迫することはありません。
![file-size-zero.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/c2d2ea3b-8afd-a4be-d7ae-07c111ecd724.png)


## 10. グローバル検索に外部データを含める（任意）
### External Objectを追加
まずExternal Objectを追加します。名前はGoogle Drive.
![external-object.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/8d8305bd-f412-abda-8dac-fee753879b81.png)

### Permission SetにExternal Objectを追加
Permission SetにGoogle DriveというCustom Objectが出現し、Read Permission を付与します。
![external-object-permission.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/e72c3ed7-aa1c-3f6a-9ae7-d81da8e65d2d.png)

### Validate and Sync
Validate and Syncを押すとitems_Google_Driveというものが出てきますが、Name FieldをNameにして `Sync`すると、完成です。
![external-object-validate-sync.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/2a29e38e-8abd-242f-d4cd-a593266f8b40.png)

### Global Searchを試す
晴れてGoogle Drive内のファイルをSalesforce内でGlobal Search検索することができるようになりました。
![external-object-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/5ec0bf9a-1ef1-3286-951f-9be02cef09ab.png)
とはいえ、全ファイルが検索できるとは限らず、Sync待ちでしょうか。
[グローバル検索での Files Connect データソースの追加](https://help.salesforce.com/s/articleView?id=sf.admin_files_connect_search.htm&type=5)

### Search Layout変更
より多くの情報を表示するため、Search Layout変更します。
![search-layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/713b7691-d5dc-7772-8e06-d7ac707c63ea.png)

# 注意点
いいことづくめのようですが、欠点もあります。
1. `添付ファイルとして送信できない`。（選択はできるのですが、実際は何も添付されません）回避策としてGoogle Driveから、ファイルのIDを取ってくるということはできるので、Anyone with link状態であれば、添付ではなくそのGoogle Driveへのリンクをシェアという形で送信はできます。
1. ファイル選択の`検索が貧弱`。
1. `24`のRecentファイルしか取得できない。
1. `Reference`ではなく`Copy`を選択すると添付では使用できるがストレージの節約にはならない。
1. `Shared Driveのファイルが利用できない`。（なので、複数名でアップロードしたものを閲覧し合うには、共有の編集・閲覧権限のあるフォルダを用意した方がいい）
1. `SalesforceからGoogle Driveへファイルをアップロードすることはできない`

最後のSalesforceからGoogle Driveへは、Google Drive APIとLWC, Apexを利用して可能なので、12月のアドベントカレンダーに記載していこうかと思います。
- Google DriveへのFolder のupsert
- Google DriveへのFile upload
- Google DriveへのFile view
等々をカバーする予定です。

共有フォルダを作成してそこの画像でないと違うユーザーごとがアップしたファイルは閲覧できない感じだったのですが、log in as ではうまく検証出来ないので、そこらへんも追加で書くかもしれません。

## 次の記事

https://qiita.com/masahiro_sf/items/f849bed6197c176615c1