スクリプトノードを使えば、ダイアログタスクでJavaScriptのコードを書くことができます。
スクリプトノードを使うと、次のようなことができます。
- API コールを実行する前にユーザー入力パラメーターを操作します。
- ダイアログを続ける前に、API レスポンスペイロードからパラメータを操作します。
- ユーザーにカスタムのエラーメッセージを表示します。
- 複雑なビジネスルールに基づく決定を行います。
ボットビルダーでダイアログをテストすると、スクリプトノードのエラーは、スクリプトノードのエラーダイアログに行番号と列番号、および関連するContext
オブジェクトとともに表示されます。次の図のように、スクリプトノードにあるエラーダイアログで直接スクリプトの更新とテストができます。
スクリプトノードを設定する
ダイアログタスクでエンティティノードを設定するには、次のステップを実行します。
ステップ3:接続プロパティを設定する
ノードの接続パネルから、次に実行するノードを決定することができます。条件文は、ダイアログタスク内の任意のエンティティまたはコンテキストオブジェクトの値に基づいて条件文を記述したり、遷移にインテントを使用することができます。
コンポーネントの遷移を設定するには、次のステップを実行します。
- デフォルト接続の下にある利用可能なノードから選択できます。
- 条件付きフローを構成するには、IFを追加をクリックします。
- 次のいずれかの基準に基づいて条件式を設定します。
- エンティティ:これらの演算子のいずれかを使用して、ダイアログ内のエンティティノードを特定の値と比較します。存在する、等しい、より大きいか等しい、より小さいか等しい、等しくない、より大きい、より小さい。それぞれのドロップダウンリストを使用して、エンティティ、演算子を選択し、値ボックスに数値を入力します。例:PassengerCount (エンティティ) が5 (指定された値) より大きい (演算子)
- コンテキスト:これらの演算子のいずれかを使用して、ダイアログ内のコンテキストオブジェクトを特定の値と比較します。存在する、等しい、より大きいか等しい、より小さいか等しい、等しくない、より大きい、より小さい。例: Context.entity.PassengerCountが5 (指定された値) より大きい (演算子)
- インテント:次のユーザー発言と一致するインテントを選択します。
- Then go to のドロップダウンリストから、条件式が成功した場合にダイアログフローで実行する次のノードを選択します。たとえば、PassengerCount (エンティティ) が5 (指定された値) より大きい (演算子) 場合、 (Then go to) Offers (サブダイアログ) に進みます。
- Elseのドロップダウンリストから、条件式が失敗した場合に実行するノードを選択します。
JavaScriptの記述例
ダイアログタスクのフローを管理するなど、JavaScriptを使用してAPI呼び出しの前後にデータを処理させることで、ダイアログタスクをカスタマイズすることができます。Context
オブジェクトのタイプアヘッド機能を使用して、次の図のように動的変数を識別して選択することができます。詳細については、コンテキストオブジェクトを参照してください。
例1:データの操作
JavaScriptでは、セッション変数を使ってセッションデータからデータを取得することができます。たとえば次のコード例では、context.session.UserContext.identities
を使ってユーザーIDをGETし、context
にデータをPUTします。
var x = context.session.UserContext.identities; var isEmailFound = false; for (var i = 0; i < x.length; i++) { if (x[i].type === ""mapped"") { var identity = x[i].val; var arr = identity.split (""/"") ; var pattern = /^cs/i; var result = arr[0].match (pattern) ; if (result) { isEmailFound = true; context.UserSession.put (""rtmEmail"", arr[1], '20000') ; } } } ...
詳細については、タスクでのセッション変数とコンテキスト変数の使用を参照してください。
例2:条件の取り扱い
以下のコード例では、data.results
にIDが指定されていない場合に、サービスノードのレスポンスボディからContext
オブジェクト変数を使用して顧客IDを返します。
var data = context.getcontactsService.response.body; if (data & amp; & amp; typeof (data.results) != 'undefined') { context.customerID = data.results.customerId; } else { context.customerID = context.Usersession.customerID; }
例3:フローの取り扱い
次のスクリプトノードコード例では、Context
オブジェクト変数を使用して、銀行振込額が選択された口座タイプの制限を超えないかどうかを検証しています。
var valid = 0; var i = 0; while (context.accdata.length - i) { if (context.accdata[i].accountType == context.entities.FromAccountName) { if ( (context.accdata[i].amount - context.entities.Amount) < 0) { valid = 3; } else { if (context.entities.Amount > context.accdata[i].transferLimit) { valid = 0; } else { valid = 2; } } } i++; } context.canProceed = valid;