JunshuO
ServiceNow Employee

2026 年に ServiceNow 開発者であれば、少なくともコードの一部を AI が記述している可能性は十分にあります。また、コードがデフォルトで GlideRecord に設定されている可能性も同様に高いです。それはほとんどの場合、機能しますが、そうでない場合もあり、その失敗は跡形もなく本番環境に紛れ込んでしまうような、気づきにくい種類のものです。

これが、開発者アドボケイトの Sujan 氏と、ServiceNow エコシステムに 11 年以上携わる 5 回の ServiceNow MVP 兼ソリューションアーキテクトである Amit Gujarathi 氏との会話の出発点です。ライブインスタンスでの GlideQuery について一緒に説明し、GlideRecord よりも優れている点と、GlideQuery がスクリプトツールキットに永続的に含めるに値する理由を正確に示します。

 

GlideQuery は代替品ではなく、より安全なレイヤーです

まず最初に、GlideQuery は GlideRecord のラッパーです。エンジンやデータベースへの呼び出しは同じです。違いは、上に配置されるインターフェイスにあります。アミットは次のように例えて説明しました。GlideRecord はシートベルトや車線アシストなしで運転するようなものです。何でもできますが、何か問題が発生した場合は自己責任となります。GlideQuery は、スクリプト上の問題が(ITSMの)インシデントになる前に検出するガードレールを追加します。

 

すべてを削除する入力ミス

最初のデモは強烈なインパクトを与えました。「activated」フィールド (「active」のタイプミス) に対する単純なクエリフィルタリングが GlideRecord で実行されました。エラーなし。警告はありません。GlideRecord は無効なフィールドを無視し、テーブル内のすべてのレコードを返しました。タイプミスが deleteMultiple 操作で行われたと想像してください。気づかないうちにテーブルをきれいにワイプしてしまうでしょう。

GlideQuery では、同じ入力ミスから「unknown field 'activated' in table incident」という明確なエラーメッセージがスローされます。さらに良いことに、テーブル上のすべての有効なフィールドが一覧表示されるため、正しい名前をすぐに見つけることができます。これはエラー処理にとどまらず、時間の節約にもなるのです。

 

実際に機能する JavaScript 型の比較

2 番目のシナリオでは、悪名高く厄介なバグに対処しました。GlideRecord からメールフィールドをプルし、それをトリプルイコール (===) を使用してプレーンな文字列と比較すると、値が同じであっても比較に失敗します。これは、GlideRecord が JavaScript 文字列ではなく GlideElement オブジェクトを返すため、厳密な型比較では決して一致しないためです。

GlideQuery はプレーンな JavaScript 値を返します。トリプルイコール (===) は期待どおりに機能します。これにより、ログに記録された出力が完全に正しく見えるため、デバッグに苦労する一連のバグが排除されます。

 

不変クエリ:一度定義すれば、どこにでも拡張できます

GlideRecord では、基本条件を共有する (たとえば、アクティブが true) が優先度が異なる 3 つのクエリを実行する必要がある場合、その基本条件をそれぞれにコピーして貼り付けることになります。後でベースを変更すると、更新する場所が 3 つあります。

GlideQuery のクエリオブジェクトは不変です。基本条件を一度定義した後、 .where() を使用して、それを拡張する新しいクエリオブジェクトを作成します。元のクエリは変更されません。コードが減り、問題が発生する可能性のある箇所が減り、メンテナンスがはるかに容易になります。

 

必要なものだけを選択

GlideRecord は毎回行全体を取得します。GlideQuery の .select() メソッドでは、必要なフィールドを正確に指定できます。大規模なテーブルでは、実際に使用するデータのみを転送するため、これは大きなパフォーマンス向上となります。

この .selectOne() メソッドは、Optional オブジェクトを返すことでさらに機能が向上しています。欠落しているレコードを処理するために if-else ブロックを記述する代わりに、 .orElse() メソッドをデフォルトオブジェクトとチェーンできます。よりクリーンで読みやすく、データが不足しているときにウィジェットがクラッシュするのを防ぎます。

 

プレーン JSON で挿入および更新

GlideRecord を使用してレコードを作成するということは、initialize() を呼び出し、次に各フィールドに対して setValue() を呼び出し、次に insert() を呼び出すことを意味します。GlideQuery を使用すると、JSON オブジェクトを直接 .insert() メソッドに直接渡します。これにより、10 行のコードが 2 行になります。ペイロードが JSON として到着する統合の場合、キーがテーブルのフィールド名と一致すれば、ペイロードをそのまま渡すことができるため、これは大幅な時間の節約になります。

更新も同様に機能します。単一レコードの更新にはsys_idが必要です (意図的に、偶発的な一括更新を防ぐために)。一括更新では、クエリと変更の JSON オブジェクトが受け入れられます。そして insertOrUpdate メソッドは、1 回のメソッド呼び出しで「アップサート」パターン (レコードが存在するかどうかを確認し、存在する場合は更新し、存在しない場合は作成) を処理します。

 

GlideAggregate を使用しない集計

ここで GlideQuery とは一線を画しています。GlideRecord では、アグリゲーションとは、別の GlideAggregate クラスに切り替えることを意味します。GlideQuery を使用すると、 .aggregate('COUNT') および .groupBy() を既存のクエリに直接チェーンできます。カテゴリごとにアクティブなインシデントをカウントする場合も、わずか 9 行のコードで、計算はレコードをメモリに取り込んで JavaScript でカウントするのではなく、データベースレベルで行われます。

このセッションでは、 .aggregate('AVG') を使用した平均計算(状態別にグループ化)と、ポータルウィジェットまたは REST API 応答に対応した構造化レポートオブジェクトをビルドする 2 次元グループ化の例 (優先度×ステータス) をすべて単一の Fluent チェーンで実現可能です。

 


この記事は機械翻訳されております。最新は元となる記事をご覧ください: https://www.servicenow.com/community/developer-advocate-blog/learn-efficient-scripting-with-glideque...。

免責事項: 一部の日本語は、翻訳ソフトウェアを使用してお客様の便宜のために翻訳されています。正確な翻訳をご提供できるよう相当な努力を払っておりますが、いかなる自動翻訳も人間の翻訳者に代わすることはなく、そのようなことは意図されておりません。翻訳は「現状のまま」提供されています。他言語への翻訳の的確性、信頼性または正確性については、明示または黙示を問わず、いかなる保証も行われません。翻訳ソフトには限界があるため、一部のコンテンツが正確に翻訳されていない場合があります。これらの資料の公用言語は英語です。翻訳の際に生じる相違または不一致は、コンプライアンスまたは履行の目的に関しては拘束力を有さず、法的効力はないものとします。

This article was machine translated and replicated from the original source: https://www.servicenow.com/community/developer-advocate-blog/learn-efficient-scripting-with-glideque...。