ServiceNow の Client Script を開発していると、参照フィールド(Reference Field)の値を取得するために g_form.getReference() を頻繁に使用します。非常に便利なメソッドですが、呼び出し方式によってフォームのパフォーマンスとユーザー体験に大きな差が生まれます。
特に多くの開発者が見落としがちなポイントは、コールバック(callback)方式の使用有無です。本記事では、なぜコールバック方式が推奨されるのか、そして実務でどのように適用すべきかを解説します。
getReference() とは
getReference() は、参照フィールドが指し示すレコード情報を取得するための Client Script メソッドです。
- Requested For からユーザー情報を取得
- Manager から管理者情報を取得
- Caller から要求者の部署情報を取得
このように、参照フィールドに紐付いたデータを簡単に読み取ることができます。
例:
g_form.getReference('requested_for', function(user) {
g_form.setValue('location', user.location);
});避けるべき方式:同期呼び出し
以下のコードは、古いドキュメントやレガシーコードでよく見られるパターンです。
var user = g_form.getReference('requested_for');
g_form.setValue('location', user.location);
一見シンプルですが、この方式ではサーバーからの応答が完了するまでブラウザが待機状態になります。
その結果として以下の問題が発生します。
- 画面の応答速度の低下
- 入力中のフリーズ現象
- ボタンクリックの遅延
- フォーム全体のレスポンス低下
特にネットワークが遅い環境や、呼び出しが繰り返される場面では影響がより顕著になります。
推奨方式:コールバック(非同期)呼び出し
第二引数に関数を渡すことで、非同期方式として動作します。
g_form.getReference('requested_for', function(user) {
g_form.setValue('location', user.location);
});
この方式では、データ取得中も画面がフリーズしません。
- ユーザーは入力を継続できる
- UI の応答性が維持される
- 複雑なフォームでも安定して動作する
なぜコールバック方式が重要なのか
ブラウザは画面描画とユーザー入力の処理を メインスレッド で行っています。同期呼び出しが増えるとメインスレッドが一時的にブロックされ、以下のような現象が発生します。
- 入力の遅延
- ボタンクリックの無反応
- スクロールのカクつき
- 画面遷移の遅延
一方、コールバック方式はリクエストを先に送信し、レスポンスが到着した時点で指定されたコードを実行します。そのため、はるかに自然でスムーズな動作を実現できます。
実務パターン:Manager 選択時のメール自動入力
避けるべき方式:
var manager = g_form.getReference('manager');
g_form.setValue('manager_email', manager.email);
推奨方式:
g_form.getReference('manager', function(manager) {
g_form.setValue('manager_email', manager.email || '');
});
onChange Client Script の定石パターン
実務で最も頻繁に使用される、堅牢な実装パターンです。
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading) return;
if (!newValue) {
g_form.clearValue('manager_email');
return;
}
g_form.getReference('manager', function(manager) {
g_form.setValue('manager_email', manager.email || '');
});
}
なぜ同期方式のコードがまだ多いのか
理由はシンプルです。
- コードが短く見える
- 理解しやすい
- 古いドキュメントやブログの例が多く残っている
- 「今は問題なく動いている」のでそのまま使い続けている
しかし、ユーザー数が増えフォームが複雑になるほど、パフォーマンスの差は明確に現れます。
実務チェックリスト
- コールバック方式を使用する:
g_form.getReference('field', function(rec){});の形式を徹底する - 値クリア時に関連フィールドを初期化する:
g_form.clearValue('manager_email');で不要なデータの残留を防ぐ - フィールド名を正確に確認する:
manager_email、u_manager_email、requested_forなど、環境によって異なる場合がある - 必要なタイミングでのみ呼び出す: フォームロード時に無条件で呼び出すのではなく、値の変更時点で呼び出すのが効果的
まとめ
getReference() は ServiceNow の Client Script において非常に有用なメソッドです。しかし、単に使用するだけでなく、どのように呼び出すかがより重要です。同期方式はシンプルに見えてもユーザー体験を損なう可能性があり、コールバック方式は画面をフリーズさせることなく、自然にデータを処理できる推奨パターンです。
👉 getReference() は使うだけではなく、コールバックで使うことでその真価が発揮されます。