一覧へ戻る
ITSM

ServiceNow GlideAjax 最適化:実務で差がつくパフォーマンス向上の指針

ServiceNow 開発において GlideAjax は不可欠なツールですが、実装の質がシステム全体のパフォーマンスを左右します。本記事では、プラットフォームの仕様に基づいた、実務で推奨される最適化のポイントをまとめます。

■ 呼び出し回数の最小化(レスポンスの一括化)

複数回の GlideAjax 呼び出しはネットワーク遅延の原因となります。1 回の呼び出しで必要な複数のデータをまとめて取得する設計にすることで、サーバーとの往復回数を減らすことができます。

■ クエリの効率化(setLimit の適切な利用)

GlideRecord.query() を使用して大量のデータを扱う際、必要なレコード数が決まっている場合は setLimit() を活用しましょう。ただし、get(sys_id) を使用する場合は、API の仕様上すでに単一レコードに限定されているため、setLimit() は不要です。

実装コード例

JSON を活用し、安全なエラーハンドリングを含めた実무向けの実装パターンです。

✅ Script Include (Server Side)

var UserInfoAjax = Class.create();
UserInfoAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    getUserDetails: function() {
        var userId = this.getParameter('sysparm_user_id');
        var userGr = new GlideRecord('sys_user');
        
        var result = {
            "email": "",
            "manager": ""
        };

        // get() は PK(sys_id)による単一取得のため setLimit は不要
        if (userGr.get(userId)) {
            result.email = userGr.getValue('email');
            result.manager = userGr.getDisplayValue('manager');
        }

        return JSON.stringify(result);
    },

    type: 'UserInfoAjax'
});

✅ Client Script (Async Call)

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

    var ga = new GlideAjax('UserInfoAjax');
    ga.addParam('sysparm_name', 'getUserDetails');
    ga.addParam('sysparm_user_id', newValue);

    // 通常は非同期の getXMLAnswer を使用して UI のフリーズを防止
    ga.getXMLAnswer(function(answer) {
        if (!answer) return;

        try {
            // 解析エラーに備え try-catch で安全に処理
            var data = JSON.parse(answer);
            g_form.setValue('u_email', data.email);
            g_form.setValue('u_manager', data.manager);
        } catch (e) {
            console.error('JSON parse error in GlideAjax: ', e);
        }
    });
}

初期表示の最適化:Display Business Rule との併用

フォームのロード(onLoad)時にデータが必要な場合は、Display Business Rule を利用して g_scratchpad に値を格納しておくことを検討してください。これにより、初期表示時の追加のサーバーリクエストを不要にでき、ユーザーの待ち時間を短縮できます。

まとめ

  • 非同期処理の優先: 特殊なケースを除き、UI をブロックしない getXMLAnswer を中心に設計します。
  • データ取得の一括化: 1 回のリクエストで必要な複数データをまとめて取得することを意識します。
  • 適切な API 選択: get()query() + setLimit() の違いを理解し、効率的なクエリを記述します。

👉 一言まとめ: 「GlideAjax の極意は 無駄な往復とクエリを減らす ことにあります。適切な API 選択と一括レスポンスにより、効率的な ServiceNow アプリケーションを実現しましょう。」