一覧へ戻る
ITSM

ServiceNow getReference() はコールバック必須?同期処理との違い・推奨実装を解説

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_emailu_manager_emailrequested_for など、環境によって異なる場合がある
  • 必要なタイミングでのみ呼び出す: フォームロード時に無条件で呼び出すのではなく、値の変更時点で呼び出すのが効果的

まとめ

getReference() は ServiceNow の Client Script において非常に有用なメソッドです。しかし、単に使用するだけでなく、どのように呼び出すかがより重要です。同期方式はシンプルに見えてもユーザー体験を損なう可能性があり、コールバック方式は画面をフリーズさせることなく、自然にデータを処理できる推奨パターンです。

👉 getReference() は使うだけではなく、コールバックで使うことでその真価が発揮されます。