一覧へ戻る
ITSM

ServiceNow における getReference() と GlideAjax の使い分け

ServiceNow の Client Script において、参照フィールドの情報を取得する getReference() は、ユーザー体験を向上させるために非常に便利なメソッドです。しかし、内部動作を理解せずに使用すると、不要なデータ取得や UI ブロックを引き起こし、パフォーマンス低下の原因となります。本記事では、実務に即した正しい実装方法と、状況に応じた使い分けについて解説します。

非同期(コールバック)呼び出しの採用

getReference() を使用する際の鉄則は、ブラウザのメインスレッドを停止させないように 非同期(コールバック関数) を選択することです。引数が一つのみの同期呼び出しは、レコード取得まで UI が一時的にフリーズするため、UX の観点から 推奨されません。

例: 非同期(コールバック)呼び出しの実装

function onChange(control, oldValue, newValue, isLoading) {
   if (isLoading || newValue == '') return;

   // 第二引数にコールバック関数を渡すことで、非同期処理を実行
   g_form.getReference('requested_for', function(userRecord) {
      // 存在チェックと型に依存しない安全な比較
      if (userRecord.vip) {
         alert('このユーザーは VIP です');
      }
      g_form.setValue('location', userRecord.location);
   });
}


パフォーマンスの盲点と注意点

実装時には以下の 3つのポイントに注意してください。

  • ドットウォーク(Dot-walking)の負荷: 取得した userRecord からさらに別のテーブルを辿る(例:userRecord.manager.name)ことは可能ですが、取得データが増え、処理コストが高くなる可能性があるため、慎重に使用する必要があります。
  • 内部キャッシュの挙動: 同一レコードに対する繰り返しの呼び出しにはキャッシュが利用されますが、フォーム上で値が更新された直後 など、キャッシュとの不整合が発生しやすいタイミングには注意が必要です。
  • 転送データ量: getReference() はレコード全体の複数フィールドを取得するため、単一のフィールドのみが必要な場合には通信コストが割高になります。

最適な代替案:GlideAjax

シンプルな参照情報の取得には getReference() が便利ですが、GlideAjax を選択することで、不要なデータ取得を抑え、より効率的な実装が可能になります 特に、詳細な制御や深い階層のデータが必要な場合は、サーバー側でロジックを完結できる GlideAjax が有力な選択肢となります。

例: 必要なフィールドのみを取得する最小構成の実装

var ga = new GlideAjax('GetUserLocation'); 
ga.addParam('sysparm_name', 'fetchInfo');
ga.addParam('sysparm_user', g_form.getValue('requested_for')); 

ga.getXMLAnswer(function(answer) {
   // 必要なデータのみをピンポイントで受信
   g_form.setValue('location', answer);
});

まとめ

getReference() は非同期処理を前提とし、UI のブロックを回避するように実装しましょう。「手軽さの getReference()、制御性と性能の GlideAjax」 と使い分けるのが、ServiceNow 開発におけるベストプラクティスです。

👉 一言まとめ: 「利便性の getReference() と効率性の GlideAjax処理コストを意識した設計がパフォーマンスを左右します。