スクリプティング:設定値を入力する方法
詳細計画の拡張スクリプトを構成/再構成して、フィールド値をセットにロードする方法の詳細な例をご覧ください。
この記事では、「構成/再構成時」詳細計画拡張スクリプトを使用して、フィールド値をセットにロードする方法を示します。
この例では、外部接続を使用して Salesforce への SOQL 呼び出しを行い、すべてのアカウント連絡先の姓を取得し、さらに構成するためにそれらをセットにプリロードする方法を示しています。
必須条件
この例を完了するには、次のものが必要です。
- CPQインスタンスで有効になっている拡張
- CPQ インスタンスで有効になっている外部接続
- 作成され、詳細計画に関連付けられたセット
- セットに関連付けられたテキストフィールド
外部接続:SOQL 呼び出し
CPQ管理画面の [ユーティリティ] で外部接続を見つけます。
- 統合タイプを Salesforce に設定します。
- 作成する SOQL クエリを定義します。この例では、特定のアカウントに関連付けられているすべての連絡先を取得し、姓を保存しています。
SOQL クエリ:
SELECT LastName FROM Contact WHERE AccountId = '{{accId}}'
スクリプトの設定/再構成時
詳細計画で、拡張領域に移動し、「構成/再構成時」拡張にスクリプトを追加します。
let setData = []; // initialize the set data as an empty array
//if initializing, default in setData
if (cfgRequest.demoset_swc.data == []) {
const inp = {"accId":"0015f000006lRKcAAM" }; // Hardcoded accountId, could be mapped in from a field
const response = Salesforce.getSetInit_swc(inp); // SELECT LastName FROM Contact WHERE AccountId = '{{accId}}'
const contactList = response.body.records;
if (contactList.length > 0) {
for (var contact of contactList) {
let elem = {"textTest_swc":{"value": contact.LastName } }; // set the field value
setData.push(elem); // add to the setData array
}
// after looping through all the contacts/previous set data, add them to the set
cfgRequest.demoset_swc.set("data",setData);
}
}
return cfgRequest;
スクリプトのチュートリアル
- setData 配列は空の配列 (1 行目) として初期化されます。
- API ペイロードまたは以前の構成 (3 行目) から、セットに既にデータが含まれているかどうかを確認します。
- Salesforce へのクエリの入力を定義します (5 行目)。この例では、アカウント ID はハードコードされていますが、フィールドから渡すことも、見積もりのツインフィールドからマッピングすることもできます。定義された外部接続を使用して Salesforce に SOQL クエリを作成し、応答を保存し (6 行目)、レコードアレイを取得します (7 行目)。
- コールがレコードを返した場合 (行 8)、レコードをループし (行 9)、フィールド値「textTest_swc」を連絡先の姓 (行 10) に設定します。最後に、新しい set 要素を setData 配列に追加します (11 行目)。
- 連絡先をループした後、設定要求 (14 行目) のセット「demoSet_swc」にすべての setData を追加します。
- 最後に、更新された構成要求を返します (18 行目)。
このスクリプトを再利用するには、次の行を変更します。
- 5 行目:アカウント ID (0015f000006lRKcAAM) を新しい値に更新するか、見積もりのフィールドをツインします。
- 行 6:Salesforce 接続の名前を更新します。
- 10 行目:フィールド名 (textTest_swc) を、使用しているセット内のフィールドに更新します。
- 16 行目:セット名 (demoset_swc) を使用しているセットの名前に更新します。
各構成から外部接続からのデータを設定する
代わりに、ユーザーが以前の構成で入力した内容をデフォルトデータで上書きする場合は、4 行目の if 節を削除します。
セット内の特定のフィールドのみでユーザーが編集したフィールドを上書きし、他のフィールドを構成間で保持する場合は、セットインデックスを明示的に参照する必要があります。
cfgRequest.[setName].data[i].set("fieldName",{"value":"fieldValue"});
拡張で使用するように以下を置き換えます。
setName:セットの変数名fieldName:フィールドの変数名i:フィールドの値を決定する既存のインデックスfieldValue:フィールドに設定する値
注:
空のデータアレイを参照していないことを確認するには、この呼び出しは拡張スクリプトで設定されたデフォルトコードの後に実行する必要があります。そうしないと、初期化時に null 参照エラーが発生します。
また、データで参照しているインデックスが存在することも保証する必要があります。設定されたデータ配列の長さのチェックを含めることは、その存在を保証する良い方法です。以下の例を参照してください。
if (cfgRequest.setTest.data.length >= 1) {
cfgRequest.setTest.data[0].set("setTestNumberField",{"value":cardNumber});
cfgRequest.setTest.data[0].set("setTestSingleSelect picklist",{"value":"set option 1"});
}
長さ関数は「1」を返しますが、インデックスは「0」であることに注意してください。これは、インデックスが最初のインデックスとして 0 から参照されるためです。