スクリプトノードを使えば、ダイアログタスクでJavaScriptのコードを書くことができます。
スクリプトノードを使うと、次のようなことができます。
- API コールを実行する前にユーザー入力パラメーターを操作します。
- ダイアログを続ける前に、API レスポンスペイロードからパラメータを操作します。
- ユーザーにカスタムのエラーメッセージを表示します。
- 複雑なビジネスルールに基づく決定を行います。
ボットビルダーでダイアログをテストすると、スクリプトノードのエラーは、スクリプトノードのエラーダイアログに行番号と列番号、および関連するContext
オブジェクトとともに表示されます。次の図のように、スクリプトノードにあるエラーダイアログで直接スクリプトの更新とテストができます。
スクリプトノードを設定する
ダイアログタスクでエンティティノードを設定するには、次のステップを実行します。
コンポーネントプロパティを設定する
注意:これらのセクションで設定または編集した設定は、このノードを使用する他のすべてのダイアログタスクに反映されます。
- スクリプトノードに 名前と 表示名 を入力します。ノード名にスペースを含めることはできません。
- スクリプトの定義セクションで、スクリプトの定義をクリックして JavaScript を追加します。
- スクリプトの追加のダイアログが表示されます。
- JavaScriptを入力し、保存をクリックします。JavaScriptのコード例については以下を参照してください。
- 変数名前空間]セクション(ver8.0で導入)で、このノードとその遷移の実行に使用される変数名前空間を関連付けます。このオプションは、ボットで変数名前空間が有効になっている場合にのみ表示されます。タスクレベルの設定を使用するか、このノード用にカスタマイズできます。詳細については、「名前空間の管理」を参照してください。
接続プロパティを設定する
ノードの接続パネルから、次に実行するノードを決定することができます。条件文は、ダイアログタスク内の任意のエンティティまたはコンテキストオブジェクトの値に基づいて条件文を記述したり、遷移にインテントを使用することができます。
コンポーネントの遷移を設定するには、次のステップを実行します。
- デフォルト接続の下にある利用可能なノードから選択できます。
- 条件付きフローを構成するには、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;