ServiceNow: データベースを検索した結果をフォームで表示する(メールアドレスを取得して表示)


概要

ServiceNowはクライアント側で動作するスクリプトとサーバ側で動作するするスクリプトがあります。
クライアント側で動作するスクリプトはフォームなどのフィール属性や入力チェックに関わるものが多いです。例えば、日付チェックを行うスクリプト(https://qiita.com/htshozawa/items/e039220114a8a9ae2949 )が挙げられます。データテーブルを参照したら、更新する処理はサーバ側で実行します。
本記事はクライアント側からサーバ側を呼び出し、その結果をフォームに表示するスクリプトを作成します。ユーザメールアドレスを取得するスクリプトの例といして作成します。

今回作成するフォームは、次のスクリーンショットのようにユーザを選択すると、右側にユーザのメールアドレスを表示します。

フォーム(クライアント側)

ユーザ名を選択するとメールアドレスを表示するフォームを作成します。メールアドレスは参照のみとします。ユーザーの右にメールアドレスを表示させるためにコンテナーを利用します。

変数(フィールド)

ユーザ、メールアドレス、コンテナ用のフィールドを作成します。

ユーザ

sys_userテーブルの名前を表示する選択ボックスをルックアップ・フィールドを作成します。

メールアドレス

メールアドレスを表示する1行テキストフィールドを作成すます。

UIポリシー

メールアドレスフィールドは参照のみにするUIポリシーを作成します。

クライアントスクリプト

メールアドレスを非表示にするスクリプトとサーバからメールアドレスを取得するスクリプトの2つのクライアントスクリプトを作成します。

メールフィールを非表示にする

メールアドレスを非表示するするスクリプトはフォームをロード(最初に表示される時)する時に起動させます。

function onLoad() {
    g_form.getControl('email').style.border = '5px solid white';  //メールフィールドの枠を白色にする
    g_form.getControl('email').style.backgroundColor = 'white';   //メールフィールドの背景色を白にする
    g_form.setVisible('email', false);                            //メールフィールドを非表示にする
}

サーバからメールアドレスを取得する:

ユーザのsys_idをサーバ側スクリプトに送り、メールアドレスを取得するするスクリプトを作成します。

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    var ajax = new GlideAjax('getUserEmail');   //Ajaxを利用してサーバを呼び出す。引数にサーバスクリプトファイル名を渡す
    ajax.addParam('sysparm_name', 'getEmail');  //呼び出すメソッド名を指定
    ajax.addParam('sysparm_uid', newValue);     //引き渡す値を指定。今回はユーザsys_idを引き渡す
    ajax.getXMLAnswer(function(answer) {        //Ajax呼び出し
        if (answer.length > 0) {                //メールアドレスを取得できたかチェック
            g_form.setVisible('email', true);   //取得できた場合はメールフィールドを表示して
            g_form.setValue('email', answer);   //   結果をメールフィールドに設定する
        } else {
            g_form.setVisible('email', false);  //メールアドレスを取得できない場合はメールフィールドを非表示にする
        }
    });
}

スクリプトインクルード(サーバ側)

テーブル参照、更新、削除などの操作はサーバ側で行います。
クライアントから呼び出されるサーバ側スクリプトはスクリプトインクルードに記述します。
1.アプリケーションナビゲータから「スクリプトインクルード」を検索し、「システム定義」下の「スクリプトインクルード」を選択します。

2.クライアントから呼び出される関数を作成するので「クライアントコール可」をチェックします。チェックするとスクリプトの内容が変わります。

3.スクリプトを入力します。

var getUserEmail = Class.create();
getUserEmail.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getEmail: function () {
        var user_id = this.getParameter('sysparm_uid');  //クライアントからの引数を取得。今回はユーザのsys_idを取得
        var user_lookup = new GlideRecord('sys_user');   //SystemNowのユーザテーブル(sys_id)を参照する
        if(user_lookup.get(user_id)){                    //指定したユーザが存在するか確認
            return user_lookup.email;                //存在する場合はメールアドレスを返す
        }
        return '';                                       //存在しない場合は空文字を返す 

    },
    type: 'getUserEmail'
});

複数のレコードを取得する場合は.query()とwhile(user_lookup.next())を利用しますが、sys_idはユニークなので1つのレコードのみを取得するので.get()とifを利用しました。

テスト

作成したフォームを開き、ユーザを選択すると右にメールアドレスが表示されます。

以上