０からのServiceNow備忘録メモ

#ServiceNowの基本的な事をかいつまんで説明
ほぼ個人用の備忘録なので、過度な期待はしないで下さい

これからの作業を簡単に要約すると
<第一段階>
1.アプリケーションを作成（機能単位）
2.テーブルを作成する（基本テーブルへの操作が起点となります）
3.レコードの操作画面を作る（テーブルに追加するレコード情報の表示画面）
とりあえずExcelファイルをDB化した位の作成です
<第二段階>
4.クライアントスクリプトの作成（画面操作処理、Client Script）
5.サーバースクリプトの作成（ビジネスロジック、Script Include、UI Action）


#ServiceNowへのユーザー登録
まずは前準備

[https://developer.servicenow.com](https://developer.servicenow.com)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/8fb0971b-691e-e25e-c9f5-6a6e95552c6d.png" width="50%"/>

右上の「REGISTER」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/f80d4ce4-c633-beb2-e5e5-efaa2edbebe4.png)
各種設定をしてユーザー登録を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/273518c5-0464-4690-ed57-abe586d1a412.png)
Developerサイトにログイン後の画面
「Request Instance」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/ec6d57c8-425f-e5ac-66d0-bc3efd7d8e64.png)
バージョン（2019/12時点ではNew York）を選択して「Request Instance」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/ee6eed9e-ed7e-8aed-57f0-caf4ba0678ea.png)

～しばしお待ちください～	

ユーザー名とパスワードをメモして「Manage Instance」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/e555b73a-532a-d716-76aa-b14e48b9c6e2.png)
URLをクリックする
※なおRemaining inactivity 10daysが0daysになるとインスタンスが削除されます
　「Extemd Instance」をクリックすると10daysに戻る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/d851cb15-5bde-5e02-057d-1d95bd3ce891.png)
ユーザー名とパスワードを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/57c09a76-d23f-b83c-f08d-3afa7ec22124.png)
パスワードの再設定をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/984d8ac8-dcc1-6cc9-9b52-1f3482af8f00.png)
ログイン直後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/860d33d0-0a9d-2219-fbd5-bf393a9fab75.png)

#アプリケーションを作成
Servicenowでは開発を行う単位を「アプリケーション」と呼びます
ログイン画面の左側のリストがアプリケーションの一覧（そうでないのもあるが大体）です
デフォルトで
・incident：インシデント管理
・Ploblem：問題管理
・Change：変更管理
等があります。（ITILに準拠した作りになっている）


ログイン着後の画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/16339a69-1db7-3af7-8dbb-4ab4545f65cc.png" width="50%"/>

画面左上にある「Filter navigator」部分に「studio」と入力してリスト部分に表示された「studio」をクリックすると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/402f23d6-c55a-deb4-b0bc-e74c1f3baee6.png" width="50%"/>
開発作業画面の「studio」が別タブ表示されます。「Create Application」をクリックします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/ee74b2c2-e2c7-a59d-ff89-8089f8d1cd1e.png" width="50%"/>
Nameを設定します（Descroptionは任意）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/dfcd8355-52a4-87ef-0525-59358f3b89a9.png" width="50%"/>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/b9079b4e-4793-e221-05bb-2f7e8fc60ccd.png" width="50%"/>
Roleは作らず「Continue」をクリックします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/cc17df29-268e-7187-c823-09f4b0f30e9b.png" width="50%"/>
「Classic」を選択して「Continue」をクリックします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/49f7a854-364d-cfcc-18df-456042a36c56.png" width="50%"/>
「Done with tables」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/6b7b67a6-fe93-ac07-a937-a6463acc073c.png)
「Start」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/43da43e2-58ac-fe57-a1e6-cdd50e8342d4.png)
右上の「ｘ」をクリックして「Yes,close」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/25f0a1d9-8a02-1f3f-24a3-d91ade1ba04f.png)
ブラウザを再読み込みすると、登録したアプリケーションが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/3612f5fd-96b1-9e11-57b5-6f4052fb904d.png)
Applicationをクリックすると「studio」が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/300e3441-2643-4187-fde8-894727bba2bd.png)

#テーブルを作成
「Create Application File」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/1263fa1e-54b7-57b1-9646-299ecdb73f83.png)
[Data Model]-[Table]を選択して「Create」をクリックします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/2fa8d3b1-0d72-aa4b-f39a-f3f7c0fd351e.png" width="50%"/>
・Label にテーブル名（英数字）を設定
・Create module のチェックを外します
・「Submit」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/ea28d463-685f-0078-2f2b-2066d9d6a057.png" width="50%"/>
左側のリストに生成されたファイルが表示されます
テーブルを作成すると一緒に「Role」「Access Control」が生成されます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/5baa490b-7bd3-dded-45a9-8f4c63cd89d6.png" width="50%"/>
Table Colums 横の「New」をクリックする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/34dfb98d-e238-1d4e-58ff-0117891d187d.png" width="50%"/>
とりあえずカラム作成
Typeに「String」
Colum nameに「test_name」
Max lengthに「100」
を入れて「Submit」をクリックする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/62402af9-48fc-e0af-de0b-63c506624e6e.png" width="50%"/>
「Table」を選択して「Table Colum」横のメニュー「三」を左クリック「Refrish List」を選択する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/243d79ca-d394-90ac-6531-2c05d6d24f56.png" width="50%"/>
追加したカラムが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/b8cf6e6f-f1e0-5a8d-b9cc-9aa892ed08f9.png" width="50%"/>
よく使用するのはString、Integer、Date、Date/Time、Reference、他にも色々あるよ
[その他カラムの種類](https://developer.servicenow.com/app.do#!/document/content/app_store_doc_citizen_dev_newyork_cd_Data?v=newyork)
とりあえず
Type : Integer 、 Colum Lable ： test_age
Type : Date 、 Colum Lable ： test_birthday
も追加してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/9acd1313-03bf-9414-92fc-66c665c1defa.png)

#編集画面の作成

「Create Application file」を選択して[Form & UI]-[Form]を選択し「Next」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/abd3d16c-28bd-4684-27ad-b63c2fadd49c.png" width="50%"/>

テーブルを検索して設定するFilter部分に「sample_table」を入力
下に表示されたリストから「sample table」を選択して「Create」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/7f79ce79-199a-e9dd-810d-cb1cc7b60c04.png" width="50%"/>

Form Design画面が表示されます（今回はとりあえずこのままで）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/1d4bae47-ac9f-0ce7-3328-6e88b6d49f55.png" width="50%"/>

#Application Menu - Moduleの作成
メイン画面の左側のリストからテーブルを呼べるようにします
（※テーブル作成時に「Create module」のチェックをを付けたままであれば自動で作成されています）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/6b910236-557f-4f61-968e-a63982a4f3ef.png" width="50%"/>

studioの「Create Application file」から
[Navigation]-[Application Menu]と[Module]を選択して作業を行います
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/937425ad-848a-7d2f-a9cd-b7ee0b0daf03.png" width="50%"/>

[Application Menu]
Titleに「試験App」と入力して「Submit」をクリックします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/f7178a51-adac-09a2-3db4-415b9617332c.png" width="50%"/>

[Module]
以下の値を設定（or選択）します
Title:「sample_table」
Application Menu：「試験App」
Table：「sample table」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/5bb4468b-d627-b029-bf2b-a4a55cbddcb3.png" width="50%"/>
メイン画面をリロードするとメニューに追加した情報が表示されます
クリックするとリスト画面が表示されます（右側の画面）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/8a5253ed-4537-8d60-01f2-07f5fbd60bb0.png" width="50%"/>
「New」をクリックするとForm画面が表示されます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/085c45fc-b7a7-4bb9-3137-59ed3e8f7ec7.png" width="50%"/>
各欄に値を設定して「Submit」をクリックします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/7934fcad-6e61-6854-2640-6fa91ff311a6.png" width="50%"/>
リスト画面にレコードが追加されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/9fdb786a-0a3e-8604-25c3-0d8807c897fe.png" width="50%"/>

#クライアントスクリプト
とりあえず以下のJavascriptは知っている
事を前提としています。
onLoad()
onChange()
onSubmit()
ajax()
document.getElementById()
document.setElementById()

##onLoad,onchange,onsubmitの再現
UIScriptを使用する（Script内の記載方法については別途説明します）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/d40f773b-aa32-1dc1-92d7-bc2fcdd9526a.png" width="50%"/>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/332fad77-65ee-3785-f8ca-96033f3361b5.png" width="50%"/>
[Type]で選択する

onChangeの例

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/32b5abbe-1618-e7c8-a1a2-e31df8e336b1.png" width="50%"/>

```JavaScript:onChangeのScript例
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
   if (isLoading || newValue === '') {
      return;
   }
   //Type appropriate comment here, and begin script below
   alert( oldValue + "から" + newValue + "に変更");   
}
```
onLoadの例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/ddd2f7e1-0312-8d4f-e09a-3737eab8cee4.png" width="50%"/>

```JavaScript:onLoadのScript例
function onLoad() {
   //Type appropriate comment here, and begin script below
   
   if( g_form.isNewRecord() ){
      //新規作成の場合、test_ageカラムに20を設定する
      g_form.setValue("test_age","20");
   }
}
```
onSubmitの例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/4d30794b-531b-a35d-7394-ed8c98822509.png" width="50%"/>

```JavaScript:onSubmitのScript例
function onSubmit() {
   //Type appropriate comment here, and begin script below
   var ret = confirm("保存してよい？");
   if(!ret){
      return false;
   }	
}
```
##クライアントスクリプト内で使用できるServiceNowが提供する変数（オブジェクト）や関数
Scriptのテキストエリア内にフォーカスを当てて「Ctrl + スペースキー」で入力補完が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/fcd91e56-1ec6-c829-ffb7-e15fa3096840.png)
詳細な使用方法はDeveloperサイトの左上にある「API」ー「Client」で移動できる
ページに記載されています。（「Server」は後で）
g_formはGlideForm、g_userはGlideUserに記載されています（他同）
良く使用するのはg_formでフォーム画面上の情報にアクセスするのに使用します
カラム名がtest_nameであれば g_form.getValue("test_name")で値を取得できます
g_form.setValue("test_name","ABC")で設定できます。
取得において文字列の場合はgetValueですが、数値の場合はgetIntValue、True/Falseの場合はgetBooleanValueを使用します。（※設定はsetValueのみ）

#サーバースクリプト
ServiceNowにおける部品は以下になります
・Bussiness Rule : ビジネスロジックを記載する,テーブルへの状態変化を契機に実行される
・Script Include : 処理の共通化、GlideAjax関数からの呼出し先
・UI Action　　　： Form画面上にボタンを設置でき、ボタンクリックで処理実行（UpdateボタンはUI Actionです）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/700908b6-0c63-87a8-b766-688fb9c30076.png" width="50%"/>

##Bussiness Rule の例
NameとTableを指定、「When to run（契機）」で「Update（更新時）」＋「test_age が 20以上の場合」と指定しています
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/331558b6-7045-3b65-7cc1-e9b95dd153ea.png" width="50%"/>
「Action」で「Test Name欄に"成人"と設定する」になります。
よって、テーブルのtest_age欄に20以上を設定して「Update」ボタンをクリックすると
Test Name欄に「成人」と設定されてます（なお、元設定されていた値は上書きされます）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/4fd86967-2ce0-73be-47e9-77630caa456e.png" width="50%"/>
「Advanced」のチェックボックスにチェックを入れると「When to run」の実行契機に選択できる種類が増え、
「Advanced」タグが追加されScriptを記述することが可能になります（「Actions」の設定も併用可能）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/20767f15-3ea9-adce-8dbc-726f3c5e3125.png" width="50%"/>
whenの設定項目
・before   :   データベースへの処理を実行する前の状態で処理を実行、入力値のチェックや整形を行うのに使用
・after    :　　データベースへの処理を実行した後の状態で処理を実行、他テーブルへの更新等を実施するのに使用
・display  :   クライアントの処理にサーバー側からデータを渡す時に使用する。関連：g_scratchpad）

##g_scratchpadについて
　g_scratchpad は連想配列の格納オブジェクトでサーバー処理内の情報をクライアント処理に引継ぐ機能を有しています
　BusinessRuleでAdvanced、Displayを指定してスクリプト内で「 g_scratchpad.abc = "xyz";」の処理を記載すると
　クライアントスクリプト(Client Script等)で「g_scratchpad.abc」から値"xyz"を取得することが可能です。
　なお、g_scratchpadはサーバー側ではdisplay指定のビジネスルールのみで使用可能です、またクライアント側から
　サーバー側への値引き渡しはできません。

##AdvancedのScript
スクリプトを直接記載して詳細な処理を設定することが可能です
引数として、current, previous が存在します、crrentはレコードへ登録する変更後の情報が格納されています
previousは変更前のレコード情報が格納されています。基本的にはcrrentに格納されている値を必要に応じて変更します
下記の例はtest_ageカラムの値が20以上の場合、test_nameカラムの値の先頭に"[成人]"文字列を付与します。
（※なお、このプログラムでは既に"[成人]"が付与され手入れも重ねて追加してしまいます）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/bf07bb70-b402-5eda-b51d-e8f0f7bf1005.png" width="50%"/>


```JavaScript:BussinessRuleのScript例
(function executeRule(current, previous /*null when async*/) {

	// Add your code here
	if(current.test_age >= 20 ){
		current.test_name = "[成人]" + current.test_name.toString() ;
	}

})(current, previous);
```

##Script Include の例
Script内は最初は空白ですがNameを入れると自動で処理が設定されます。
機能としては１ファイル＝１クラスとなり、メソッドを記載していきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/eec1d510-e865-0a65-c1ba-14ff0001d5ea.png" width="50%"/>

```JavaScript:Script例
var SampleClass = Class.create();

SampleClass.prototype = {
    initialize: function() {
    },
    testfunc : function(){
        return "テストメッセージ";
    },
    samplefunc : function(){
        return "サンプルメッセージ";
    },
    type: 'SampleClass'
};
```

```JavaScript:他ファイルのサーバスクリプトからの処理呼出し例
var obj = new SampleClass;
var msg = obj.testfunc(); //"テストメッセージ"が格納される
```

「Client callable」にチェックを入れるとクライアントのGlideAjaxからの呼出しが可能になります。
Script内の処理も変わるので注意してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/4384d7fe-d335-d509-6079-518f45793a71.png" width="60%"/>

```JavaScript:クライアントスクリプトからの処理呼出し例
var clientInterface = Class.create();
clientInterface.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
	getSerVerData : function(){
		//クライアントからのパラメーター値を取得
		var param = this.getParameter('sysparm_set_param');
		//サーバーサイドの処理を書く
		var msg = "サーバー取得メッセージ";
		//クライアントへの返却
		return "client:" + param + " server:" + msg;
	},
    type: 'clientInterface'
});
```

```JavaScript:クライアントスクリプト例
    var ga = GlideAjax("clientInterface"); //ScriptIncludeの指定
    ga.addParam('sysparm_name','getSerVerData'); //メソッドの指定 
    ga.addParam('sysparm_set_param',"ABC"); // パラメーターの設定
    ga.getXML(function(){ //コールバック関数の設定
        var answer = response.responseXML.documentElement.getAttribute("answer");
        alert(answer); //「client:ABC server:サーバー取得メッセージ」が表示される
    });
```

##UI Action の例
フォーム画面、リスト画面に新規ボタンを配置できます。
ボタンをクリックすると、Script内の処理（サーバーサイド）が実行されます、
この時画面遷移が発生して前画面に遷移します
（リスト画面から遷移したフォーム画面であればリスト画面にもどります）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/3eefce7c-5088-d226-2c6f-1f52c6383d2f.png" width="50%"/>
この様に設定すると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/e9fd021e-23be-22f3-be49-5da730bf5c6c.png" width="50%"/>
フォーム画面にこの様に配置されます。実際にはScript部分に処理を記載することで、ボタンクリック時に実行されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555463/e7f058fb-ad51-ad96-17bb-8ca2304dff58.png" width="70%"/>