ServiceNow開発の要素_クライアントサイド

# はじめに
本稿では**ServiceNow開発での知見**を書きおこうと思います。
今回は、開発でよく使う機能(table)についてです。

ServiceNowは**「標準的で」「迅速な」導入が可能なアプリケーション**を標榜しており、その実現のために**かなりの部分がノンコーディングの初期状態(OOTB:out of the box)でできる**ようになっています。

とはいえ、**コーディングをするべき部分も多少なり存在**しており、その部分に関しては別稿[ServiceNowで使用するJavaScriptまとめ【On Youtube】](https://qiita.com/yasutaka_ono/items/82d6e29ec065203ea22f)に譲ります。

今回の投稿範囲は、ノンコーディングで実現できる範囲であり、**業務において必ず使うであろう機能についての解説**です。下記の内容の理解があれば、ServiceNow開発者になれます。

具体的には下記です。

- UIアクション
- UIポリシー
- クライアントスクリプト
- ビジネスルール
- アクセスコントロール
- ワークフロー
- メール通知
- サービスポータル

です。他にも重要なトピックはありますが、別途解説します。
では内容に移りましょう。

# UIアクション
一言で言うと、**ボタンやリンクなどのクライアントアクション**のこと。
URL:[公式ドキュメント](https://docs.servicenow.com/bundle/london-it-service-management/page/product/change-management/task/t_CreateNewUIAction.html)
#### イメージ:
![FireShot Capture 016 - INC0010005 - Incident - ServiceNow - dev74512.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/63dd13aa-5c6a-0278-5bfc-d8904ac36439.png)
#### 解説:
プラットフォーム上で要求・承認・却下などのアクションを定義するボタンのこと。
上記ボタンをクリックすることで、サーバ処理やワークフローを走らせるためのトリガーとなる。
クライアント側にあたる。
#### アクセスパス:
System Definition > UI Actions

#### スクリプト:
```ui_action_resolve.js
function resolveIncident(){
	//Set the 'Incident state' and 'State' values to 'Resolved', and display mandatory fields
	g_form.setValue('incident_state', 6);
	g_form.setValue('state', 6);
	g_form.setValue('resolved_by', g_user.userID);
	
	gsftSubmit(null, g_form.getFormElement(), 'resolve_incident'); //MUST call the 'Action name' set in this UI Action
}

//Code that runs without 'onclick'
//Ensure call to server-side function with no browser errors
if (typeof window == 'undefined')
	serverResolve();

function serverResolve(){
	current.incident_state = IncidentState.RESOLVED;
	current.state = IncidentState.RESOLVED;
	current.resolved_by = gs.getUserID();
	current.update();
}
```

# クライアントスクリプト
一言で言うと、**クライアントサイドでのメッセージ・バリデーション・などの処理**のこと。
URL:[公式ドキュメント](https://docs.servicenow.com/bundle/london-servicenow-platform/page/build/service-portal/reference/client-script-reference.html)
#### イメージ:
![FireShot Capture 017 - INC0009005 - Incident - ServiceNow - dev74512.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/21812441-97be-3a2b-57ff-dcdcbabae581.png)


#### 解説:
プラットフォーム上での動作に応じて、メッセージやバリデーションや値の自動セットを行う。
上記イメージでは、選択肢に応じてメッセージを表示している。
クライアント側にあたる。

#### アクセスパス:
System Definition > Client Scripts

#### スクリプト:
```display_info_message.js
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
   if (isLoading || newValue === '') {
      return;
   }
	var count = 0;
	var gr = new GlideRecord('incident');
//実装上ではbad practice
	gr.addQuery('urgency',g_form.getValue('urgency'));
	gr.query();
	
	while(gr.next()){
		count = count + 1;
	}
	g_form.addInfoMessage("同じ緊急度のインシデントが他にも"+ count + "件あります。");
}
```
# UIポリシー
一言で言うと、**クライアントサイドの表示・必須制御**のこと。
URL:[公式ドキュメント](https://docs.servicenow.com/bundle/london-it-service-management/page/product/change-management/task/t_AddUIPolicy.html)
#### イメージ:
![FireShot Capture 019 - INC0009005 - Incident - ServiceNow - dev74512.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/f71f87d1-7b5f-1b47-d751-e054abcc788a.png)

#### 解説:
プラットフォーム上での画面ロード時の単純処理を定義。
基本用途は必須と読み取り専用をかけるために使用する。
上記イメージでは、選択肢を必須項目にしている。
クライアント側にあたる。

#### アクセスパス:
System UI > UI Policies

#### イメージ2
![FireShot Capture 020 - Fields set to mandatory for all states - UI Policy - ServiceNow_ - dev74512.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/aebaefe8-5a8d-9aa8-79b0-823c382684e4.png)

UIポリシー:Fields set to mandatory for all states
意味:すべての状態のフィールドに適応する必須項目
コンディション:すべての条件
動作:UIポリシーアクション
caller_id,short_description=>必須項目

# 後述記事
- ビジネスルール
- アクセスコントロール
- ワークフロー
- メール通知
- サービスポータル
については別記事にて記載する予定です。