ServiceNowでGlidRecordを使用する

Version: Istanbul

※追記中

GlideRecordで試したtipsを追記予定ですあまりに記事が膨らんだら記事を分けます確認以外の操作は英語でadminで行っていますこちらの記事は分けた記事ですこちらでもGlideRecordを利用しています

[ServiceNowで色々なデータを取得する]
https://qiita.com/20_percent_cooler/items/f5b46185999b6ef4f059

# スクリプトで1000行追加
## テスト用テーブル作成

Filter navigatorにtablesと入力しSystem Defenition - Tablesを表示してinsert用のtableを作成するためにNewボタンを押下します

![FireShot Screen Capture #404 - 'Tables I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsys_db_object_list_do%3Fsysparm_userpref_module%3D7e7.png](https://qiita-image-store.s3.amazonaws.com/0/193272/3dbd8240-36d9-000e-9124-767eb3e8f88e.png)

Labelにglide_record_testと入力しInsert a new row...でID Integer, Value String, Flg True/False, Atribute StringのColumnを追加してSubmitします

![FireShot Screen Capture #407 - 'Table I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsys_db_object_do%3Fsys_id%3D-1%26sys_is_list%3Dtrue%26.png](https://qiita-image-store.s3.amazonaws.com/0/193272/72f3879e-170a-e095-95da-a5a842704507.png)

## スクリプト作成

ServiceNowでスクリプトを作成するにはBusiness Rule(Database Triggerのようなもの)やClient Scripts(クライアントサイドで動作するJava Script)やUI Action(ボタン押下時のJavaScriptでServer/Client Sideどちらかで動作)など色々とあるようですが今回はScheduled Jobs(Unix/Linuxでいうcronに登録したbatchプログラム)を使用します

Filter navigatorにscheduledと入力してSystem Defenition - Scheduled Jobsを表示してNewボタンを押下します

![FireShot Screen Capture #409 - 'Scheduled Jobs I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsysauto_list_do%3Fsysparm_userpref_module%3D5.png](https://qiita-image-store.s3.amazonaws.com/0/193272/16a36e7b-8f20-e89e-4194-b5430ff756f6.png)

次の画面ではAutomatically run a script of your choosingをクリックします

![FireShot Screen Capture #410 - 'ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fwizard_view_do%3Fsys_id%3D-1%26sys_target%3Dsysauto%26sysparm.png](https://qiita-image-store.s3.amazonaws.com/0/193272/19eda6b3-b4e3-d76e-a16f-2ac3854506aa.png)

Nameにglide_record_testと入力してRunでOn Demand(呼んだときだけ実行)を選択してRun this scriptに以下の内容を入力しtてSubmitしますGlideRecordをnewしている箇所は作成したテーブル(table)のNameを設定してください

```
var loop_max = 1000;
var i = 0;

for (i; i < loop_max; i+=1) {
	insert_method();
}

function insert_method(){
	var gr = new GlideRecord('x_101872_lets_get_glide_record_test');
	gr.initialize();
	gr.id = i;
	gr.value =　'insert';
	gr.insert();
}
```

![FireShot Screen Capture #425 - 'Scheduled Script Execution I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsysauto_script_do%3FWIZARD_action.png](https://qiita-image-store.s3.amazonaws.com/0/193272/584d7b74-fe5f-ec2b-63f4-1f5ad2d6f240.png)

## スクリプト実行

Submitして保存した後再表示してExecute Nowを押下します

![FireShot Screen Capture #426 - 'glide_record_test I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsysauto_script_do%3Fsys_id%3Df06ecf320fbc4.png](https://qiita-image-store.s3.amazonaws.com/0/193272/bc909da8-b24a-d946-9f94-52acc4320613.png)

作成したtableに1000行(record)挿入(insert)されています今回FlgとAttributeのColumnを使っていないですがこの後で条件付きUpdate用に使おうかと考えています

![FireShot Screen Capture #427 - 'glide_record_tests I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_glide_record_test_list.png](https://qiita-image-store.s3.amazonaws.com/0/193272/a99a4f79-c76f-9cfa-e59e-26c804838a7e.png)

# 行削除
## 行を全て削除

全ての行消すには差し当たり条件無しでdeleteMultipleを使ってExecute Nowしてください条件を指定する場合はaddQueryを使用します日付の指定はServiceNowは内部的にGMTになっているので気をつけます

```
var gr = new GlideRecord('x_101872_lets_get_glide_record_test');
gr.deleteMultiple();
```

# スクリプトでユーザ追加
## スクリプト作成

Scheduled Jobsに以下の内容でスクリプトを追加しますパスワードはsetDisplayValue()で値を設定しますsys_userのPasswordのTypeはPassword (1 Way Encrypted)ですsetDisplayValue()を使用することでEncryptされる前の値(認証に使用するときの値)を設定出来るようです

```
var loop_max = 10;
var i = 0;

for (i; i < loop_max; i+=1) {
	insert_method();
}

function insert_method(){
	var gr = new GlideRecord('sys_user');
	gr.initialize();
	gr.user_name = String(i);
	gr.user_password.setDisplayValue(String(i));
	gr.name =　'insert_test';
	gr.insert();
	//gr.deleteMultiple();
}
```

以下の例ではNameにuser_insert_testでRunをOn Demand(呼ばれたら実行)にしています

![FireShot Screen Capture #451 - 'user_insert_test I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsysauto_script_do%3Fsys_id%3D4bd870800f0103.png](https://qiita-image-store.s3.amazonaws.com/0/193272/36829081-a4c6-d5d8-d778-67bce21bab8a.png)

## スクリプト実行

Execute Nowを実行して追加されたユーザ(Users)を確認します元々1～6までユーザが居たので0, 7～9まで追加されたようです

![FireShot Screen Capture #453 - 'Users I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsys_user_list_do%3Fsysparm_userpref_module%3D56e8b9ce3.png](https://qiita-image-store.s3.amazonaws.com/0/193272/dfbba6aa-e1a4-7a02-597b-6cc5c0df4a44.png)

## エラーログ確認

Logsを確認するとDuplicate EntryのSQLエラーが発生していました

![FireShot Screen Capture #454 - 'Log I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsyslog_list_do%3Fsysparm_userpref_module%3Dab0b7690c0a80.png](https://qiita-image-store.s3.amazonaws.com/0/193272/f629a78a-42aa-be36-d211-e61e5750d813.png)

先ほどのスクリプトの2行目を

```
var i = 0;
```

では無く

```
var i = 7;
```

にしていればエラーにならなかったのですが今回はsys_userをGlideRecordで直接操作してユーザを追加出来るかの確認だったので気にしないことにします後失敗したときにSQLエラーが出ることを確認出来たので良かったです

## 確認

追加したユーザでログイン出来るか確認しますユーザ名とパスワードにスクリプトで設定した8を入力してログインします

![FireShot Screen Capture #455 - 'ServiceNow' - dev12747_service-now_com_navpage_do_sysparm_nostack=true.png](https://qiita-image-store.s3.amazonaws.com/0/193272/be0b3d18-e8fd-be2a-fe69-44d21b583f3b.png)

ログインに成功しました

![FireShot Screen Capture #456 - 'セルフサービス I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fhome_do%3F.png](https://qiita-image-store.s3.amazonaws.com/0/193272/82b70c47-1773-0810-444e-063d3ed71210.png)

# 入力画面でユーザ追加
## 入力画面用のテーブルを作成

入力画面用にテーブルを作成します以下の例では[Label]を"User Regist Form"で列に"User Name"(String), "Name"(String), "User Passwod"(Password (1 Way Encrypted))を追加してテーブルを作成しています

![FireShot Screen Capture #479 - 'User Regist Form I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsys_db_object_do%3Fsys_id%3Dx_101872_lets_g.png](https://qiita-image-store.s3.amazonaws.com/0/193272/2803ba61-1dbd-5c0a-277f-3d34066bd3fe.png)

## ユーザ追加用のボタンの作成

Filter navigatorにRegist と入力してメニューを絞り込んで作成したテーブルのレコード一覧を表示します

![FireShot Screen Capture #480 - 'User Regist Forms I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_user_regist_form_list_do.png](https://qiita-image-store.s3.amazonaws.com/0/193272/e8d03b54-d94b-a991-9fb6-e1670302b084.png)

一覧の列のヘッダを右クリックしてConfigure - UI Actionsを選択します

![FireShot Screen Capture #481 - 'User Regist Forms I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_user_regist_form_list_do.png](https://qiita-image-store.s3.amazonaws.com/0/193272/2db1f2c2-d770-2be3-d22d-f183e2900f02.png)

UI Actionsの一覧でNewボタンを押下して登録用のボタンを追加します以下の例では[Name]に"Regist", [Form button]にチェック(True)して

![FireShot Screen Capture #482 - 'Regist I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsys_ui_action_do%3Fsys_id%3Dfd7bcd0c0f010300d5168ecce.png](https://qiita-image-store.s3.amazonaws.com/0/193272/0ac9e985-dc9d-bd32-abf3-25c001fa2ce4.png)

[Script]に以下の内容を登録してますuser_passwordはPassword (1 Way Encrypted)の値をそのまま設定しています

```
var gr = new GlideRecord('sys_user');
gr.initialize();
gr.user_name = current.user_name;
gr.user_password = current.user_password;
gr.name =　current.name;
gr.insert();
```
## ユーザ追加

作成したテーブルの一覧画面でNewボタンを押下して登録画面を表示します入力項目に値を入力後Registボタンを押下します以下の例ではNameにヒラヤマ山系, User nameとUser passwordに10を入力しています

![FireShot Screen Capture #483 - 'User Regist Form I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_user_regist_form_do%3Fsys.png](https://qiita-image-store.s3.amazonaws.com/0/193272/94cd9a70-cd60-ac85-89be-c1866236c7b9.png)

ユーザ追加に成功するとシステムのメッセージが表示されました

![FireShot Screen Capture #484 - 'User Regist Forms I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_user_regist_form_list_do.png](https://qiita-image-store.s3.amazonaws.com/0/193272/b614b98b-5fcc-aa87-1072-31f40be24a77.png)

## 確認

ユーザ(Users)の一覧を表示してユーザの追加に成功していることを確認します

![FireShot Screen Capture #485 - 'Users I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsys_user_list_do%3Fsysparm_userpref_module%3D56e8b9ce3.png](https://qiita-image-store.s3.amazonaws.com/0/193272/4a23af6b-d8ba-1b07-439b-a94be4809156.png)

追加したユーザでログイン出来ることを確認します

![FireShot Screen Capture #486 - 'ServiceNow' - dev12747_service-now_com_navpage_do_sysparm_nostack=true.png](https://qiita-image-store.s3.amazonaws.com/0/193272/89b47430-e81c-ea7d-2a52-05df18d87265.png)

ログインに成功しました

![FireShot Screen Capture #487 - 'セルフサービス I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fhome_do%3F.png](https://qiita-image-store.s3.amazonaws.com/0/193272/30ab4c7f-e2a7-eafd-ff3f-84393998be97.png)

## sys_userにレコード追加した際のsys_idを取得

sys_userにレコードを追加した際のsys_idが取得出来ないか1つ前のスクリプトに1行追加して試しました

```
var gr = new GlideRecord('sys_user');
gr.initialize();
gr.user_name = current.user_name;
gr.user_password = current.user_password;
gr.name =　current.name;
gr.roles = "admin";
gr.insert();
gs.addInfoMessage(gr.sys_id);
```

画面に表示されました

![FireShot Screen Capture #488 - 'User Regist Forms I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fx_101872_lets_get_user_regist_form_list_do.png](https://qiita-image-store.s3.amazonaws.com/0/193272/1a5f2d3a-b39a-6e56-d72f-a822cb2c5e1f.png)

Usersで追加したユーザのレコードを右クリックしてCopy sys_idを選択してからテキストエディタにPasteして値を確認したところ同じ値でした

![FireShot Screen Capture #489 - 'Users I ServiceNow' - dev12747_service-now_com_nav_to_do_uri=%2Fsys_user_list_do%3Fsysparm_userpref_module%3D56e8b9ce3.png](https://qiita-image-store.s3.amazonaws.com/0/193272/e84ad331-fbd0-90f3-93a0-aeea17267c6d.png)

```
929cbec90f410300d5168ecce1050e3c
```