CTIOperationRequest:スコープ付き、グローバル

  • リリースバージョン: Xanadu
  • 更新日 2024年08月01日
  • 所要時間:81分
  • CTIOperationRequest スクリプトインクルードは、現在の CTIOperationRequest オブジェクトのデータを設定および取得するメソッドを提供します。

    CTIOperationRequest オブジェクトを使用して、ServiceNow 音声アシスト機能 フレームワーク内のメッセージトランスフォーマーと操作ハンドラーの間で情報を渡します。

    通常、メッセージトランスフォーマーは、受信する CTI 固有のペイロードを解析し、関連する CTIOperationRequest オブジェクトにペイロードデータを設定する役割を担います。操作ハンドラーは、CTIOperationRequest オブジェクトから情報を取得し、そのデータを使用して要求された操作を処理する役割を担います。

    ServiceNow ベースシステムは、Amazon Connect への接続を有効にする機能している操作ハンドラーとメッセージトランスフォーマーを提供します。Amazon Connect 内で連絡先フローを構築する場合、Amazon サービスと ServiceNow インスタンスの間に次の 2 つの統合ポイントがあります。
    • Amazon Web Services (AWS) Lambda プロキシ (AWS Lambda 関数の呼び出し)
    • AWS Lex ボット (顧客入力を取得)
    これらの統合ポイントに利用可能な操作ハンドラーとメッセージトランスフォーマーは、操作ハンドラー [sn_cti_operation_handler] テーブルおよびプロバイダーメッセージトランスフォーマー [sn_cti_provider_msg_transormer] テーブルにあります。

    操作要求を行うコンピューター電話統合 (CTI) プロバイダーなどの外部ソースから ServiceNow インスタンスにペイロードが渡されます。要求を受信すると、メッセージトランスフォーマーがペイロードを解析し、CTIOperationRequest 設定メソッドを使用して、操作ハンドラー名などのペイロード値を操作および問い合わせ固有の CTIOperationRequest オブジェクトに設定します。

    例えば、次のメッセージトランスフォーマースクリプトは、渡された JSON ペイロードを解析し、関連する操作ハンドラーに必要な値を CTIOperationRequest オブジェクトに設定します。

    {	
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
    	var event = jsonPayload.event;
    	if (event) {
    	  var details = event.Details;
    	  if (details) {					
    	    operationRequest.setOperationName(details.Parameters['sn_operation']);
    	    var contactData = details.ContactData;
    	    if(contactData) {
    		// Call id should be surfaced in openframe call log so it can be tied to transcription later
    		operationRequest.setParameter('contact.call_id', contactData.ContactId);
    		for(var ck in contactData.CustomerEndpoint) {
    		  operationRequest.setParameter('contact.' + ck, contactData.CustomerEndpoint[ck]);
    	       }
    	       operationRequest.setParameter('contact.id', contactData.ContactId);
    	       operationRequest.setParameter('contact.phone', contactData.CustomerEndpoint.Address);
    	    }
    	    var parameters = details.Parameters;
    	    if (parameters) {
    		for (var pk in parameters) {
    		  switch(pk) {
    		    case 'interactionId':
    			operationRequest.setInteractionSysId(parameters[pk]);
    			break;
    		    case 'authToken':
    			operationRequest.setAuthToken(parameters[pk]);
    			break;
    		    case 'language':
    			operationRequest.setLanguage(parameters[pk]);
    			break;
    								
    		    default:
    			operationRequest.setParameter(pk, parameters[pk]);
    		 }						
                }
              }					
            }
          }
        }
      } catch(e) {
    		ctx.setError(e);
      }
    })(httpRequest, operationRequest, ctx);

    メッセージトランスフォーマーが渡されたペイロードの解析を終了すると、ServiceNow 音声アシスト機能 フレームワークは指定された操作ハンドラーをインスタンス化します。操作ハンドラーは、 CTIOperationResponse スクリプトインクルードの get メソッドを使用して、要求された操作を処理するために必要な情報を関連する CTIOperationRequest オブジェクトから取得します。

    例えば、次の操作ハンドラースクリプトは、CTIOperationRequest オブジェクトに設定された値を、コールに関連付けられたインタラクションレコードに格納します。

    (function(/*CTIOperationRequest*/ request, /*CTIOperationResponse*/ response, ctx) {
      // Returns the sys_id of the interaction record.
      var interactionSysId = request.getInteractionSysId();
      var number = request.getParameter('number');
      var addComment = request.getParameter('add_comment');
      addComment = addComment ? addComment.toLowerCase() : addComment;
      addComment = 'yes' === addComment || 'true' === addComment || '1' === addComment;
      var workNotes = request.getParameter('work_notes');
      var message = gs.getMessage('Thankyou');
      var interactionGr = request.getInteractionRecord();
      var openedFor = interactionGr ? interactionGr.getValue('opened_for') : null;
      if (openedFor && number && addComment && workNotes) {
        var now_GR = new GlideRecordSecure('incident');
        now_GR.addQuery('caller_id', openedFor);
        now_GR.addQuery('number', number);
        now_GR.query();
        if (now_GR.next()) {
          now_GR.work_notes += workNotes;
          now_GR.update();
          message = now_GR.getMessage('Your comment was added');
        }
      }
      response.setStatusCode(200);
      response.setMessage(message);
    })(request, response, ctx);

    操作ハンドラーの作成の詳細については、「 発信者との自動インタラクションの連絡先フローの構成」を参照してください。

    このスクリプトインクルードは sn_cti_core 名前空間で実行されます。CTIOperationRequest スクリプトインクルードにアクセスするには、ServiceNow 音声アシスト機能(sn_cti_core)プラグインをアクティブにする必要があります。ServiceNow 音声アシスト機能のアクティブ化については、「ServiceNow 音声アシスト機能アプリケーションのインストール」を参照してください。

    ServiceNow 音声アシスト機能の詳細については、「ServiceNow 音声アシスト機能」を参照してください。

    CTIOperationRequest - CTIOperationRequest(文字列 origin)

    CTIOperationRequest オブジェクトをインスタンス化します。

    表 : 1. パラメーター
    名前 タイプ 説明
    origin 文字列 オプション。要求の作成元です。通常は、コンピューター電話統合プロバイダーの名前です。

    デフォルト:null

    var request = new sn_cti_core.CTIOperationRequest('AWS Connect');
    request.setSessionAttribute('contact.phone', '+15552222345');
    request.setSessionAttribute('contact.okToCall', true);
    request.setSessionAttribute('contact.address', {
        street: '1234 Main St'
        city: 'API City',
        zip: 91335
    });

    CTIOperationRequest - getAuthToken()

    関連する CTIOperationRequest オブジェクトに設定された認証トークンを返します。

    ハンドラーの auth_required フラグが true に設定されている場合、このトークンは、要求された操作ハンドラーを実行する前に ServiceNow 音声アシスト機能 フレームワークによって、現在の ServiceNow 音声アシスト機能 ユーザーを認証するために使用されます。auth_required フラグは、操作ハンドラー [sn_cti_operation_handler] テーブルのフィールドです。認証トークンの有効期間は、コールセッションの有効期間である必要がありますが、CTI プロバイダーによって決定されます。

    独自の認証操作ハンドラーを作成することで、実装に必要なあらゆる認証/認可処理を定義できます。認証トークンの生成方法に関係なく、メッセージ翻訳者は CTI ペイロードでトークンを返す必要があります。さらに、CTI プロバイダーはこの認証トークンをローカルに保存し、認証が必要な各操作要求で渡す必要があります。

    インスタンスが提供する認証操作ハンドラーを使用する場合、ハンドラーはユーザーが入力した 4 桁の PIN に基づいて認証トークンの作成を開始します。次に、CTIOperationResponse オブジェクトの sessionAttributes オブジェクトに認証トークンを設定します。関連するメッセージトランスフォーマーは、sessionAttributes オブジェクトを CTI 固有のペイロードに変換し、CTI プロバイダーに送信します。

    注:
    認証トークンが渡されない場合、 auth_required フラグが設定された操作ハンドラーの実行要求はすべて失敗します。認証を使用しない場合は、認証トークンを維持する必要はありません。
    ServiceNow ベースシステムは、Amazon Connect への接続を有効にする機能している操作ハンドラーとメッセージトランスフォーマーを提供します。Amazon Connect 内で連絡先フローを構築する場合、Amazon サービスと ServiceNow インスタンスの間に次の 2 つの統合ポイントがあります。
    • Amazon Web Services (AWS) Lambda プロキシ (AWS Lambda 関数の呼び出し)
    • AWS Lex ボット (顧客入力を取得)
    これらの統合ポイントに利用可能な操作ハンドラーとメッセージトランスフォーマーは、操作ハンドラー [sn_cti_operation_handler] テーブルおよびプロバイダーメッセージトランスフォーマー [sn_cti_provider_msg_transormer] テーブルにあります。
    表 : 2. パラメーター
    名前 タイプ 説明
    なし
    表 : 3. 返される内容
    タイプ 説明
    文字列 現在の ServiceNow 音声アシスト機能 ユーザーに関連付けられた認証トークンです。
    (function( /*CTIProviderResponseExecutionContext*/ ctx, /*CTIOperationRequest*/ operationRequest, /*CTIOperationResponse*/ operationResponse, /*HTTPResponse*/ httpResponse) {
      var sessionAttributes = {},
          intentResponse;
      var statusCode = -1;
      var message = 'Unprocessed';
      if (operationResponse) {
        statusCode = operationResponse.getStatusCode();
        sessionAttributes = operationResponse.getSessionAttributes();
        message = operationResponse.getMessage();
        var error = operationResponse.getError();
        if (error) {
          sessionAttributes.error = error;
        }
      }
      if (sn_cti_core.CTIRequestDispatcher.Constants.HTTP.Status.AUTH_REQUIRED.code === statusCode) {
        //first call for a secure action without authentication token
        sessionAttributes.statusCode = 401;
        sessionAttributes.message = message;
        intentResponse = {
          sessionAttributes: sessionAttributes,
          dialogAction: {
            type: 'Close',
            fulfillmentState: 'Fulfilled',
            message: {
              contentType: 'PlainText',
              content: 'This operation requires authentication. Say authenticate for authentication.'
            }
          }
        };
      } else if ('DialogCodeHook' === operationRequest.getParameter('$$invocationSource')) {
          //pass back authToken and interactionId
          sessionAttributes.authToken = operationRequest.getAuthToken();
          sessionAttributes.interactionId = operationRequest.getInteractionSysId();
          var originalSlots = operationRequest.getParameter('$$slots');
          var responseParameters = operationResponse ? operationResponse.getParameters() : {};
          responseParameters = responseParameters ? responseParameters : {};
          // See if processing happened and we got a dialogAction
          var responseDialogAction = responseParameters['dialogAction'];
          // Default dialog action
          var dialogAction = {
            type: 'Delegate',
            slots: originalSlots
          };
          // If the response doesn't contain an override replay the inputs
          if (responseDialogAction) {
            // We bypassed dialoghook so delegate and pass through inputs
            dialogAction = responseDialogAction;
          }
          intentResponse = {
            sessionAttributes: sessionAttributes,
            dialogAction: dialogAction
          };
      } else {
        // Override required session attributes
        sessionAttributes.statusCode = statusCode;
        sessionAttributes.message = message;
        // Build response template
        intentResponse = {
          sessionAttributes: sessionAttributes,
          dialogAction: {
            type: 'Close',
            fulfillmentState: 'Fulfilled',
            message: {
              contentType: 'PlainText',
              content: message
            }
          }
        };
      }
      httpResponse.setBody(intentResponse);
    })(ctx, operationRequest, operationResponse, httpResponse);

    CTIOperationRequest - getInteractionRecord()

    操作要求に関連付けられたインタラクション GlideRecord を返します。

    インタラクションは、チャット、電話、対面を通じて行われる支援に関する顧客の要求を表します。インタラクションは、アサインのためにキューにルーティングするか、エージェントに直接アサインできます。インタラクションレコードは、インタラクション [interaction] テーブルに格納されます。これには、特定のセッションでのサービスアカウントの顧客とのインタラクションを記述するあらゆるタイプのデータを含めることができます。

    インタラクションレコードは、CTIOperationRequest - setInteractionSysId(文字列 Id) メソッドを介して CTIOperationRequest オブジェクトに関連付けられます。このメソッドは一般に、メッセージトランスフォーマーによって呼び出されます。呼び出される順番は getInteractionRecord() メソッドの前でなければなりません。

    表 : 4. パラメーター
    名前 タイプ 説明
    なし
    表 : 5. 返される内容
    タイプ 説明
    GlideRecord 現在の CTIOperationRequest オブジェクトに関連付けられたインタラクション GlideRecord オブジェクトです。インタラクションレコード sys_id が CTIOperationRequest オブジェクトに設定されていない場合は、null を返します。
    (function(/*CTIOperationRequest*/ request, /*CTIOperationResponse*/ response, /*Context*/ ctx) {	
      var notes = '', lang = request.getLanguage();
      try { 
        // Returns the interaction record (GlideRecord) set on the passed in CTIOperationRequest object		
        var interactionGr = request.getInteractionRecord();
    
        var now_GR = new GlideRecord('sys_user');
        if(interactionGr && now_GR.get(interactionGr.opened_for.toString())) {	
        if(now_GR.locked_out == true) {
            notes += gs.getMessageLang("User record found locked. Unlocking the account.\n", lang);
            now_GR.locked_out=false;
            now_GR.update();
            response.setStatusCode(200);
            response.setMessage(gs.getMessageLang("Your account has been unlocked.", lang));
          } else {
            notes += gs.getMessageLang("User record not locked.\n", lang);
            response.setStatusCode(200);
            response.setMessage(gs.getMessageLang("Your account doesn't seem to be locked.", lang));
          }	
        } else {
          notes += gs.getMessageLang("User record not found. Transfer to agent\n", lang);
          response.setStatusCode(302);
          response.setMessage(gs.getMessageLang("I am unable to find your record. Let me transfer to someone who can help.", lang));
        }
        if(interactionGr) {
          interactionGr.work_notes = notes;
          interactionGr.update();
        }
      } catch(e) {
        ctx.setError(e);
      }
    })(request, response, ctx);

    CTIOperationRequest - getInteractionSysId()

    現在の CTIOperationRequest オブジェクトに関連付けられたインタラクションレコードの sys_id を返します。

    このメソッドを呼び出す前に、CTIOperationRequest - setInteractionSysId(文字列 Id) メソッドを呼び出す必要があります。

    表 : 6. パラメーター
    名前 タイプ 説明
    なし
    表 : 7. 返される内容
    タイプ 説明
    文字列 現在の CTIOperationRequest オブジェクトに設定されているインタラクションレコードの sys_id です。

    関連する CTIOperationRequest オブジェクトに sys_id が設定されていない場合、このメソッドは null を返します。

    (function( /*CTIOperationRequest*/ request, /*CTIOperationResponse*/ response, ctx) {
      // Returns the sys_id of the interaction record associated with the CTIOperationRequest object.
      var interactionSysId = request.getInteractionSysId();
      var number = request.getParameter('number');
      var addComment = request.getParameter('add_comment');
      addComment = addComment ? addComment.toLowerCase() : addComment;
      addComment = 'yes' === addComment || 'true' === addComment || '1' === addComment;
      var workNotes = request.getParameter('work_notes');
      var message = gs.getMessage('Thankyou');
      var interactionGr = request.getInteractionRecord();
      var openedFor = interactionGr ? interactionGr.getValue('opened_for') : null;
      if (openedFor && number && addComment && workNotes) {
        var now_GR = new GlideRecordSecure('incident');
        now_GR.addQuery('caller_id', openedFor);
        now_GR.addQuery('number', number);
        now_GR.query();
        if (now_GR.next()) {
        now_GR.work_notes += workNotes;
        now_GR.update();
          message = gs.getMessage('Your comment was added');
        }
      }
      response.setStatusCode(200);
      response.setMessage(message);
    })(request, response, ctx);

    CTIOperationRequest - getLanguage()

    現在の CTIOperationRequest オブジェクトに設定されている ISO 639.1 言語コードを返します。

    顧客の優先言語を使用すると、プラットフォームが提供する国際化およびローカライズ機能を使用して、関連する発信者とのメッセージやその他の通信をカスタマイズできます。

    通常、操作ハンドラーは getLanguage() メソッドを呼び出し、メッセージトランスフォーマーは CTIOperationRequest - setLanguage(文字列 languageCode) メソッドを呼び出して CTIOperationRequest オブジェクトに言語を設定します。

    表 : 8. パラメーター
    名前 タイプ 説明
    なし
    表 : 9. 返される内容
    タイプ 説明
    文字列 現在の CTIOperationRequest オブジェクトに設定されている ISO 639.1 言語コードです。言語コードが設定されていない場合は、enを返します。

    次の例は、getLanguage() を呼び出して発信者の優先言語を取得する操作ハンドラーを示しています。

    (function(/*CTIOperationRequest*/ request, /*CTIOperationResponse*/ response) {
      // Obtain the contact's preferred language
      var notes = "", announcement, lang = request.getLanguage();
      try {
    		
        var interactionGr = request.getInteractionRecord();
    		
        announcement = gs.getMessageLang("We are currently experiencing issues with VPN. If you are calling about VPN issues, you may hang up the call.", lang);
        // Use the contact's language to customize the response messages and notes	
        if(announcement) {	
          notes = gs.getMessageLang("Listened to announcement: {0}", lang, [announcement]);
          response.setStatusCode(200);
        } else {
          announcement = gs.getMessageLang("There are currently no known outage announcements", lang);
          //use the status case as the flag to check for announcements in contact flow
          response.setStatusCode(404);
        }			
        response.setMessage(announcement);	
    			
        if(interactionGr && notes) {			
          interactionGr.work_notes = notes;		
          interactionGr.update();
        }
    		
      } catch(e) {
        ctx.setError(e);
      }
    
    })(request, response);

    CTIOperationRequest - getMajorVersion()

    現在の CTIOperationRequest オブジェクトに設定されているコンピューター電話統合 (CTI) ソフトウェアのメジャーバージョンを返します。

    ServiceNow インスタンスに接続されている CTI プロバイダーが複数のバージョンのソフトウェアを実行している場合は、ソフトウェアのバージョンごとに異なる処理動作が必要になる可能性があるため、このメソッドを使用します。ソフトウェアのバージョン間で処理の動作がわずかに異なるだけの場合は、操作ハンドラーを 1 つだけにすることができます。その後、要求を行っているソフトウェアのバージョンを確認するだけで、処理の違いに対応し、操作ハンドラー内で要求/データを処理できます。必要な処理がバージョン間で大幅に異なる場合は、複数の操作ハンドラーを使用する方が効率的です。

    通常、メッセージトランスフォーマーは、CTIOperationRequest - setMajorVersion(数値 majorVersion) メソッドを呼び出して CTIOperationRequest オブジェクトにソフトウェアバージョンを設定し、操作ハンドラーは、このメソッドを使用して設定値を使用します。また、CTIOperationRequest - getMinorVersion() および CTIOperationRequest - setMinorVersion(数値 minorVersion) メソッドを使用して、プロバイダーのソフトウェアのマイナーバージョン値も取得/設定できます。

    表 : 10. パラメーター
    名前 タイプ 説明
    なし
    表 : 11. 返される内容
    タイプ 説明
    番号 CTI ソフトウェアのメジャーバージョン番号です。

    メジャーバージョンが設定されていない場合は、1 を返します。

    var request = new sn_cti_core.CTIOperationRequest('origin');
    var majorVersion = request.getMajorVersion();

    CTIOperationRequest - getMinorVersion()

    CTIOperationRequest オブジェクトに関連付けられているコンピューター電話統合 (CTI) ソフトウェアのマイナーバージョンを返します。

    ServiceNow インスタンスに接続されている CTI プロバイダーが複数のバージョンのソフトウェアを実行している場合は、ソフトウェアのバージョンごとに異なる処理動作が必要になる可能性があるため、このメソッドを使用します。ソフトウェアのバージョン間で処理の動作がわずかに異なるだけの場合は、操作ハンドラーを 1 つだけにすることができます。その後、要求を行っているソフトウェアのバージョンを確認するだけで、処理の違いに対応し、操作ハンドラー内で要求/データを処理できます。必要な処理がバージョン間で大幅に異なる場合は、複数の操作ハンドラーを使用する方が効率的です。

    通常、メッセージトランスフォーマーは CTIOperationRequest - setMinorVersion(Number minorVersion) CTIOperationRequest - setMinorVersion(数値 minorVersion) メソッドを呼び出して CTIOperationRequest オブジェクトにソフトウェアバージョンを設定し、操作ハンドラーはこのメソッドを使用して設定値を消費します。また、CTIOperationRequest - getMajorVersion() CTIOperationRequest - getMajorVersion() メソッドおよび CTIOperationRequest - setMajorVersion(Number majorVersion) CTIOperationRequest - setMajorVersion(数値 majorVersion) メソッドを使用して、プロバイダーのソフトウェアのメジャーバージョン値を取得/設定することもできます。

    表 : 12. パラメーター
    名前 タイプ 説明
    なし
    表 : 13. 返される内容
    タイプ 説明
    番号 CTI ソフトウェアのマイナーバージョン番号です。

    マイナーバージョンが設定されていない場合は、0 を返します。

    var request = new sn_cti_core.CTIOperationRequest('origin');
    var minorVersion = request.getMinorVersion();

    CTIOperationRequest - getOperationName()

    コンピューター電話統合 (CTI) プロバイダーが実行を要求している操作の名前を返します。

    操作名によって、要求の処理に使用される操作ハンドラーが決まります。通常、メッセージトランスフォーマーは、CTIOperationRequest - setOperationName(文字列 name) メソッドを使用して CTIOperationRequest オブジェクトに操作名を設定します。

    注:
    getOperationName() メソッドは、関連する操作ハンドラーをインスタンス化しません。これは ServiceNow 音声アシスト機能フレームワークによって行われます。このメソッドは、関連する操作ハンドラー名を返すだけです。
    注:
    Amazon Connect Lex ボットの実装では、異なる Amazon インテントに同じ名前を使用することはできないため、インテント名に 5 文字のサフィックスが追加されます。ServiceNow 音声アシスト機能 フレームワークでは、インテント名は操作ハンドラー名と同じです。操作ハンドラーは、このサフィックス (myOperation_SUFFX) を含む操作ハンドラー名を持たせてインテントに固有にすることもできれば、汎用にして複数の CTI プロバイダーや異なるユースケース (HR 要求とヘルプデスク要求の処理に同じハンドラー (myOperation) を使用するなど) で使用することもできます。
    表 : 14. パラメーター
    名前 タイプ 説明
    なし
    表 : 15. 返される内容
    タイプ 説明
    文字列 CTI プロバイダーが実行を要求している操作の名前です。操作名が設定されていない場合は null を返します。
    var request = new sn_cti_core.CTIOperationRequest('origin');
    var name = request.getOperationName();
    

    CTIOperationRequest - getOperationSubStepName()

    現在の CTIOperationRequest オブジェクトに設定されているサブステップ操作ハンドラー名を返します。

    サブステップを使用して、操作を処理する前に初期化や検証などのアクションを実行します。すべての CTI プロバイダーが使用する汎用的な操作ハンドラーとは異なり、サブステップは CTI プロバイダー固有であり、CTI プロバイダーに固有の用語と命名規則を使用します。

    ServiceNow 音声アシスト機能 フレームワークは、次の手順を実行して、必要な操作ハンドラーと関連するサブステップ操作ハンドラーを見つけます。
    注:
    Amazon Connect Lex ボットの実装では、異なる Amazon インテントに同じ名前を使用することはできないため、インテント名に 5 文字のサフィックスが追加されます。ServiceNow 音声アシスト機能 フレームワークでは、インテント名は操作ハンドラー名と同じです。操作ハンドラーは、このサフィックス (myOperation_SUFFX) を含む操作ハンドラー名を持たせてインテントに固有にすることもできれば、汎用にして複数の CTI プロバイダーや異なるユースケース (HR 要求とヘルプデスク要求の処理に同じハンドラー (myOperation) を使用するなど) で使用することもできます。
    1. 要求に関連付けられた操作ハンドラーを探します。
      • 最初に、myOperation_SUFFX という名前の操作ハンドラーをチェックします。
      • 見つからない場合は、操作ハンドラー myOperation をチェックします。見つからない場合はエラーになります。
    2. ハンドラーが見つかった場合、操作ハンドラーの auth_required フラグがチェックされます。設定すると、有効な認証トークン (getAuthToken() メソッドで取得されます) が要求に存在することが確認されます。存在していて有効な場合は処理を続行し、それ以外の場合はエラーをスローします。
    3. サブステップで渡された操作ハンドラーを探します。この例では、subStepName=SubStep と仮定します。
      • 最初に、myOperation_SUFFX.SubStep という名前の操作ハンドラーをチェックします。見つかった場合は、ハンドラーを実行します。
      • 見つからない場合は、操作ハンドラー myOperation.SubStep をチェックします。見つかった場合は、ハンドラーを実行します。
      • 見つからない場合は、要求オブジェクトに subStepNotFoundBehavior が設定されているかどうかを確認します。
      • 設定されている場合、動作を実行します。設定されていない場合はエラーになります。
    4. プライマリ操作ハンドラー (myOpersation_SUFFX または myOperation) を実行します。

    通常、メッセージトランスフォーマーは、CTIOperationRequest - setOperationSubStepName(文字列 name) メソッドを使用して CTIOperationRequest オブジェクトにサブステップ名を設定します。CTIOperationRequest - setSubStepNotFoundBehaviour(オブジェクト behaviour) メソッドを呼び出して独自のトランスフォーマーを作成する場合は、この動作を上書きできます。

    表 : 16. パラメーター
    名前 タイプ 説明
    なし
    表 : 17. 返される内容
    タイプ 説明
    文字列 CTIOperationRequest オブジェクトに設定されているサブステップ操作ハンドラーの名前です。存在しない場合は null を返します。
    var request = new sn_cti_core.CTIOperationRequest('origin');
    var name = request.getOperationSubStepName();

    CTIOperationRequest - getParameter(文字列 key)

    現在の CTIOperationRequest オブジェクトに既に設定されている、指定されたキーの値を返します。

    get/setParameter メソッドを使用すると、メッセージトランスフォーマーと操作ハンドラーの間で実質的に任意の文字列または数値を渡すことができます。パラメーターオブジェクトには、現在の操作要求に直接関連するデータのキー/値ペアを 0 個以上含めることができます。操作ハンドラーは、これらの値を使用するときに必要なキー/値ペアを判断します。通常、メッセージトランスフォーマーは、CTIOperationRequest - setParameter(文字列キー, オブジェクト値) メソッドを呼び出して CTIOperationRequest オブジェクトにこれらのパラメーターを設定し、操作ハンドラーは、このメソッドを使用してそれらを利用します。

    表 : 18. パラメーター
    名前 タイプ 説明
    key 文字列 返されるキーの値の名前です。
    表 : 19. 返される内容
    タイプ 説明
    文字列または数値 指定されたキーの値です。該当するキーが存在しない場合は、null を返します。
    (function( /*CTIOperationRequest*/ request, /*CTIOperationResponse*/ response, ctx) {
      var interactionSysId = request.getInteractionSysId();
      // Returns the number and add_comment parameters from the CTIOperationRequest object
      var number = request.getParameter('number');
      var addComment = request.getParameter('add_comment');
      addComment = addComment ? addComment.toLowerCase() : addComment;
      addComment = 'yes' === addComment || 'true' === addComment || '1' === addComment;
      var workNotes = request.getParameter('work_notes');
      var message = gs.getMessage('Thankyou');
      var interactionGr = request.getInteractionRecord();
      var openedFor = interactionGr ? interactionGr.getValue('opened_for') : null;
      if (openedFor && number && addComment && workNotes) {
        var now_GR = new GlideRecordSecure('incident');
        now_GR.addQuery('caller_id', openedFor);
        now_GR.addQuery('number', number);
        now_GR.query();
        if (now_GR.next()) {
        now_GR.work_notes += workNotes;
        now_GR.update();
          message = gs.getMessage('Your comment was added');
        }
      }
      response.setStatusCode(200);
      response.setMessage(message);
    })(request, response, ctx);

    CTIOperationRequest - getParameters()

    現在の CTIOperationRequest オブジェクトに既に設定されているすべてのパラメーターのキー/値ペアを返します。

    get/setParameter メソッドを使用すると、メッセージトランスフォーマーと操作ハンドラーの間で実質的に任意の文字列または数値を渡すことができます。パラメーターオブジェクトには、現在の操作要求に直接関連するデータのキー/値ペアを 0 個以上含めることができます。操作ハンドラーは、これらの値を使用するときに必要なキー/値ペアを判断します。通常、メッセージトランスフォーマーは、CTIOperationRequest - setParameter(文字列キー, オブジェクト値) メソッドを呼び出して CTIOperationRequest オブジェクトにこれらのパラメーターを設定し、操作ハンドラーは、このメソッドを使用してそれらを利用します。

    表 : 20. パラメーター
    名前 タイプ 説明
    なし
    表 : 21. 返される内容
    タイプ 説明
    オブジェクト CTIOperationRequest オブジェクトに既に設定されているキー/値ペアのマップです。このキー/値ペアは自由形式であり、操作ハンドラーのニーズにより定義されます。戻り値は文字列または数値です。
    var request = new sn_cti_core.CTIOperationRequest('origin');
    var parms = request.getParameters();
    for(var key in parms) {
        gs.info(key + '=' + parms[key]);
    }

    CTIOperationRequest - getSessionAttribute(文字列 key)

    現在の CTIOperationRequest オブジェクトに設定されている、指定されたセッション属性キーの値を返します。

    get/setSessionAttribute メソッドを使用すると、メッセージトランスフォーマーと操作ハンドラーの間で実質的に任意の文字列または数値を渡すことができます。sessionAttribute オブジェクトには、コンピューター電話統合プロバイダーが定義したセッションの期間中に有効なデータのキー/値ペア (連絡先電話番号など) を 0 個以上含めることができます。セッション属性は、問い合わせフロー内でもアクセスできます。操作ハンドラーは、これらの値を使用するときに必要なセッション属性のキー/値ペアを判断します。通常、メッセージトランスフォーマーは、CTIOperationRequest - setSessionAttribute(文字列キー, オブジェクト値) メソッドを呼び出して CTIOperationRequest オブジェクトにこれらの属性を設定します。セッション属性は、セッションの存続期間 (コール全体など) の間存続し、そのコールセッション内の各操作要求とともに CTI プロバイダーによって返される必要があるという点で、パラメーターとは異なります。

    表 : 22. パラメーター
    名前 タイプ 説明
    key 文字列 返されるキーの値の名前です。
    表 : 23. 返される内容
    タイプ 説明
    文字列または数値 指定されたキーの値です。該当するキーが存在しない場合は、null を返します。
    var request = new sn_cti_core.CTIOperationRequest('origin');
    var phoneAttribute = request.getSessionAttribute('contact.phone');

    CTIOperationRequest - getSessionAttributes()

    現在の CTIOperationRequest オブジェクトに設定されたすべてのセッション属性のキー/値ペアのマップを返します。

    get/setSessionAttribute メソッドを使用すると、メッセージトランスフォーマーと操作ハンドラーの間で実質的に任意の文字列または数値を渡すことができます。sessionAttribute オブジェクトには、コンピューター電話統合プロバイダーが定義したセッションの期間中に有効なデータのキー/値ペア (連絡先電話番号など) を 0 個以上含めることができます。セッション属性は、問い合わせフロー内でもアクセスできます。操作ハンドラーは、これらの値を使用するときに必要なセッション属性のキー/値ペアを判断します。通常、メッセージトランスフォーマーは、CTIOperationRequest - setSessionAttribute(文字列キー, オブジェクト値) メソッドを呼び出して CTIOperationRequest オブジェクトにこれらの属性を設定します。セッション属性は、セッションの存続期間 (コール全体など) の間存続し、そのコールセッション内の各操作要求とともに CTI プロバイダーによって返される必要があるという点で、パラメーターとは異なります。

    表 : 24. パラメーター
    名前 タイプ 説明
    なし
    表 : 25. 返される内容
    タイプ 説明
    オブジェクト 関連する CTIOperationResponse オブジェクトに設定されたセッション属性のキー/値ペアのマップです。このマップは自由形式であり、操作ハンドラーのニーズにより定義されます。
    var request = new sn_cti_core.CTIOperationRequest('origin');
    var parms = request.getSessionAttributes();
    for(var key in parms) {
        gs.info(key + '=' + parms[key]);
    }

    CTIOperationRequest - getSubStepNotFoundBehaviour

    サブステップの操作ハンドラーが見つからない場合は、サブステップの処理動作を返します。

    サブステップを使用して、操作を処理する前に初期化や検証などのアクションを実行します。すべての CTI プロバイダーが使用する汎用的な操作ハンドラーとは異なり、サブステップは CTI プロバイダー固有であり、CTI プロバイダーに固有の用語と命名規則を使用します。

    要求されたサブステップ操作ハンドラーが ServiceNow 音声アシスト機能 フレームワークで見つからない場合は、「step not found behavior」の使用が試みられます。この動作は通常、操作が最初に要求されたときにメッセージトランスフォーマーによって設定されます。

    表 : 26. パラメーター
    名前 タイプ 説明
    なし
    表 : 27. 返される内容
    タイプ 説明
    OperationNotFoundBehaviours 操作/サブステップの組み合わせ (<operation_name>.SubStep>) の操作ハンドラーが見つからない場合に実行する動作/処理です。定義されていない場合は null を返します。
    可能な値:
    • OperationNotFoundBehaviours.ThrowError:エラーをスローします。
    • OperationNotFoundBehaviours.PassThrough:要求に対してそれ以上の処理を実行せず、返すだけです。
    • OperationNotFoundBehaviours.RouteToOperation:親操作ハンドラー <operation_name> を使用します。
    var request = new sn_cti_core.CTIOperationRequest('origin');
    var behavior = request.getSubStepNotFoundBehaviour();

    CTIOperationRequest - setAuthToken(文字列 id)

    現在の CTIOperationRequest オブジェクトに認証トークンを設定します。

    ハンドラーの auth_required フラグが true に設定されている場合、このトークンは、要求された操作ハンドラーを実行する前に ServiceNow 音声アシスト機能 フレームワークによって、現在の ServiceNow 音声アシスト機能 ユーザーを認証するために使用されます。auth_required フラグは、操作ハンドラー [sn_cti_operation_handler] テーブルのフィールドです。認証トークンの有効期間は、コールセッションの有効期間である必要がありますが、CTI プロバイダーによって決定されます。

    独自の認証操作ハンドラーを作成することで、実装に必要なあらゆる認証/認可処理を定義できます。認証トークンの生成方法に関係なく、メッセージ翻訳者は CTI ペイロードでトークンを返す必要があります。さらに、CTI プロバイダーはこの認証トークンをローカルに保存し、認証が必要な各操作要求で渡す必要があります。

    インスタンスが提供する認証操作ハンドラーを使用する場合、ハンドラーはユーザーが入力した 4 桁の PIN に基づいて認証トークンの作成を開始します。次に、CTIOperationResponse オブジェクトの sessionAttributes オブジェクトに認証トークンを設定します。関連するメッセージトランスフォーマーは、sessionAttributes オブジェクトを CTI 固有のペイロードに変換し、CTI プロバイダーに送信します。

    注:
    認証トークンが渡されない場合、 auth_required フラグが設定された操作ハンドラーの実行要求はすべて失敗します。認証を使用しない場合は、認証トークンを維持する必要はありません。
    ServiceNow ベースシステムは、Amazon Connect への接続を有効にする機能している操作ハンドラーとメッセージトランスフォーマーを提供します。Amazon Connect 内で連絡先フローを構築する場合、Amazon サービスと ServiceNow インスタンスの間に次の 2 つの統合ポイントがあります。
    • Amazon Web Services (AWS) Lambda プロキシ (AWS Lambda 関数の呼び出し)
    • AWS Lex ボット (顧客入力を取得)
    これらの統合ポイントに利用可能な操作ハンドラーとメッセージトランスフォーマーは、操作ハンドラー [sn_cti_operation_handler] テーブルおよびプロバイダーメッセージトランスフォーマー [sn_cti_provider_msg_transormer] テーブルにあります。
    表 : 28. パラメーター
    名前 タイプ 説明
    ID 文字列 関連する ServiceNow 音声アシスト機能 ユーザーの認証トークンです。
    表 : 29. 返される内容
    タイプ 説明
    なし

    渡された認証トークンを保存するメッセージトランスフォーマースクリプトの例です。

    {	
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
    	var event = jsonPayload.event;
    	if (event) {
    	  var details = event.Details;
    	  if (details) {					
    	    operationRequest.setOperationName(details.Parameters['sn_operation']);
    	    var contactData = details.ContactData;
    	    if(contactData) {
    		// Call id should be surfaced in openframe call log so it can be tied to transcription later
    		operationRequest.setParameter('contact.call_id', contactData.ContactId);
    		for(var ck in contactData.CustomerEndpoint) {
    		  operationRequest.setParameter('contact.' + ck, contactData.CustomerEndpoint[ck]);
    	       }
    	       operationRequest.setParameter('contact.id', contactData.ContactId);
    	       operationRequest.setParameter('contact.phone', contactData.CustomerEndpoint.Address);
    	    }
    	    var parameters = details.Parameters;
    	    if (parameters) {
    		for (var pk in parameters) {
    		  switch(pk) {
    		    case 'interactionId':
    			operationRequest.setInteractionSysId(parameters[pk]);
    			break;
    		    case 'authToken':
    			operationRequest.setAuthToken(parameters[pk]);
    			break;
    		    case 'language':
    			operationRequest.setLanguage(parameters[pk]);
    			break;
    		    case 'statusCode':
    		    case 'message':
    			break;
    								
    		    default:
    			operationRequest.setParameter(pk, parameters[pk]);
    		 }						
                }
              }					
            }
          }
        }
      } catch(e) {
    		ctx.setError(e);
      }
    })(httpRequest, operationRequest, ctx);

    CTIOperationRequest - setInteractionSysId(文字列 Id)

    現在の CTIOperationRequest オブジェクトに、操作要求に関連付けられたインタラクションレコードの sys_id を設定します。

    問い合わせ固有のインタラクションレコード内で問い合わせインタラクション情報を維持する場合は、ServiceNow 音声アシスト機能 コールセッション全体にわたってインタラクションレコード sys_id を維持する必要があります。

    通常、新しい問い合わせコールが開始されると、操作ハンドラーがインタラクションレコードを作成します。次に、CTIOperationRequest - setSessionAttribute(文字列 key, オブジェクト value) メソッドを使用して、関連する CTIOperationResponse オブジェクトに、インタラクションレコード sys_id とテーブル名をセッション属性として設定します。関連するメソッドトランスフォーマーは、この情報をコンピューター電話統合 (CTI) プロバイダーのペイロードに変換し、CTI プロバイダーに送り返します。

    CTI プロバイダーは、問い合わせセッションのインタラクションレコード sys_id をローカルに保存する必要があります。CTI プロバイダーは、この問い合わせセッションの ServiceNow 音声アシスト機能 とのインタラクションのたびに、そのペイロードで対応するインタラクションレコード sys_id を返す必要があります。受信メッセージトランスフォーマーは、ペイロードを解析し、CTIOperationRequest - setInteractionSysId() メソッドを使用して、関連する CTIOperationtRequest オブジェクトにインタラクションレコード sys_id を設定します。

    CTIOperationRequest - getInteractionRecord() メソッドは、この sys_id を使用して問い合わせセッションの正しいインタラクションレコードを取得します。インタラクションレコードはインタラクション [interaction] テーブルにあります。インタラクションレコードの詳細については、「」を参照してください。

    表 : 30. パラメーター
    名前 タイプ 説明
    sys_id 文字列 要求に関連付けるインタラクションレコードの sys_id です。
    表 : 31. 返される内容
    タイプ 説明
    なし

    受信ペイロード (パラメーターとして渡される) からインタラクションレコード sys_id を抽出し、関連する CTIOperationRequest オブジェクトに設定するメッセージトランスフォーマースクリプトの例です。

    {	
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
    	var event = jsonPayload.event;
    	if (event) {
    	  var details = event.Details;
    	  if (details) {					
    	    operationRequest.setOperationName(details.Parameters['sn_operation']);
    	    var contactData = details.ContactData;
    	    if(contactData) {
    		// Call id should be surfaced in openframe call log so it can be tied to transcription later
    		operationRequest.setParameter('contact.call_id', contactData.ContactId);
    		for(var ck in contactData.CustomerEndpoint) {
    		  operationRequest.setParameter('contact.' + ck, contactData.CustomerEndpoint[ck]);
    	       }
    	       operationRequest.setParameter('contact.id', contactData.ContactId);
    	       operationRequest.setParameter('contact.phone', contactData.CustomerEndpoint.Address);
    	    }
    	    var parameters = details.Parameters;
    	    if (parameters) {
    		for (var pk in parameters) {
    		  switch(pk) {
                     // Associate the existing customer interaction record with the request
    		    case 'interactionId':
    			operationRequest.setInteractionSysId(parameters[pk]);
    			break;
    		    case 'authToken':
    			operationRequest.setAuthToken(parameters[pk]);
    			break;
    		    case 'language':
    			operationRequest.setLanguage(parameters[pk]);
    			break;
    		    case 'statusCode':
    		    case 'message':
    			break;
    								
    		    default:
    			operationRequest.setParameter(pk, parameters[pk]);
    		 }						
                }
              }					
            }
          }
        }
      } catch(e) {
    		ctx.setError(e);
      }
    })(httpRequest, operationRequest, ctx);

    CTIOperationRequest - setLanguage(文字列 languageCode)

    CTIOperationRequest オブジェクトに関連操作を処理するときに使用する ISO 639.1 言語コードを設定します。

    顧客の優先言語を使用すると、プラットフォームが提供する国際化およびローカライズ機能を使用して、関連する発信者とのメッセージやその他の通信をカスタマイズできます。通常、メッセージトランスフォーマーは CTIOperationRequest オブジェクトに言語を設定します。

    表 : 32. パラメーター
    名前 タイプ 説明
    languageCode 文字列 関連操作を処理するときに使用する ISO 639.1 言語コードです。
    表 : 33. 返される内容
    タイプ 説明
    なし
    {	
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
    	var event = jsonPayload.event;
    	if (event) {
    	  var details = event.Details;
    	  if (details) {					
    	    operationRequest.setOperationName(details.Parameters['sn_operation']);
    	    var contactData = details.ContactData;
    	    if(contactData) {
    		// Call id should be surfaced in openframe call log so it can be tied to transcription later
    		operationRequest.setParameter('contact.call_id', contactData.ContactId);
    		for(var ck in contactData.CustomerEndpoint) {
    		  operationRequest.setParameter('contact.' + ck, contactData.CustomerEndpoint[ck]);
    	       }
    	       operationRequest.setParameter('contact.id', contactData.ContactId);
    	       operationRequest.setParameter('contact.phone', contactData.CustomerEndpoint.Address);
    	    }
    	    var parameters = details.Parameters;
    	    if (parameters) {
    		for (var pk in parameters) {
    		  switch(pk) {
    		    case 'interactionId':
    			operationRequest.setInteractionSysId(parameters[pk]);
    			break;
    		    case 'authToken':
    			operationRequest.setAuthToken(parameters[pk]);
    			break;
    		    case 'language':
    			operationRequest.setLanguage(parameters[pk]);
    			break;
    		    case 'statusCode':
    		    case 'message':
    			break;
    								
    		    default:
    			operationRequest.setParameter(pk, parameters[pk]);
    		 }						
                }
              }					
            }
          }
        }
      } catch(e) {
    		ctx.setError(e);
      }
    })(httpRequest, operationRequest, ctx);

    CTIOperationRequest - setMajorVersion(数値 majorVersion)

    関連する CTIOperationRequest オブジェクトに、要求を行うコンピューター電話統合 (CTI) ソフトウェアのメジャーバージョンを設定します。

    ServiceNow インスタンスに接続されている CTI プロバイダーが複数のバージョンのソフトウェアを実行している場合は、ソフトウェアのバージョンごとに異なる処理動作が必要になる可能性があるため、このメソッドを使用します。ソフトウェアのバージョン間で処理の動作がわずかに異なるだけの場合は、操作ハンドラーを 1 つだけにすることができます。その後、要求を行っているソフトウェアのバージョンを確認するだけで、処理の違いに対応し、操作ハンドラー内で要求/データを処理できます。必要な処理がバージョン間で大幅に異なる場合は、複数の操作ハンドラーを使用する方が効率的です。

    通常、メッセージトランスフォーマーは、このメソッドを呼び出して CTIOperationRequest オブジェクトにソフトウェアバージョンを設定し、操作ハンドラーは、CTIOperationRequest - getMajorVersion() メソッドを使用して設定値を使用します。また、CTIOperationRequest - getMinorVersion() および CTIOperationRequest - setMinorVersion(数値 minorVersion) メソッドを使用して、プロバイダーのソフトウェアのマイナーバージョン値も取得/設定できます。

    表 : 34. パラメーター
    名前 タイプ 説明
    majorVersion 番号 操作要求を行う CTI プロバイダーソフトウェアのメジャーバージョンです。

    この値がまだ設定されていない場合は、1 を返します。

    表 : 35. 返される内容
    タイプ 説明
    なし
    var request = new sn_cti_core.CTIOperationRequest('origin');
    request.setMajorVersion(2);

    CTIOperationRequest - setMinorVersion(数値 minorVersion)

    要求を行うコンピューター電話統合 (CTI) ソフトウェアのマイナーバージョンを、関連する CTIOperationRequest オブジェクトに設定します。

    ServiceNow インスタンスに接続されている CTI プロバイダーが複数のバージョンのソフトウェアを実行している場合は、ソフトウェアのバージョンごとに異なる処理動作が必要になる可能性があるため、このメソッドを使用します。ソフトウェアのバージョン間で処理の動作がわずかに異なるだけの場合は、操作ハンドラーを 1 つだけにすることができます。その後、要求を行っているソフトウェアのバージョンを確認するだけで、処理の違いに対応し、操作ハンドラー内で要求/データを処理できます。必要な処理がバージョン間で大幅に異なる場合は、複数の操作ハンドラーを使用する方が効率的です。

    通常、メッセージトランスフォーマーは、このメソッドを呼び出して CTIOperationRequest オブジェクトにソフトウェアバージョンを設定し、操作ハンドラーは、CTIOperationRequest - getMinorVersion() メソッドを使用して設定値を使用します。また、CTIOperationRequest - getMajorVersion() および CTIOperationRequest - setMajorVersion(数値 majorVersion) メソッドを使用して、プロバイダーのソフトウェアのメジャーバージョン値も取得/設定できます。

    表 : 36. パラメーター
    名前 タイプ 説明
    minorVersion 番号 操作要求を行う CTI プロバイダーソフトウェアのマイナーバージョンです。

    この値がまだ設定されていない場合は、0を返します。

    表 : 37. 返される内容
    タイプ 説明
    なし
    var request = new sn_cti_core.CTIOperationRequest('origin');
    ...
    request.setMinorVersion(3);

    CTIOperationRequest - setOperationName(文字列 name)

    現在の CTIOperationRequest オブジェクトに、コンピューター電話統合 (CTI) プロバイダーが実行を試みている操作の名前を設定します。

    操作名によって、要求の処理に使用される操作ハンドラーが決まります。関連するメッセージトランスフォーマーからこのメソッドを呼び出します。

    注:
    Amazon Connect Lex ボットの実装では、異なる Amazon インテントに同じ名前を使用することはできないため、インテント名に 5 文字のサフィックスが追加されます。ServiceNow 音声アシスト機能 フレームワークでは、インテント名は操作ハンドラー名と同じです。操作ハンドラーは、このサフィックス (myOperation_SUFFX) を含む操作ハンドラー名を持たせてインテントに固有にすることもできれば、汎用にして複数の CTI プロバイダーや異なるユースケース (HR 要求とヘルプデスク要求の処理に同じハンドラー (myOperation) を使用するなど) で使用することもできます。
    表 : 38. パラメーター
    名前 タイプ 説明
    name 文字列 CTI プロバイダーが現在実行を試みている操作の名前です。

    この名前は、要求を処理するために使用する操作ハンドラーの名前と同じでなければなりません。同じでない場合は、エラーがスローされます。操作ハンドラー [sn_cti_operation_handler] テーブルで、利用可能な操作ハンドラーを見つけることができます。

    表 : 39. 返される内容
    タイプ 説明
    なし
    {	
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
    	var event = jsonPayload.event;
    	if (event) {
    	  var details = event.Details;
    	  if (details) {	
               // Set the operation handler to use to process the request				
    	    operationRequest.setOperationName(details.Parameters['sn_operation']);
    	    var contactData = details.ContactData;
    	    if(contactData) {
    		// Call id should be surfaced in openframe call log so it can be tied to transcription later
    		operationRequest.setParameter('contact.call_id', contactData.ContactId);
    		for(var ck in contactData.CustomerEndpoint) {
    		  operationRequest.setParameter('contact.' + ck, contactData.CustomerEndpoint[ck]);
    	       }
    	       operationRequest.setParameter('contact.id', contactData.ContactId);
    	       operationRequest.setParameter('contact.phone', contactData.CustomerEndpoint.Address);
    	    }
    	    var parameters = details.Parameters;
    	    if (parameters) {
    		for (var pk in parameters) {
    		  switch(pk) {
    		    case 'interactionId':
    			operationRequest.setInteractionSysId(parameters[pk]);
    			break;
    		    case 'authToken':
    			operationRequest.setAuthToken(parameters[pk]);
    			break;
    		    case 'language':
    			operationRequest.setLanguage(parameters[pk]);
    			break;
    		    case 'statusCode':
    		    case 'message':
    			break;
    								
    		    default:
    			operationRequest.setParameter(pk, parameters[pk]);
    		 }						
                }
              }					
            }
          }
        }
      } catch(e) {
    		ctx.setError(e);
      }
    })(httpRequest, operationRequest, ctx);

    CTIOperationRequest - setOperationSubStepName(文字列 name)

    現在の CTIOperationRequest オブジェクトに操作サブステップ名を設定します。

    サブステップを使用して、操作を処理する前に初期化や検証などのアクションを実行します。すべての CTI プロバイダーが使用する汎用的な操作ハンドラーとは異なり、サブステップは CTI プロバイダー固有であり、CTI プロバイダーに固有の用語と命名規則を使用します。

    ServiceNow 音声アシスト機能 フレームワークは、次の手順を実行して、必要な操作ハンドラーと関連するサブステップ操作ハンドラーを見つけます。
    注:
    Amazon Connect Lex ボットの実装では、異なる Amazon インテントに同じ名前を使用することはできないため、インテント名に 5 文字のサフィックスが追加されます。ServiceNow 音声アシスト機能 フレームワークでは、インテント名は操作ハンドラー名と同じです。操作ハンドラーは、このサフィックス (myOperation_SUFFX) を含む操作ハンドラー名を持たせてインテントに固有にすることもできれば、汎用にして複数の CTI プロバイダーや異なるユースケース (HR 要求とヘルプデスク要求の処理に同じハンドラー (myOperation) を使用するなど) で使用することもできます。
    1. 要求に関連付けられた操作ハンドラーを探します。
      • 最初に、myOperation_SUFFX という名前の操作ハンドラーをチェックします。
      • 見つからない場合は、操作ハンドラー myOperation をチェックします。見つからない場合はエラーになります。
    2. ハンドラーが見つかった場合、操作ハンドラーの auth_required フラグがチェックされます。設定すると、有効な認証トークン (getAuthToken() メソッドで取得されます) が要求に存在することが確認されます。存在していて有効な場合は処理を続行し、それ以外の場合はエラーをスローします。
    3. サブステップで渡された操作ハンドラーを探します。この例では、subStepName=SubStep と仮定します。
      • 最初に、myOperation_SUFFX.SubStep という名前の操作ハンドラーをチェックします。見つかった場合は、ハンドラーを実行します。
      • 見つからない場合は、操作ハンドラー myOperation.SubStep をチェックします。見つかった場合は、ハンドラーを実行します。
      • 見つからない場合は、要求オブジェクトに subStepNotFoundBehavior が設定されているかどうかを確認します。
      • 設定されている場合、動作を実行します。設定されていない場合はエラーになります。
    4. プライマリ操作ハンドラー (myOpersation_SUFFX または myOperation) を実行します。

    サブステップのデフォルトの動作を設定するには、CTIOperationRequest - setSubStepNotFoundBehaviour(オブジェクト behaviour) メソッドを呼び出します。

    表 : 40. パラメーター
    名前 タイプ 説明
    name 文字列 CTI プロバイダーが実行を試みているサブステップの名前です。
    表 : 41. 返される内容
    タイプ 説明
    なし
    (function( /*HTTPRequest*/ httpRequest, /*CTIOperationRequest*/ operationRequest, /*Context*/ ctx) {
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
          var event = jsonPayload.event;
          if (event) {
            var intent = event.currentIntent;
    	 var inputTranscript = event.inputTranscript;
    	 if(inputTranscript) {
    	   operationRequest.setParameter('$utterance', inputTranscript);
    	 }
            if (intent) {
              operationRequest.setOperationName(intent.name);
    	   // Add this because intent name gets changed through the pipeline
    	   operationRequest.setParameter('$original_intent', intent.name);
              var sessionAttributes = event.sessionAttributes;
              if (sessionAttributes) {
                for (var sk in sessionAttributes) {
                  switch (sk) {
                    case 'interactionId':
                      operationRequest.setInteractionSysId(sessionAttributes[sk]);
                      break;
                    case 'authToken':
                      operationRequest.setAuthToken(sessionAttributes[sk]);
                      break;
    		  case 'language':
    		    operationRequest.setLanguage(sessionAttributes[sk]);
    		    break;
                    case 'statusCode':
                    case 'message':
                      break;
                    default:
                      operationRequest.setSessionAttribute(sk, sessionAttributes[sk]);
                  }
                }
              }
              var slots = intent.slots;
    	   // Always copy in slots they are the parameters for the operation
              if (slots) {
                for (var pk in slots) {
                  operationRequest.setParameter(pk, slots[pk]);
                }
              }
              var invocationSource = event.invocationSource;
    	   operationRequest.setParameter('$$invocationSource', invocationSource);
              // Specific handling for dialog hooks with a way to override for Amazon specific provider
              if (invocationSource === 'DialogCodeHook') {
    	     // Set substep to trigger forwarding to another handler IF it s present
    	     operationRequest.setOperationSubStepName(invocationSource);
    	     // Allow pass through behavior
    	     var behaviourToUse = sn_cti_core.CTIOperationRequest.OperationNotFoundBehaviours.PassThrough;
    	     operationRequest.setSubStepNotFoundBehaviour(behaviourToUse);
    	     // Reserved - copy slots in so we can just use delegate as default if the call isn't handled
    	     operationRequest.setParameter('$$slots', slots);
              }
            }
          }
        }
      } catch (e) {
          ctx.setError(e);
      }
      return operationRequest;
    })(httpRequest, operationRequest, ctx);

    CTIOperationRequest - setParameter(文字列 key, オブジェクト value)

    指定されたキー/値ペアを現在の CTIOperationRequest オブジェクトのパラメーターオブジェクトに設定します。

    get/setParameter メソッドを使用すると、メッセージトランスフォーマーと操作ハンドラーの間で実質的に任意の文字列または数値を渡すことができます。パラメーターオブジェクトには、現在の操作要求に直接関連するデータのキー/値ペアを 0 個以上含めることができます。操作ハンドラーは、これらの値を使用するときに必要なキー/値ペアを判断します。通常、メッセージトランスフォーマーは、このメソッドを呼び出して CTIOperationRequest オブジェクトにこれらのパラメーターを設定し、操作ハンドラーは、CTIOperationRequest - getParameter(文字列 key) または CTIOperationRequest - getParameters() メソッドを使用して設定値を使用します。

    注:
    JSON.parse(JSON.stringify(object)) 操作後も存続できるオブジェクトのみを格納する必要があります。この基準を満たさないオブジェクトは、操作処理チェーン全体を通じて正しく伝播されない可能性があります。
    例:
    var x = {
      "string": 'abc',
      "int": 123,
      "float": 1.234,
      "number": new Number(3),
      "boolean": true,
      "date": new Date(2006, 0, 2, 15, 4, 5),
      "object": {
        "string": 'abc',
        "int": 123,
        "float": 1.234,
        "number": new Number(3),
        "boolean": true,
        "date": new Date(2006, 0, 2, 15, 4, 5)
      },
      "function": function(abc) {
    
      }
    }
    var stringify = JSON.stringify(x);
    gs.info(stringify);
    var hydrate = JSON.parse(stringify);
    var stringify2 = JSON.stringify(hydrate);
    gs.info(stringify2);
    
    結果:
    {"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z","object":{"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z"}}
    {"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z","object":{"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z"}}
    
    表 : 42. パラメーター
    名前 タイプ 説明
    key 文字列 関連付けられた値を格納するキーの名前です。
    value オブジェクト 格納する値です。
    有効なデータタイプ:
    • 文字列
    • int
    • 浮動小数点数
    • 番号
    • ブーリアン
    • 日付
    • オブジェクト
    表 : 43. 返される内容
    タイプ 説明
    なし
    {	
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
    	var event = jsonPayload.event;
    	if (event) {
    	  var details = event.Details;
    	  if (details) {					
    	    operationRequest.setOperationName(details.Parameters['sn_operation']);
    	    var contactData = details.ContactData;
    	    if(contactData) {
    		// Call id should be surfaced in openframe call log so it can be tied to transcription later
    		operationRequest.setParameter('contact.call_id', contactData.ContactId);
    		for(var ck in contactData.CustomerEndpoint) {
    		  operationRequest.setParameter('contact.' + ck, contactData.CustomerEndpoint[ck]);
    	       }
    	       operationRequest.setParameter('contact.id', contactData.ContactId);
    	       operationRequest.setParameter('contact.phone', contactData.CustomerEndpoint.Address);
    	    }
    	    var parameters = details.Parameters;
    	    if (parameters) {
    		for (var pk in parameters) {
    		  switch(pk) {
    		    case 'interactionId':
    			operationRequest.setInteractionSysId(parameters[pk]);
    			break;
    		    case 'authToken':
    			operationRequest.setAuthToken(parameters[pk]);
    			break;
    		    case 'language':
    			operationRequest.setLanguage(parameters[pk]);
    			break;
    		    case 'statusCode':
    		    case 'message':
    			break;
    								
    		    default:
    			operationRequest.setParameter(pk, parameters[pk]);
    		 }						
                }
              }					
            }
          }
        }
      } catch(e) {
    		ctx.setError(e);
      }
    })(httpRequest, operationRequest, ctx);

    CTIOperationRequest - setSessionAttribute(文字列 key, オブジェクト value)

    現在の CTIOperationRequest オブジェクトに、指定されたセッション属性のキー/値ペアを設定します。

    get/setSessionAttribute メソッドを使用すると、メッセージトランスフォーマーと操作ハンドラーの間で実質的に任意の文字列または数値を渡すことができます。sessionAttribute オブジェクトには、コンピューター電話統合プロバイダーが定義したセッションの期間中に有効なデータのキー/値ペアを 0 個以上含めることができます。セッション属性は、問い合わせフロー内でもアクセスできます。操作ハンドラーは、これらの値を使用するときに必要なセッション属性のキー/値ペアを判断します。通常、メッセージトランスフォーマーは、このメソッドを呼び出して CTIOperationRequest オブジェクトにこれらの属性を設定し、操作ハンドラーは、CTIOperationRequest - getSessionAttribute(文字列 key) または CTIOperationRequest - getSessionAttribute() メソッドを使用して属性を取得します。

    注:
    JSON.parse(JSON.stringify(object)) 操作後も存続できるオブジェクトのみを格納する必要があります。この基準を満たさないオブジェクトは、操作処理チェーン全体を通じて正しく伝播されない可能性があります。
    例:
    var x = {
      "string": 'abc',
      "int": 123,
      "float": 1.234,
      "number": new Number(3),
      "boolean": true,
      "date": new Date(2006, 0, 2, 15, 4, 5),
      "object": {
        "string": 'abc',
        "int": 123,
        "float": 1.234,
        "number": new Number(3),
        "boolean": true,
        "date": new Date(2006, 0, 2, 15, 4, 5)
      },
      "function": function(abc) {
    
      }
    }
    var stringify = JSON.stringify(x);
    gs.info(stringify);
    var hydrate = JSON.parse(stringify);
    var stringify2 = JSON.stringify(hydrate);
    gs.info(stringify2);
    
    結果:
    {"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z","object":{"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z"}}
    {"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z","object":{"string":"abc","int":123,"float":1.234,"number":3,"boolean":true,"date":"2006-01-02T23:04:05.000Z"}}
    
    表 : 44. パラメーター
    名前 タイプ 説明
    key 文字列 関連付けられた値を格納するキーの名前です。
    value オブジェクト 格納する値です。
    有効なデータタイプ:
    • 文字列
    • int
    • 浮動小数点数
    • 番号
    • ブーリアン
    • 日付
    • オブジェクト
    表 : 45. 返される内容
    タイプ 説明
    なし
    var request = new sn_cti_core.CTIOperationRequest('origin');
    request.setSessionAttribute('contact.phone', '+15552222345');
    request.setSessionAttribute('contact.okToCall', true);
    request.setSessionAttribute('contact.address', {
        street: '1234 Main St'
        city: 'API City',
        zip: 91335
    });

    CTIOperationRequest - setSubStepNotFoundBehaviour(オブジェクト behaviour)

    現在のサブステップの操作ハンドラーが見つからない場合に実行する動作を設定します。

    このメソッドは、入力メッセージトランスフォーマーによって呼び出す必要があります。

    表 : 46. パラメーター
    名前 タイプ 説明
    behaviour OperationNotFoundBehaviours 処理動作がサブステップに指定されていない場合に使用する動作です。これは、CTIOperationRequest.OperationNotFoundBehaviours オブジェクトで定義された動作でなければなりません。
    可能な値:
    • ThrowError:エラーをスローします。
    • PassThrough:要求に対してそれ以上の処理を実行せず、返すだけです。
    • RouteToOperation:親操作ハンドラー <operation_name> を使用します。
    表 : 47. 返される内容
    タイプ 説明
    なし
    (function( /*HTTPRequest*/ httpRequest, /*CTIOperationRequest*/ operationRequest, /*Context*/ ctx) {
      try {
        var jsonPayload = httpRequest.body.data;
        if (jsonPayload) {
          var event = jsonPayload.event;
          if (event) {
            var intent = event.currentIntent;
    	 var inputTranscript = event.inputTranscript;
    	 if(inputTranscript) {
    	   operationRequest.setParameter('$utterance', inputTranscript);
    	 }
            if (intent) {
              operationRequest.setOperationName(intent.name);
    	   // Add this because intent name gets changed through the pipeline
    	   operationRequest.setParameter('$original_intent', intent.name);
              var sessionAttributes = event.sessionAttributes;
              if (sessionAttributes) {
                for (var sk in sessionAttributes) {
                  switch (sk) {
                    case 'interactionId':
                      operationRequest.setInteractionSysId(sessionAttributes[sk]);
                      break;
                    case 'authToken':
                      operationRequest.setAuthToken(sessionAttributes[sk]);
                      break;
    		  case 'language':
    		    operationRequest.setLanguage(sessionAttributes[sk]);
    		    break;
                    case 'statusCode':
                    case 'message':
                      break;
                    default:
                      operationRequest.setSessionAttribute(sk, sessionAttributes[sk]);
                  }
                }
              }
              var slots = intent.slots;
    	   // Always copy in slots they are the parameters for the operation
              if (slots) {
                for (var pk in slots) {
                  operationRequest.setParameter(pk, slots[pk]);
                }
              }
              var invocationSource = event.invocationSource;
    	   operationRequest.setParameter('$$invocationSource', invocationSource);
              // Specific handling for dialog hooks with a way to overide for Amazon specific provider
              if (invocationSource === 'DialogCodeHook') {
    	     // Set substep to trigger forwarding to another handler IF it s present
    	     operationRequest.setOperationSubStepName(invocationSource);
    	     // Allow pass through behavior
    	     var behaviourToUse = sn_cti_core.CTIOperationRequest.OperationNotFoundBehaviours.PassThrough;
    	     operationRequest.setSubStepNotFoundBehaviour(behaviourToUse);
    	     // Reserved - copy slots in so we can just use delegate as default if the call isn't handled
    	     operationRequest.setParameter('$$slots', slots);
              }
            }
          }
        }
      } catch (e) {
          ctx.setError(e);
      }
      return operationRequest;
    })(httpRequest, operationRequest, ctx);