Zoho CRMのクライアントスクリプトで案件名(レコード名)を自動生成する方法
を自動生成する方法-28390.png)
Zoho CRMで案件(商談)を運用していると、案件名の命名ルールが人によってバラバラになりがちです。「新規_SecureGuardPro」と入れる人もいれば「SecureGuardPro(新規)」と入れる人もいて、後からレポートやビューで並べたときに統一感が出ない、という悩みはよくあります。
この記事では、案件の作成時に「契約種別」と「商品名」の選択リストの値を組み合わせて、案件名を【契約種別】商品名の形式で自動生成するクライアントスクリプトの実装手順を解説します。ワークフローや関数ではなく、あえてクライアントスクリプトで実装する理由と、実装時にハマりやすいポイントも合わせて紹介します。
なぜワークフローではなくクライアントスクリプトなのか
案件名の自動生成は、Deluge関数とワークフローの組み合わせでも実現できます。ただし今回のように「入力したその場で案件名を埋めたい」ケースでは、クライアントスクリプトのほうが適しています。
ワークフロー方式の場合、値がセットされるのはレコードを保存したタイミングです。つまり、担当者は案件名が空のまま保存ボタンを押すことになり、「本当に自動で入るのか」が保存するまで分かりません。
一方、クライアントスクリプトのonChangeイベントを使えば、契約種別と商品名を選択した瞬間に案件名欄へ値が反映されます。入力中に結果が見えるので、担当者にとって挙動が分かりやすく、必要なら手直しもその場でできます。入力体験を重視するなら、この用途はクライアントスクリプト向きです。
実装する仕様の整理
今回作成するスクリプトの仕様は次の通りです。
トリガー:案件の作成画面で「契約種別」または「商品名」が変更されたとき
条件:案件名が空のときのみ実行する
生成形式:【契約種別】商品名(例:【新規】SecureGuard Pro)
ポイントは「案件名が空のときのみ」という条件です。これがないと、担当者が先に案件名を手入力していても、後から契約種別や商品名を触った瞬間に上書きされてしまいます。手入力を尊重する設計にしておくことで、自動生成とマニュアル運用を両立できます。
事前準備:フィールドのAPI名を確認する
クライアントスクリプトはフィールドをAPI名で参照します。ラベル名ではなくAPI名が必要なので、先に確認しておきます。
設定 → 開発者向け情報 → APIとSDK → CRM API → API名 のタブを開き、案件(Deals)モジュールで対象フィールドを検索します。
この記事では、説明のために次のような架空のAPI名を使います。実際に実装する際は、必ず自分の環境の値に読み替えてください。
契約種別:ContractType_c(選択リスト)
商品名:Product_Name_c(選択リスト)
案件名:Deal_Name(1行/標準フィールド)
API名は環境によって異なります。特にカスタムフィールドは「field7」のような自動採番のAPI名になっていることも多いので、ラベル名だけで判断せず必ず実際の値を確認してください。案件種別など似た名前のフィールドが複数ある場合は、どれを使うのか取り違えないよう注意が必要です。
/h4 クライアントスクリプトの作成
設定 → 開発者向け情報 → クライアントスクリプト から「新しいスクリプトを作成する」を選び、次の内容で作成します。
名前:案件名自動生成(任意)
カテゴリー:Module
ページ:作成ページ(標準)
タブ:案件
レイアウト:標準
種類:ページの処理
タイミング:onChange
ここで「種類」を"ページの処理"にしているのがポイントです。フィールド単位のイベントにすると、契約種別用と商品名用でスクリプトを2つ作る必要があります。ページの処理にすれば、1つのスクリプト内でfield_nameという変数を使い、どのフィールドが変更されたかを判定できるため、管理がシンプルになります。
スクリプト本体
作成画面で「次へ」を押すとIDEが開くので、次のコードを貼り付けます。API名の部分は自分の環境の値に置き換えてください。
console.log('onChange fired. field_name =', field_name);
if (field_name != 'ContractType_c' && field_name != 'Product_Name_c') {
return;
}
var dealNameField = ZDK.Page.getField('Deal_Name');
var currentName = dealNameField.getValue();
if (currentName != null && ('' + currentName).trim() != '') {
return;
}
var contractType = ZDK.Page.getField('ContractType_c').getValue();
var productName = ZDK.Page.getField('Product_Name_c').getValue();
if (contractType != null && ('' + contractType).trim() != '' &&
productName != null && ('' + productName).trim() != '') {
var newName = '【' + contractType + '】' + productName;
dealNameField.setValue(newName);
}
コードの流れは上から順に、変更されたフィールドが対象2つ以外なら何もせず終了、案件名がすでに入力済みなら何もせず終了、契約種別と商品名の両方が選択されている場合のみ案件名をセット、という構成です。
フィールドの値取得はZDK.Page.getField('API名').getValue()、値のセットはsetValue(値)を使います。これがクライアントスクリプトでフィールドを読み書きする基本の書き方です。
選択リストの場合、getValue()は選択中のラベル文字列をそのまま返します。そのため【】で囲む文字列連結が素直に書けます。
動作確認とデバッグ
保存してスクリプトを有効化したら、実際の作成画面で動作を確認します。
成功パターンは次の通りです。
- 案件の新規作成画面を開く(案件名は空のまま)
- 契約種別を選ぶ(この時点では商品名が未選択なので案件名は空のまま)
- 商品名を選ぶ。この瞬間に案件名欄へ【新規】SecureGuard Proが自動で入る
契約種別と商品名は、どちらを先に選んでも構いません。2つ目を選んだ瞬間に埋まればOKです。
続いて、「案件名が空のときのみ」の条件が効いているかも確認します。作成画面をやり直し、先に案件名へ手動で何か入力してから契約種別・商品名を両方選び、手入力した値が上書きされずに残ればOKです。
うまく動かないときは、コードに仕込んだconsole.logが役立ちます。作成画面でブラウザの開発者ツールを開き(Macの場合はCommand + Option + I)、Consoleタブを見ながらフィールドを操作します。
このとき確認したいのは主に次の3点です。
field_nameが本当にContractType_cやProduct_Name_cになっているか。違う値なら条件分岐で弾かれてしまいます。
getValue()がラベル文字列を返しているか。[object Object]のようなオブジェクトが返っている場合は取り出し方の調整が必要です。
setValueまで到達しているのに画面に反映されないのか、その手前で止まっているのか。
なお、setValue()は作成ページや編集ページでは有効ですが、詳細ページ(Canvas/標準)ではサポートされていません。今回は作成ページでの利用なので問題ありませんが、この制約は覚えておくと他のスクリプトを書くときに役立ちます。
応用:編集時にも自動生成したい場合
今回のスクリプトは作成ページのみを対象にしています。作成後に契約種別と商品名を埋めたタイミングでも自動生成したい場合は、同じスクリプトを編集ページ(Edit Page)用にもう1つ登録すれば対応できます。
「案件名が空のときのみ」という条件が入っているので、すでに名前が付いている既存案件を編集しても値を壊すことはありません。運用に合わせて、作成ページだけにするか編集ページも含めるかを選んでください。
まとめ
クライアントスクリプトを使えば、案件名の命名ルールを人の記憶に頼らず、選択した項目から自動で統一された形式に整えられます。今回のポイントを整理すると次の通りです。
入力したその場で反映したいならクライアントスクリプトが向いている
ページの処理 + onChange + field_name判定で1スクリプトにまとめられる
案件名が空のときのみという条件で手入力運用と両立できる
ZDK.Page.getField().getValue() / setValue()がフィールド読み書きの基本
命名ルールの統一は地味ですが、後々のレポートやデータ分析の精度に効いてきます。選択リストと案件名の組み合わせで運用しているなら、導入を検討してみてください。