一覧へ戻る
ITSM

ServiceNow クライアントスクリプトで GlideRecord を使用すべきでない理由

ServiceNow 開発において、クライアント側(Client Script)でデータを取得する際に GlideRecord を使用することは「バッドプラクティス(忌避すべき手法)」とされています。特に Scoped Application(スコープ対象アプリ)では制限がかかることも多く、何よりパフォーマンス面で大きなデメリットが発生します。ここでは、クライアント側GlideRecordを避けるべき理由と、推奨される代替案について解説します。

なぜクライアント側での GlideRecord は NG なのか?

  • 同期リクエストによるUIのフリーズ: クライアント側の GlideRecord はサーバーへの同期通信(Synchronous Request)を発生させるため、データ処理の完了を待つ間、ユーザーの画面操作が完全にロックダウンされてしまい、UIが一時的にフリーズする原因となります。
  • パフォーマンスの著しい低下: たとえ 1 つのフィールド情報が必要なだけでも、該当レコードの「全フィールド」のデータをデータベースから取得してしまいます。これにより、不要なデータ通信が発生し、全体の応答性が大きく低下します。
  • Scoped App での制限: ServiceNow はプラットフォームのパフォーマンス最適化のために、スコープ対象アプリ内でのクライアント側 GlideRecord の使用を制限しています。

推奨される 3 つの代替案

1. GlideAjax(最も推奨されるベストプラクティス)

サーバー側との通信を非同期(Asynchronous)で行う最も効率的な方法です。必要なデータのみをサーバーからピンポイントで取得するため、UI のフリーズを完全に防ぎ、高速な動作を実現します。

✅ 実装例 (Client Script):

var ga = new GlideAjax('UserUtils'); 
ga.addParam('sysparm_name', 'getManagerName');
ga.addParam('sysparm_user_id', g_form.getValue('caller_id')); 

ga.getXMLAnswer(function(answer) {
    if (answer) { 
        g_form.setValue('manager_field', answer);
    }
});

✅ 実装例 (Script Include - Client callable):

var UserUtils = Class.create();
UserUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getManagerName: function() {
        var userId = this.getParameter('sysparm_user_id');
        var user = new GlideRecord('sys_user');
        if (user.get(userId)) {
            return user.manager.getDisplayValue();
        }
        return null;
    },
    type: 'UserUtils'
});

2. g_scratchpad の活用

フォームの初回読み込み時(Display Business Rule)に、あらかじめサーバー側のデータをクライアントに渡しておく方法です。画面操作時の追加リクエストが一切不要になるため非常に高速です。

✅ 実装例 (Server-side - Display Business Rule):

g_scratchpad.managerName = current.manager.getDisplayValue();

✅ 実装例 (Client Script):

g_form.setValue('manager_field', g_scratchpad.managerName);

3. g_form.getReference()

参照(Reference)フィールドからデータを動的にバックグラウンドで取得します(非同期のコールバックが必須)。Client側GlideRecordよりはマシですが、これも全フィールドをロードするため、大量のデータを扱う場合はやはり GlideAjax の方が優れています。

✅ 実装例:

// コールバック関数を使って非同期で取得するため、UIフリーズを防ぎます
g_form.getReference('manager', function(ref) {
    if (ref) {
        g_form.setValue('manager_name', ref.name);
    }
});

まとめ

  • クライアントスクリプト内での GlideRecord は、UIフリーズによるユーザー体験の低下と保守性のリスクを招くため絶対に避けましょう
  • 動的なデータ取得が必要な場合は GlideAjax、フォームを開いた時の初期データが必要なら g_scratchpad を活用するのが 公式のベストプラクティスです
  • 既存のスクリプトを点検し、クライアント側GlideRecordを見つけたらこれらの効率的な手法へリファクタリングすることを強くお勧めします

一言まとめ: 👉 画面が固まる原因を取り除くため、Client Script では GlideRecord を卒業し、GlideAjax を使いこなそう!