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

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

今回作成するフォームは、次のスクリーンショットのようにユーザを選択すると、右側にユーザのメールアドレスを表示します。
![final_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/613b5f1d-7017-67bb-9140-27982caae88e.png)

#フォーム（クライアント側）
ユーザ名を選択するとメールアドレスを表示するフォームを作成します。メールアドレスは参照のみとします。ユーザーの右にメールアドレスを表示させるためにコンテナーを利用します。
![display_email_form_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/ab46a228-8a5f-d380-1d38-2fac121da58e.png)

##変数（フィールド）
ユーザ、メールアドレス、コンテナ用のフィールドを作成します。
###ユーザ
sys_userテーブルの名前を表示する選択ボックスをルックアップ・フィールドを作成します。
![display_email_form_user_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/5b034976-5344-1f7f-1327-6c808b3b9705.png)

![display_email_form_user_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/1e8c768d-8672-5138-2673-01b6372b64ef.png)

###メールアドレス
メールアドレスを表示する1行テキストフィールドを作成すます。
![display_email_form_email_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/79e4681e-cfd7-f25c-63cf-ea0815e0f2fb.png)

![display_email_form_split_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/3cb83112-82de-cf32-a0e2-d8f5e5a8f9e8.png)

##UIポリシー
メールアドレスフィールドは参照のみにするUIポリシーを作成します。
![display_email_form_ui_policy_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/314d4a0a-de4b-5d19-9fa5-f49800b4622c.png)

##クライアントスクリプト
メールアドレスを非表示にするスクリプトとサーバからメールアドレスを取得するスクリプトの２つのクライアントスクリプトを作成します。
![display_email_form_script_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/08d3bb98-6196-ff30-c86e-06f6b316138d.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/ca4dab99-fcf8-9b85-fdcb-b7b49e07e2b3.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/da1c6055-7bad-9f32-c4d8-db27be75a1a2.png)


#スクリプトインクルード（サーバ側）
テーブル参照、更新、削除などの操作はサーバ側で行います。
クライアントから呼び出されるサーバ側スクリプトはスクリプトインクルードに記述します。
1.アプリケーションナビゲータから「スクリプトインクルード」を検索し、「システム定義」下の「スクリプトインクルード」を選択します。
![script_include_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/c562f271-9fcc-2e86-b956-cb4b1d861779.png)
2.クライアントから呼び出される関数を作成するので「クライアントコール可」をチェックします。チェックするとスクリプトの内容が変わります。
![script_include_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/a0e315f6-ffd3-4960-7d76-b027ef72d258.png)
3.スクリプトを入力します。
![script_include_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/283e48b0-441b-5657-e361-6d44a81132b6.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はユニークなので１つのレコードのみを取得するので.get()とifを利用しました。

#テスト
作成したフォームを開き、ユーザを選択すると右にメールアドレスが表示されます。
![final_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/613b5f1d-7017-67bb-9140-27982caae88e.png)
以上