【Salesforce】カスタムオブジェクトから取引先オブジェクトにレコードをコピーするアクションを作ってみた

# はじめに
「**カスタムオブジェクトから標準オブジェクトにデータをコピーしたい**:horse:」

ということで、今回は前回の続きです。
前回は、リードから取引先オブジェクトへデータをコピーする機能が元々備わっていたので、カスタムオブジェクトからでも同様の処理が実装できるかチャレンジしてみます。

https://qiita.com/shoya_u/items/40d256a5f74f754580c4





# 実装したいこと
- カスタムオブジェクトの項目値をコピーした、取引先オブジェクトのレコードを作成する





# カスタムオブジェクトの作成
下記の記事を参考にさせていただきました。

https://www.sunbit.co.jp/blog/2023/08/22068/

### カスタム住所項目を設定する
カスタムオブジェクトには、デフォルトのデータ型に住所が存在しないので、先に設定します。

[設定]から[ユーザーインターフェース]を選択します。
[カスタム住所項目を使用]にチェックします。
![ユーザーインターフェース___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/50d2b11b-039a-470e-8155-1a85388e9c93.png)

カスタム住所項目には制限事項があるので、確認しておきます。

https://help.salesforce.com/s/articleView?id=platform.fields_caf_requirements.htm&type=5

### 州/国/テリトリー選択リストの設定
[設定]から[州/国/テリトリー選択リスト]を選択し、デフォルトの国を[日本]に設定します。
![州_国_テリトリー選択リスト___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/1aa5618f-570e-4c35-8e9b-308a6edd5929.png)

### カスタムオブジェクトの作成
複数のデータ型に対応した項目を作成し、期待通りの動作をするか検証します。

カスタムオブジェクト名：フォーム登録者
|項目名|データ型|
|:---:|:-----:|
|氏名|テキスト|
|メール|メール|
|電話番号|電話|
|住所|住所|
|生年月日|数式|
|性別|選択リスト|
|流入経路|選択リスト（複数選択）|
|規約同意|チェックボックス|

[生年月日]は、[年]と[月]と[日]の3つをデータ型：選択リストで作成し、[生年月日]に以下の数式を挿入します。
```
IF(
    OR(ISBLANK(TEXT(Year__c)),ISBLANK(TEXT(Month__c)),ISBLANK(TEXT(Day__c))),
    NULL,
    DATE(VALUE(TEXT(Year__c)),VALUE(TEXT(Month__c)),VALUE(TEXT(Day__c)))
)
```
:::note warn
作成したカスタムオブジェクトがアプリケーション側で表示されない場合は、
[設定]から[タブ]を選択し、[カスタムオブジェクトタブ]を新規作成してください。
:::

Lightningレコードページを作成して、カスタムオブジェクトの設定は完了です。

![テスト___フォーム登録者___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/4799d5e5-82ab-4300-b8e2-1e679c8a7c03.png)





# 取引先オブジェクトに項目を作成する
カスタムオブジェクトの項目に対応する取引先の項目を作成します。
通常の実装だと、逆の流れになるでしょう。
（取引先の項目に合わせてカスタムオブジェクトの項目を作成する）





# フローの作成
### カスタムオブジェクトと取引先を参照関係に設定する
[設定]から[オブジェクトマネージャー]で[取引先]を選択します。
[項目とリレーション]で[新規]、[参照関係]を選択します。
[関連先]に作成したカスタムオブジェクトを選択します。
![取引先___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/fa610067-25d2-479c-afec-faae56fd42e2.png)

### カスタムオブジェクトの新規アクションの作成
[設定]から[オブジェクトマネージャー]で[フォーム登録者]を選択します。
[ボタン、リンク、およびアクション]から[新規アクション]を選択します。
上記の参照関係設定をすることで、[対象オブジェクト]で選択することができます。
![フォーム登録者___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/82149477-303c-436d-9ebd-85c5ef2e8cf2.png)

作成したアクションページの[定義済み項目値]から[新規]を選択します。
![フォーム登録者___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/e834bdc0-4931-4c92-b200-165bb677d8f6.png)

カスタムオブジェクトの項目の値を入れる取引先オブジェクトの項目を設定していきます。

項目が選択リストの場合は以下のように設定する必要があります。
（都道府県の場合、カスタムオブジェクト側の項目値が、01などの州コードになっている）
```
CASE(TEXT( FormRegistrant__c.Address__StateCode__s ),
"01", "北海道",
"02", "青森",
~~~
"47", "沖縄",
""
)
```

![フォーム登録者___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/ca083a4b-6bb4-457f-9f26-5f5fc06bd90f.png)


:::note warn
複数選択リストは、定義済み項目値に設定することができませんでした。
![クイックアクションの定義済み項目値に関するメモ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/c29c754f-936f-47e3-875b-39098ce31862.png)
:::




アクションを作成したら、ページレイアウトでアクションを配置します。
Lightningレコードページの場合は、[動的強調表示パネル]の[アクションを追加]から、先ほど作成したアクションを追加します。
![スクリーンショット 2025-03-02 22.03.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/717b572f-45e3-4249-aee5-f3ad78b8d2c8.png)

# 完成形
カスタムオブジェクトにレコードを作成します。
![テスト_太郎___フォーム登録者___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/459ca877-e53e-4ad4-9f6b-73f252a187bc.png)

アクションボタンをクリックすると、取引先レコードの新規作成画面が表示されます。
カスタムオブジェクトの項目値がデフォルトで入力されています。
![新規取引先（求職者）___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/c1d0e3db-77f1-4e5c-af5e-5c92aa255702.png)

[保存]を選択すると、取引先オブジェクトにレコードが作成されました。
![テスト_太郎___取引先___Salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577266/d96301c3-dc24-481e-add2-1fbfd48aecf4.png)




# まとめ
今回は、アクションを使ってカスタムオブジェクトから取引先に項目値をコピーしたレコードの作成を実装しました。
標準の住所項目と、カスタム住所項目の違いなど、細かな違いに悩まされましたが、なんとか実装まで辿り着きました。
今回の実装方法だと、仕様的に複数選択リストの値がコピーできなかったので、別の方法がないか探してみたいと思います。