機械翻訳について

カスタム・スクリプトによるアプリケーションの構成

オンラインであるかオフラインであるかに関係なく、検証およびルールを強制するカスタム・スクリプトをJavaScriptを使用して記述することで、ビジネス要件にあわせてアプリケーションをさらに構成できます。 この強力な機能により、任意のトップレベルの親オブジェクトおよび子オブジェクトについて、選択したイベントでトリガーできるスクリプトを作成できます。 たとえば、商談の作成時に製品フィールドを必須にするスクリプトを作成できます。

スクリプトの作成方法

すべてのオブジェクトまたは特定のオブジェクトについてカスタム・スクリプトを作成できます。 ここでは、特定のオブジェクトについてカスタム・スクリプトを作成する方法を示します。

  1. 構成に使用するサンドボックスを選択します。

  2. 「ナビゲータ」「アプリケーション・コンポーザ」「モバイル・アプリケーション設定」を選択します。

  3. 「モバイル・アプリケーション設定」ページの上部にある「CX Sales Mobileスクリプト」タブをクリックします。

  4. 最上位の親オブジェクトについてスクリプトを作成するには、スクリプトを記述するオブジェクトを選択し、スクリプトをトリガーするイベントを選択します。 次のいずれかのイベントを選択できます。

    • 作成時(モバイル・アプリケーションで新しいレコードが作成されたときにトリガーされる)。

    • 保存前(レコードが保存される前にトリガーされる)。

    • 保存後(アプリケーションでレコードが保存された後にトリガーされる)。

    • フィールド値の変更時(ユーザーがフィールドの値を変更した後、フィールドの外側をタップしたときにトリガーされる)。

    • 編集時(ユーザーがレコードを編集したときにトリガーされる)。

  5. 子オブジェクトについてスクリプトを作成するには、最上位の親オブジェクトを選択し、商談の子オブジェクト・セクションで関連する子オブジェクトを選択します。 最後に、スクリプトをトリガーするイベントを選択します。

    ノート: 子オブジェクトの保存前イベントまたは保存後イベントについて検証を作成する場合は、親オブジェクトの保存前イベントまたは保存後イベントを使用する必要があります。
  6. <イベント名>スクリプト・セクションでプラス・アイコンをクリックします。

  7. スクリプトの名前と摘要を入力します。

  8. (オプション)スクリプトが特定の地域について機能するようにする場合は、スクリプトの地理的地域を選択します。 このスクリプトは、CX Salesアプリケーションで国プリファレンスとして選択した地域を設定しているユーザーについて機能します。

    ノート: スクリプトには複数の地域を関連付けることができますが、同じオブジェクトおよびイベントの複数のアクティブなスクリプトに同じ地域を割り当てることはできません。

    特定のユーザー・ロールについてトリガーするようにスクリプトを制限する場合は、JavaScriptスクリプトを記述して、これらを指定する必要があります

  9. 「作成」をクリックし、スクリプトを作成します。

  10. 「検証」をクリックして、スクリプトにエラーがあるかどうかをチェックします。 検証チェックには、ネストされた関数コールや、無限ループで永久に実行される原因となるスクリプト内の他のすべてのものに関するチェックが含まれます。

  11. 終了後、「保存」をクリックします。

カスタム関数の作成方法

すべてのスクリプトですべてのオブジェクトについて使用できるカスタム関数(ユーティリティ関数と呼ばれる)を作成することもできます。 その方法は次のとおりです。

  1. スクリプトの作成方法の項のステップ1から6を実行した後、ユーティリティ関数セクションでプラス・アイコンをクリックします。

  2. 関数を作成します。 関数がユーティリティ関数として指定され、システム関数リストに含まれるように、必ず関数に_Cを含めてください(システム関数の詳細は、次のスクリプトの作成に役立つ機能の項を参照してください)。 システム関数リストに含まれると、任意のカスタム・スクリプトからユーティリティ関数にアクセスできます。 次に形式の例を示します。

    function example_c() {
    var a = 100;
    a = 100+a
    }
  3. 「検証」「保存」の順にクリックします。

スクリプトの作成に役立つ機能

スクリプトを作成する際には、正しいオブジェクト値とフィールド値を入力することが重要です。そのため、これを簡単に行うことができるように、スクリプト・ボックス内で[Ctrl]+[Space]を押すと、オブジェクトとフィールドのリストが表示されます。 挿入するオブジェクトまたはフィールドを選択すると、正しい値がスクリプトに追加されます。

この機能を使用すると、APIをスクリプトに自動移入するシステム関数も使用できるようになります。 [Ctrl]+[Space]を押し、システム関数セクションまで下にスクロールすると、使用可能なAPIのリストが表示されます。 たとえば、これらのAPIを使用して、デバイスのオペレーティング・システムやユーザーの現在の位置を確認できます。 システム関数セクションには、自分が作成したユーティリティ関数も表示されます。 使用可能なシステム関数のリストとそれらの使用方法は、カスタム・スクリプト用のシステム関数のライブラリのトピックを参照してください。

スクリプトのテスト

スクリプトのテストに役立つように、スクリプトでCXCoreLoggerクラス・メソッドを使用して、警告、エラーまたは情報メッセージを書き込むことができます。 その後、メッセージを確認してスクリプトをデバッグできます。

スクリプトをデバッグした後、CX Sales Mobileでスクリプトをテストし、完了したらサンドボックスを公開します。 CX Sales Mobileで構成を確認する方法の詳細は、構成のテストのトピックを参照してください。

スクリプトの例

ここでは、カスタム検証およびルールを作成する方法の例をいくつか示します。

オブジェクト、イベントおよび要件

スクリプトの例

オブジェクト: 商談

イベント: OnCreate

要件: 商談の名前および

所有者フィールドに値を自動移入する。

var oracleCxmOutcome = new Result("");
var currentRow = await getCurrentRow();
var userPref = await getUserPreferences();
var partyName = userPref.getPartyName();
currentRow.setColumn('PartyName1',partyName);
currentRow.setColumn('Name', 'StandardScript'+new Date().toISOString().substring(0, 10));
oracleCxmOutcome.setMessage('MESSAGE_TYPE_SUCCESS', '' ,  'OOB Script for oppty-OnCreate executed');

オブジェクト: 商談

イベント: BeforeSave

要件: 子の売上金額に基づいて

商談売上金額を更新する。

var oracleCxmOutcome = new Result('');
var currentRow = await getCurrentRow();
var childRev = currentRow.getColumn('ChildRevenue');
	let totalAmount = 0;
if(childRev) {
let items = currentRow.getColumn('ChildRevenue').items;
		if(items) {
			items.forEach((item) => {
				totalAmount = totalAmount + item.RevnAmount;
			});
		}
}
	currentRow.setColumn('Revenue',totalAmount);

オブジェクト: 商談

イベント: AfterSave

要件: 商談が新しく作成されたものでない場合、

商談にノートを追加する。

var oracleCxmOutcome = new Result('');
var optiRow = await getCurrentRow();
if(!optiRow.isNew()) {
    var opptyNote = await createNewRow(true, 'opportunities', 'Note');
    var noteTxt = 'VGhpcyBOb3RlIHdhcyBjcmVhdGVkIHRocm91Z2ggc2NyaXB0IGZvciBvcHB0eSAtIA==';
    opptyNote.setColumn('NoteTxt',noteTxt);
    optiRow.setColumn('Note',opptyNote);
    oracleCxmOutcome.setModifiedObject(optiRow);
}

オブジェクト: 商談

イベント: OnFieldValueChange - Status Code

要件: ステータス・コード値が

WON/LOSTに変更され、受注/失注事由が指定されていない場合、

ReasonWonLostCodeフィールドが必須になり、

「Please specify win/loss reason」というメッセージが表示される。

var oracleCxmOutcome = new Result('');
var optyRow = await getCurrentRow();
var statusCode = optyRow.getColumn('StatusCode');
var reasonWonLostCode = optyRow.getColumn('ReasonWonLostCode');

if((statusCode === 'WON' || statusCode === 'LOST') && (!reasonWonLostCode)) {
    oracleCxmOutcome.setMessage('MESSAGE_TYPE_SUCCESS', '' ,  'You have selected' + statusCode);
    optyRow.setColumnMandatory('ReasonWonLostCode', true);
    oracleCxmOutcome.setMessage('MESSAGE_TYPE_ERROR', '' ,  'Please specify win/loss reason');
}

 if(statusCode !== 'WON' && statusCode !== 'LOST') {
 optyRow.setColumn('ReasonWonLostCode',null);
 optyRow.setColumnMandatory('ReasonWonLostCode', false);
 }

オブジェクト: 商談売上

イベント: OnCreate

要件: 商談売上という子オブジェクトのOnCreateイベントによって、そのカスタム・フィールド値が自動移入される。

var optiRow = getCurrentRow();
const optyRow = getCurrentRow();
const childRev = getCurrentChildRow();
var oracleCxmOutcome = new Result("");
childRev.setColumn('CXM_Text_c','Single Text');
childRev.setColumn('CXM_Date_c',"2020-03-20");
childRev.setColumn('CXM_CC_c',true);
childRev.setColumn('CXM_Perc_c',.32);
childRev.setColumn('CXM_Num_c',5000);
childRev.setColumn('CXM_LText_c','RGVtbyB0ZXh0IHRvIGJlIGVudGVyZWQ=');

oracleCxmOutcome.setMessage("MESSAGE_TYPE_SUCCESS", "", "OnCreate on Child:");

オブジェクト: 商談

イベント: OnFieldValueChange

フィールド: フィルタ値がチェックされる動的選択リスト。

要件: ユーザーがフィルタ基準を満たさない動的選択リスト値を選択しようとすると、エラーがトリガーされる。

前提条件: CX Sales Mobileのフィルタ・オブジェクト・ピッカー・ページにフィルタ基準フィールド(この例ではアカウント・タイプ)が含まれていること。

var oracleCxmOutcome = new Result('');
const optyRow = getCurrentRow();
const accountsQuery = query('accounts'); //query accounts or another object, depending on the use case
accountsQuery.setParameters('PartyId', optyRow.getColumn('account_dcl_Id_c')); //be sure to use the ID field for your DCL here, not the name field
try {
const accountsResponse = accountsQuery.execute();
if (accountsResponse && accountsResponse.length > 0) {
if(accountsResponse[0].getColumn('OrganizationDEO_LSAccountType_c') !== 'SERVICE_CENTER'){ //This checks to see if the filter criteria applied to the DCL are met
  oracleCxmOutcome.setMessage('MESSAGE_TYPE_ERROR', '' ,  'You must choose an organization that is a Service Center. Choose the Service Centers list in the Show filter.');
oracleCxmOutcome.setOutcomeQualifier("OUTCOME_TYPE_FAILURE"); //The error message here indicates that Service Centers is the name of the saved Workspace Search, and is the filter the user should select
}
}
} catch (e) {
//failed to get accounts response
}

オブジェクト: 商談

イベント: BeforeSave

要件: ユーザーが無効な動的選択リスト値のあるレコードを保存しようとすると、エラーがトリガーされる。

前提条件: CX Sales Mobileのフィルタ・オブジェクト・ピッカー・ページにフィルタ基準フィールド(この例ではアカウント・タイプ)が含まれていること。

var oracleCxmOutcome = new Result('');
const optyRow = getCurrentRow();
const accountsQuery = query('accounts'); //query accounts or another object, depending on the use case
accountsQuery.setParameters('PartyId', optyRow.getColumn('account_dcl_Id_c')); //be sure to use the ID field for your DCL here, not the name field
try {
const accountsResponse = accountsQuery.execute();
if (accountsResponse && accountsResponse.length > 0) {
if(accountsResponse[0].getColumn('OrganizationDEO_LSAccountType_c') !== 'SERVICE_CENTER'){ //This checks to see if the filter criteria applied to the DCL are met
  oracleCxmOutcome.setMessage('MESSAGE_TYPE_ERROR', '' ,  'You must choose an organization that is a Service Center. Choose the Service Centers list in the Show filter.');
oracleCxmOutcome.setOutcomeQualifier("OUTCOME_TYPE_FAILURE"); //The error message here indicates that Service Centers is the name of the saved Workspace Search, and is the filter the user should select
}
}
} catch (e) {
//failed to get accounts response
}