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 アプリケーションを実現しましょう。」