【ServiceNow】Low-Codeで簡単！日付のバリデーションを実装する方法！！

# 概要
　ServiceNowで開発するうえで、フォームを送信する前に日付の比較検証(バリデーション)をしてほしいという要望は多くあると思います。もっとも要望が多く単純なものは、**『ユーザーが日付フィールドを入力する際に【開始日＜終了日】のチェックをしてほしい』**というものだと思います。
日付を検証する方法としてコミュニティによく上がっているのは、`GlideAjax`を使用して、サーバサイドで日付の比較処理を行いその結果をクライアントに返す方法や`getDateFromFormat関数`を用いて日付の値を取得しより簡単に日付オブジェクトを扱う方法が見られますが、**UIポリシーを用いることでLowCodeで簡単に日付検証を行うことができます。**
　本記事では、ServiceNowの日付フィールドの概要を説明しつつ、実際に日付フィールドの比較検証を行う方法をまとめました。

# UIポリシーで日付の検証を実装する
 UIポリシーとはクライアントサイドで動作を制御できる機能になっており、クライアントスクリプトと違いフィールドの`必須`、`読み取り専用`、`表示/非表示`、`フィールド値のクリア`をGUIで簡単に設定できるのが特徴です。また、UIポリシー上でもスクリプトを記述することも可能です。
**今回はよりユーザーに対して、エラーメッセージを表示するために簡単なスクリプトも記述していきます。**

## 実装環境と事前準備
バージョン：Rome
使用言語：日本語
あらかじめ検証用に以下のカスタムテーブルとフィールドを作成した。

| コンポーネントタイプ | 名前 | ラベル名 | フィールドタイプ |
|:-|:-:|:-:|:-:|
| テーブル  | u_date_time_test  | Date_Time_Test  | ×  | 
| フィールド  | u_start_date  | 開始日  | Date/Time型  |
| フィールド  | u_end_date  | 終了日  | Date/Time型  |

##実装手順と解説
###UIポリシー設定画面までの遷移方法
新規でUIポリシーを作成するには以下のルートが存在します。
・`アプリケーションナビゲーター`：[システムUI]>[UI ポリシー]
・`フィルターナビゲーター`：『<テーブル名>.config』で検索し、UIポリシータブを選択
・`作成対象のテーブルのレコードのフォームコンテキストメニュー`：[構成]>[UIポリシー]

###作成したUIポリシーの全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/d6aa43e2-203d-98e5-12b9-0d2c80044ee6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/40a7c3e0-1ba1-be4b-c4cf-768fe1280afa.png)

###解説
全体像の画像から重要なポイントは`UIポリシーの実行条件`、`UIポリシーアクション`、`Trueの場合に実行するスクリプト`です。１つずつ開設していきましょう。

- **UIポリシーの実行条件**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/420b6248-ffd1-71f2-a46c-cc85c1b627d9.png)
ここではこのUIポリシーの実行条件を設定することができます。この条件を満たすことで、設定したUIポリシーアクションとスクリプトが実行されます。
日本語だと条件文が理解しづらいですが、簡単に要約すると`【開始日＞終了日＋０ｈ】`となります。
０時間という表記が謎ですが、[は次より大きい]では基準日（今回で言う終了日）の日時をズラすことができます。時間や日にちのオフセットをつけることができるので【開始日＞終了日＋4h】や【開始日＞終了日＋２D】といった条件分を作成可能ですが、今回はオフセットを持たせる必要がないので０時間という条件設定にしています。

- **UIポリシーアクション**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/a164a4b9-df59-a291-571f-39d5188289a4.png)
UIポリシーアクションは条件がTrueになった際に設定したフィールドに対して、必須や読み取り専用といった制御を加えることができます。
今回は開始日＞終了日になった場合に、`終了日の値をクリア`にする設定にしています。

- **Trueの場合に実行するスクリプト**

```javascript
function onCondition() {
	g_form.hideFieldMsg('u_end_date'); //終了日の下に表示されているメッセージを消去す
        //引数はメッセージを消したいフイールドのフィールド名
	g_form.showFieldMsg('u_end_date',"開始日＜終了日にしてください！！",'error'); //エラーメッセージを表示する
        //引数は<メッセージを表示させるフィールド名>,メッセージの内容>,<'error'か'info'>
}
```
`メッセージの削除`→`メッセージの表示`の順序にすることで、エラーメッセージが連続して表示されていくのを防ぎます。また、g_form.showFieldMsgの引数に`'error'`を渡すことで、メッセージボックスの色を赤色にすることができます。

###実装結果
![29D27C2E-2AD2-478E-859F-7EDAAA4CB19F.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/4c085542-d037-d414-4303-349479531724.gif)

上記のように日付の比較検証を実装することができました。

# 参考文献
 - [①【公式コミュニティ】No Code date validations through (Catalog) UI Policies](https://community.servicenow.com/community?id=community_article&sys_id=f61964aadbcb3fc85129a851ca9619eb)
 - [②【公式ドキュメント】AJAX](https://docs.servicenow.com/bundle/rome-application-development/page/script/ajax/topic/p_AJAX.html#r_ExamplesOfSynchronousGlideAjax)
 - [③【SNGURU】Client Side Dates in ServiceNow](https://servicenowguru.com/scripting/client-scripts-scripting/client-side-dates-in-servicenow/)
 - [④【SNGURU】UI Info and Error Message Cheat Sheet](https://servicenowguru.com/scripting/ui-info-error-message-cheat-sheet/)