今回はServiceNowのReference(参照)フィールドについて、スクリプトから値を取得する際の基本的な方法を紹介します。
ReferenceフィールドはServiceNowではよく使用するフィールドですが、画面上に表示されている値と、内部的に保持している値が異なります。
本記事では、Referenceフィールドの仕組みと、getValue()、getDisplayValue()、ドットウォークなどを利用した値の取得方法について紹介します。
※本記事は執筆時点の情報になります。最新の内容についてはServiceNowの製品ドキュメントをご確認ください。
Referenceフィールドとは
Referenceフィールドは、別のテーブルのレコードを参照するフィールドです。
例えば、インシデント(incident)テーブルの「Caller(caller_id)」は、ユーザー(sys_user)テーブルを参照しています。
画面上では、
Joe Employee
のようにユーザー名が表示されますが、Referenceフィールドが内部的に保持している値は、以下のような参照先レコードの sys_id です。
681ccaf9c0a8016400b98a06818d57c7
つまり、Referenceフィールドにはユーザー名そのものが保存されているわけではありません。
画面上では利用者に分かりやすい「表示値(Display Value)」を表示し、内部ではレコードを一意に特定するための sys_id を保持しています。
getValue()とgetDisplayValue()
それでは、Referenceフィールドの値をGlideRecordから取得してみます。
今回はインシデントのCallerを例にします。
var gr = new GlideRecord('incident');
//指定したsysidのレコードを取得
gr.get('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
var callerId = gr.getValue('caller_id');
gs.info(callerId);
getValue() を使用した場合は、Referenceフィールドが保持している値である sys_id を取得できます。
実行結果は以下のようになります。
681ccaf9c0a8016400b98a06818d57c7
一方、画面上に表示されているユーザー名を取得したい場合は getDisplayValue() を使用します。
var gr = new GlideRecord('incident');
//指定したsysidのレコードを取得
gr.get('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
var callerName = gr.getDisplayValue('caller_id');
gs.info(callerName);
実行結果は以下のようになります。
Joe Employee
簡単にまとめると、以下のような使い分けになります。
| 取得方法 | 取得できる値 |
|---|---|
getValue('caller_id') |
参照先レコードのsys_id |
getDisplayValue('caller_id') |
画面上の表示値 |
他のレコードを検索したりReferenceフィールドに値をセットしたりする場合は sys_id、ユーザーへの表示やログ出力などで名称を使用したい場合はDisplay Value、と考えると分かりやすいと思います。
ドットウォークで参照先の値を取得する
Referenceフィールドでは、参照先レコードが持っている別のフィールドを取得することもできます。
このときに利用できるのが「ドットウォーク」です。
例えば、Callerに設定されているユーザーのメールアドレスを取得したい場合、以下のように記載できます。
var email = gr.caller_id.email;
caller_id は sys_user テーブルを参照しているため、
インシデント
↓
Caller
↓
Email
という形で参照先のフィールドを辿っています。
ほかにも、Callerが所属している会社名を取得する場合は以下のように記載できます。
var companyName = gr.caller_id.company.name;
Referenceフィールドを経由して、さらにReferenceフィールドを辿ることも可能です。
ServiceNowではこのように、関連するテーブルのフィールドを「.(ドット)」でつないで参照することをドットウォークと呼びます。
getRefRecord()で参照先レコードを取得する
参照先のレコード自体をGlideRecordとして取得したい場合は、getRefRecord() を使用する方法もあります。
var userGR = gr.caller_id.getRefRecord();
if (userGR.isValidRecord()) {
gs.info(userGR.getValue('name'));
gs.info(userGR.getValue('email'));
}
getRefRecord() を使用すると、Referenceフィールドが参照しているレコードをGlideRecordとして取得できます。
参照先の1つのフィールドだけを取得するのであればドットウォークでも簡単に記載できますが、参照先レコードの複数の値を利用したい場合などには getRefRecord() も選択肢になります。
まとめ
今回はReferenceフィールドの基本的な仕組みと、スクリプトから値を取得する方法について紹介しました。
Referenceフィールドでは、画面上に表示されている名称ではなく、内部的には参照先レコードの sys_id が保持されています。
値を取得する際は、目的に応じて以下を使い分けることができます。
| 取得方法 | 取得できる値 |
|---|---|
getValue('caller_id') |
参照先レコードのsys_id |
getDisplayValue('caller_id') |
画面上の表示値 |
ドットウォーク |
参照先レコードのフィールド値 |
getRefRecord() |
参照先レコードをGlideRecordとして取得 |
ReferenceフィールドはServiceNowのさまざまな場所で使用されるため、表示値と内部値の違いを理解しておくと、スクリプトを書く際にも役立つと思います。
ぜひ参考にしてみてください。
