[ServiceNow]今すぐ使える小ネタ集

# はじめに
この記事は [ServiceNow Advent Calendar 2023](https://qiita.com/advent-calendar/2023/servicenow) の21日目の記事です。

ついに、公式が今年のアドベントカレンダーを立ち上げてくださいました。
というのも、2020年から毎年私が立ち上げており、毎年スカスカなのが申し訳ないなぁと思っていたのですが、今年は公式の力なのか、まさかの満枠！！うれしい！ありがとうございます！

ということで、今回(今年)は気を付けたいことや、知っておくと便利(かもしれない)な小ネタを５つ詰め込んできました。よろしくお願いします。

# その１　LIST型使用の際の注意(Choiceでの使用)
LIST型を使用する際、Reference/Choice両方で使用できますが、
今回は、Choiceを使用している場合に気を付けないといけないこと。

こんなList項目の定義があったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/28fe2655-eed1-c7c1-08f7-d8d823e846a8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/a150a5fd-d342-9543-89a7-7c2e51e57f8e.png)

こういった定義を行った場合、複数選択した状態で登録すると、カンマ区切り+物理名で登録されます。
例)apple,orange
　 green_apple,peach,orange

LIST型のフィルタで使用できるのは、以下の4つ(LIKE,NOTLIKE,ISNULL,ISNOTNULL)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/422640b9-fab1-6372-79e6-02c431acce26.png)

しかも物理名で検索しないといけない。(論理名での検索ではヒットしない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/2bd16a8c-d52b-f720-ba13-c83fdf6511f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/15688678-47a3-e439-3f57-4244a1b6eadb.png)

見ていただくとわかるように、”apple"を含むという条件で検索を行っているため、「りんご」「青りんご」両方ヒットしてしまう。
本当はりんごだけで検索したいのに！


ということで、Choiceの定義を単語被りの無いようにしてあげないとそのものを検索してあげることができない、ということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/d21086d7-4b72-8da4-f497-7ec60196c777.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/c52774ce-5c91-e47c-423e-9291c2fc78dc.png)

(ホントは論理名で検索できるようにしてもらえると嬉しい。
　…というかchoiceだから選択肢で出てほしいですね。)

画面からの検索はあまり行わないので、影響ないという場合もあるかもしれません。
これ何が困るかってスクリプトでデータ取ってこようとした際に、困ります。
scriptで記載する際は、以下のようにaddQueryで条件を足していくんですが、
Like句を指定していなくても、いい感じにLike検索にしてくれてます。
これにより、やっぱり意図しないデータも取得されてしまう、ということになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/60ac9487-1a71-39ba-ace5-3c2b891707cc.png)


# その2　バージョン管理をうまく使おう

UpdateSetに載る資材は一部例外を除き、大体バージョン情報というものを持っています。
まず、バージョンはどういうものなのか、見るために、表示させてみます。

FormのConfigure->Related Listsを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/d69151cd-425a-7965-b862-c9e9d7add04b.png)


Versionsが存在しているので、右側に移動してsave
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/647976f7-0aa6-8490-a6be-37b9c872391f.png)


すると、関連リストにVersionsが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/c4b4b5bf-5ca9-c9f6-dc6e-a73da12e5dbd.png)

ここには、どのUpdateSetに載っているか、いつ記録され、だれが触ったかといった情報があり、今どのバージョンなのか、という情報もわかるようになっています。
更新を行う度に、Versionに記録されるようになっています。

例えば、1つの資材を別々のタイミングで別のUpdateSetに記録されている場合、ここを見ればリリースの際に、UpdateSetの反映順を考える1つのヒントになるかと思います。

このバージョン管理を利用して、現在と過去の差分を見れたり、過去のバージョンに戻せたりもします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/07202724-10c4-f050-9a05-f691be6d2f60.png)

超長いスクリプトを書いており、レビューする際に「どこ触ったんこれ・・」みたいなときに、差分で見れると修正範囲がわかりやすくなります。

また、例えばテスト環境でちょっとしたバグが出たので、一時的にログを仕込みたい・・！
本来なら開発環境でログを仕込んでUpdateSetでテスト環境に反映して・・
という手順になるかと思いますが、開発環境の対象の資材は既に大幅な手が入っておりテスト環境とは大きく異なる！

という場合に、しょうがないからテスト環境で直接ログ仕込んでみるか、ということも稀にあるかもしれません。
その場合、ログを仕込んで戻す、というものもすべて更新の扱いになるので、いざ開発環境からUpdateSetを適用しようとすると、コンフリクトを起こしてしまいます。
テスト環境で直接ログを仕込む→Versionを利用してログを仕込む前の資材に戻す。
ということをすれば、コンフリクトも起きずにちゃんとUpdateSetをあててあげることができます。
Versionは常に表示しておきたいです。



# その3 よく使用するコードはテンプレート化して効率化しよう
　開発効率化・標準化につながるかもしれません。
  特に良く使うものとして、カタログを開発している際のAjax通信が挙げられるかと思います。
  マスタを選択したら関連する項目に値を自動セット・・良くある話ですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/35f1473b-0046-3f9e-dca2-473bf8297591.png)

こういうのを作る際は、OnchangeによるクライアントスクリプトからAjaxで情報を持ってくるというのが、一般的かと思います。

慣れてくるとすんなりかけるようになるんですが、初めて・久しぶりに作る際に
「アレ？どうやるんだっけ・・？」みたいになることありませんか。

  そんなときに便利な機能です。

## Syntax editor macroを使用
これを使用することで、簡単にあらかじめ定義したscriptが呼び出せます。
使用方法は、以下の通り
### 事前準備
#### 1.Syntax Editor Macroのメニューを開き、新規作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/a5d3bcda-c963-ee7d-768e-4e73dadc524c.png)

#### 2.こんな感じで、scriptを定義しておく。
　(スクリプト内は割と適当です、すいません。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/6abac29a-9eac-62dd-40fe-2d3114f97c24.png)

以上で、事前の設定は完了。
いざ、使ってみましょう。

### 使い方
今回は、クライアントサイドのスクリプトを定義したので、
カタログクライアントスクリプトのonchange想定で記載します。

#### 1.scriptエディタに、先ほどマクロで作成したName「ajax_client」と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/43d8d4d9-397d-d927-eb24-ec59d8f98b71.png)

#### 2.Tabキーを押す！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/6b216793-320a-3c4b-1d69-ead3c0218aa6.png)

先ほど、マクロで定義したスクリプトがすべて展開されました。
これを使用して、必要な個所のみを書き換えることで、効率的に作業ができますね。
あとは、フォーマットコードで、きれいにしてあげれば良きです。
汎用的に使えるスクリプトや、Daoのようなものを作る際に超有効に使用できます。
とっても便利な機能ではあるので、使ってみてください。

# その4 Ajaxだけじゃない、Extendsを活用
scriptincludeを作る際に、Client callableにチェックを付けると、こんな感じのコードが自動生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/ea1c7408-104a-bda2-8062-67f085d5cb80.png)

こういうものなんだなーで済ませている方多いかと思うのですが、
実はこのextendsObjectは自作のスクリプトにも使用できます。
(当たり前じゃん、って思われるかもしれませんが・・・！)

試しにこんなscriptを作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/4fb27143-f7b0-491f-91bd-e1b47e584c20.png)


中身は単純に指定されたテーブルからsysidで検索したGlideRecordオブジェクトを返すだけ。

で、このクラスを拡張したものがこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/f9a110e2-33b3-80a1-9cf9-9774bc5e6cc3.png)

extendsObjectとして、指定しているものが、先ほど作成したtestparentになっています。
一旦、中身はなんもない感じで。

これで、動かしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/85c1c74e-216d-41ed-d1d9-7de201e00e24.png)

Childに定義していないgetDataを呼び出すと、親として指定しているgetDataが呼び出され、ちゃんとデータを取ってきてくれます。
共通処理を親に書いて汎用的に使用、みたいなことに使えるかもしれません。
ちなみに、OverRideすることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/b0b46fa4-74b7-358d-3e41-9e135b994d58.png)
OverRideしたものから、親のgetDataを呼び出して、そのあとログ出力するだけのものを作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/648c6cff-2203-05c7-f99d-e5793a46cfde.png)
先ほどまで出力されていなかったログ(Childで出力しているログ)が出力されるようになっています。
うまくいきましたね。
拡張、うまく使ってください。


# その5　このロール割り当てていいんだっけ・・・？
ServiceNowには、標準で多くのロールがあり、このロールを付与するとFullfiller、このロールだとBusiness stake holderが必要、これはRequesterで使える…など覚えるのも大変ですし、ドキュメントも探すのが大変ですね。

そんな時は、「license_role.list」を実行してみましょう。
ロールとそれに紐づくアプリケーション、RoleTypeが保持されているのでここを見ればある程度どのタイプで使用できるのか、というのがわかりやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/882df20a-e9b8-9e03-1f1c-ddff6bbe1ba5.png)

# 終わりに
以上、いかがでしょうか。
知っていたもの・初めて知ったものあったかと思いますが、
有効活用していただければと思います。
皆さんの良きServiceNowライフのヒントになれば幸いです。