Flowのみで緯度経度を自動取得してGeolocation項目に挿入する方法

# 背景
@piepie1231 さんの[投稿](https://qiita.com/piepie1231/items/2fac64a32dc74651ee52)に触発され是非とも試してみたいと同時に、ローコードでの実現も需要があるのかもと思い投稿します。

現在緯度経度をカスタムオブジェクトのGeolocation項目に自動取得する機能はなく、もともとSalesforceではカスタムオブジェクトに関してはお手上げだったのですが、カスタムオブジェクトになんとか緯度経度情報を自動で取得して、MapにPlotしたい！という要求がありました。特に不動産や顧客情報以外の拠点やロケーションデータを扱う方にもそのようなニーズがあるかと推察します。

:::note warn 
- [Custom Address項目](https://help.salesforce.com/s/articleView?id=sf.fields_caf.htm&type=5)がWinter'23で利用できるようになったようですが、[有効化](https://help.salesforce.com/s/articleView?id=sf.fields_caf_enable.htm&type=5)と[制限事項](https://help.salesforce.com/s/articleView?id=sf.fields_caf_requirements.htm&type=5)があるようです。
- 緯度経度情報取得もこちら[カスタム住所項目への地理コードの追加]((https://help.salesforce.com/s/articleView?id=sf.fields_caf_geocode.htm&type=5))にありますが、ローコードではまだ無理のようです。
- 今回はテキスト項目で実装します。
:::

# 概要
とはいえ、**Geolocation項目に緯度経度を自動取得する方法**ですが、少し遠回りになるけど、フローだけで実現する方法があります。SalesforceではAccount, Lead, Contactでは住所の入力と緯度経度情報を自動で取得してくれので、それを利用した方法をご紹介します。

## 参照
[Get Geocodes for Addresses in Your Records (salesforce)](https://help.salesforce.com/s/articleView?id=sf.data_dot_com_clean_admin_automatically_get_geocodes_for_addresses.htm&type=5)


# 下準備
1. Integration RulesでAccount Billing Addressを有効化
1. Accountに任意のRecord Typeを作成（例:Geo Location)

# 手順
1. Custom Object（例:Profiles__c)にてGeolocation項目を作成
1. さらに別のテキスト項目に住所情報を入力（PostalCode, Country, State, City, Street)
1. 上記の住所情報をもとに擬似Accountを作成（例: Flow-1)
1. 擬似アカウントにてData.comにより緯度経度を自動取得
1. 擬似アカウントに保存したCustom ObjectのIdを利用して、取得した緯度経度を元のCustom Objectへ挿入して更新（例: Flow-2)
1. 緯度経度取得用の擬似アカウントは削除

以上になります。
# 具体例
では具体的に見てみましょう。
### 下準備 1: Integration RulesでAccount Billing Addressを有効化
こちらのData Integration RulesにてGeocodes for Account Billing Addressを有効化になっているのを確認します。こちらでAccountに住所が挿入されたときに自動で緯度経度を取得してくれます。
![data-integration-rules.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/58eb77da-2b74-0357-ea27-5d262b1f064f.png)

### 下準備 2: Accountに任意のRecord Typeを作成
任意のRecord Type（例:Geo Location) はあってもなくてもいいですが、フローの最後で削除するので、他のレコードタイプと交わらないように念の為完全に分けておきます。

# 手順詳細
具体的な手順の詳細です。
### 手順 1. Custom Object（例:Profiles__c)にGeolocation項目を作成
![geolocation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/70b75f47-a75a-a1bc-37dc-bc9d8b9571d1.png)

### 手順 2. さらに別のテキスト項目に住所情報を入力
PostalCode__c, Country__c State__c (Prefecture__c), City__c, Street__cというようにテキスト項目を作成します。こちらにInputされた情報を元に次のステップで擬似アカウントを作成します。

### 手順 3. 上記の住所情報をもとに擬似Accountを作成
#### Flow-1 全体像
起動オブジェクト: Custom Object (例: Profiles__c）

![flow-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/865bd450-4933-3a92-1130-1eb8d7d0fd4c.png)

#### Flow Elementの詳細

##### Record Trigger flow設定
geolocationにあるLatitude__s, Longitude__sがnullであり、PostalCode__cがEmptyでないことを条件にします。（より正確な情報を得るため）
![flow-1-empty-geolocation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/66cf2423-afdd-800e-ceab-642b65c8f6a9.png)

##### 擬似AccountのAssignment設定
Flow-1 の擬似アカウントの設定です。Nameは必須なので、仮に**Geo Location Account**としておきます。それからデフォルトの**BillingAddress**の各項目に情報を挿入しています。また、下準備で作成した**Record Type（Geolocation)** などで絞って、通常のアカウントからは隔離しておくと最後の削除の段階で削除する時に安心です。また、**TargetId**という項目をAccount側に用意しておくと、Flow-1をスタートしたRecordIdを保持して、次のFlow-2で利用することになります。必須項目です。Country をJPに強制していますが、海外の住所もPlotする場合はここも項目から取得したデータを充てたほうがよさそうです。（任意）
![flow-1-assignment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/3aa6cf21-1399-b97e-ef67-5fd27f07df29.png)

##### Create 擬似Account
最後にこの擬似アカウントを作成します。これでFlow-1は完成です。

### 手順 4. 擬似アカウントにてData.comにより緯度経度を自動取得
Flow-1が終了した段階で、下準備で有効化している`Integration RulesでAccount Billing Address`をにより、Data.comが緯度経度情報を取得してくれます。

### 手順 5. Flow-2 擬似アカウントに保存したCustom ObjectのIdを利用して、取得した緯度経度を元のCustom Objectへ挿入して更新
ここからがFlow-2 ですが、擬似アカウントが緯度経度を取得してData.comが更新したのをTriggerに次のFlow-2を起動します。

#### Flow-2 全体像
起動オブジェクト: **Account**

![flow-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/bc0fcb1a-a107-1143-e699-c57ad2fb8d2b.png)

#### Flow Elementの詳細
##### Record Trigger flow設定
こちらはFlow-1終了後緯度経度をData.comが更新したのを起点に起動されるFlow-2です。緯度経度が挿入されたことは必須です。念には念を入れて、RecordId縛りとAccountName縛り（Geo Location Account）と誤って他のレコード消さないように設定しています。
![flow-2-trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/fe0f37e2-94bb-78cc-56fb-0c4d780c7480.png)

##### TargetIdを利用してFlow-1を起動したRecordを取得
![flow-2-targetId.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/32a22e7a-5100-0cd7-95f1-b1aa3c820f63.png)

##### geolocationデータを割り当てる
![flow-2-assignment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15524/ad88a270-4155-1169-c55e-464874b9c1ba.png)

##### Flow-1を起動したRecordを割り当てた緯度経度とともに更新

##### 手順 6. 擬似アカウントは削除
緯度経度を取得するためだけのAccountなのでお役目ご苦労さまでした、ということでFlow-2の最後のエレメントにて削除します。これを削除しないと同じ名前（Geo Location Account）の擬似アカウントが作成されて重複ルールなどでエラーが出る可能性があります。

以上でFlow-2は完了です。


## 備考
本来はSalesforce側がカスタムオブジェクトでもgeolocationを取得してくれればいいのですが、フローだけで解決できる方法なのでローコードで解決を試みたい場合は一度試してみてください。

Custom Address項目はまだ有効化していませんが、そちらのアドレス情報でも利用は可能かもしれないので、試してみます。