LoginSignup
0
1

More than 3 years have passed since last update.

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

Posted at

概要

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

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

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

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

変数(フィールド)

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

ユーザ

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

display_email_form_user_2.png

メールアドレス

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

display_email_form_split_1.png

UIポリシー

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

クライアントスクリプト

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

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

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

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

display_email_form_script_2.png

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

ユーザの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);  //メールアドレスを取得できない場合はメールフィールドを非表示にする
        }
    });
}

display_email_form_script_3.png

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

テーブル参照、更新、削除などの操作はサーバ側で行います。
クライアントから呼び出されるサーバ側スクリプトはスクリプトインクルードに記述します。
1.アプリケーションナビゲータから「スクリプトインクルード」を検索し、「システム定義」下の「スクリプトインクルード」を選択します。
script_include_1.png
2.クライアントから呼び出される関数を作成するので「クライアントコール可」をチェックします。チェックするとスクリプトの内容が変わります。
script_include_2.png
3.スクリプトを入力します。
script_include_3.png

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を利用しました。

テスト

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1