一覧へ戻る
ITSM

ServiceNow における GlideRecord.initialize() と GlideRecord.newRecord() の理解と使い分け

ServiceNow のサーバーサイドスクリプトにおいて、新しいレコードをデータベースに作成する際に必ずと言っていいほど使用するのが initialize()newRecord() の2つのメソッドです。どちらも「新しいレコードを準備する」ための関数ですが、その内部動作には大きな違いが存在します。

予期せぬスクリプトエラーを防ぎ、プラットフォームの自動化機能を最大限に活用するために、これら 2 つのメソッドの決定的な違いと使い分けについて解説します。

1. 新規レコード作成プロセスの基本

GlideRecord を使ってテーブルに新しいデータを「挿入(Insert)」する前には、対象オブジェクトの初期準備を行う必要があります。

このとき、newRecord() は辞書設定(Dictionary)・各種ポリシー・Business Rule を含むプラットフォームの標準レイヤーを適用した上でレコードを生成するのに対し、initialize() はそれらを一切適用しない低レベルな空オブジェクト生成メソッドです。

この決定的なアーキテクチャの違いにより、「デフォルト値をシステムに自動適用させるか」と「固有の sys_id をいつ発行させるか」という挙動面に大きな差が生まれます。

2. 2つのアプローチの挙動の違い

✅ GlideRecord.initialize() の特徴

  • 動作: メモリ上に「完全に空(まっさら)」の低レベルなレコードを作成します
  • デフォルト値: 呼び出した直後では、テーブル辞書に設定されたデフォルト値(初期値)は一切適用されません
  • sys_id: まだ割り当てられておらず、実際にデータを insert() してデータベースに書き込まれる瞬間に初めて発行されます
  • 用途: システムのデフォルト値に左右されず、プログラム制御下で全てのフィールド値を完全にゼロから設定したい場合に適しています

✅ GlideRecord.newRecord() の特徴(最も推奨)

  • 動作: プラットフォームの標準レイヤーを通した高水準なレコードを作成します
  • デフォルト値: 呼び出した瞬間に、辞書設定等で定義されたデフォルト値(緊急度やステータスなど)が自動的にフィールドにセットされます
  • sys_id: 呼び出しと同時に即座に sys_id が割り振られます(データベースに保存される前でも sys_id を先んじて知ることができます)
  • 用途: GUIから手動で[新規作成]ボタンを押した時と同じ自然な挙動を再現できるため、最も推奨される一般的な手法です

3. なぜ使い分けるのか?(実装のメリット)

  • データの一貫性の確保: newRecord() を使うことで、システムの初期設定を漏れなく引き継げるため、意図しない「空のフィールド」が生まれるのを防げます。
  • 開発効率の向上: initialize() では必須フィールドを全てスクリプトで手動セットしなければなりませんが、newRecord() ならデフォルト値が既に埋まっているため、変更点だけを書けばよくコードが短くなります。

4. 主な活用シーンと実装例

📋 initialize() を使用する場合(外部システムからの取り込みなど) 外部データを取り込む際、予期せぬデフォルト値が勝手に入力されるのを防ぎ、送られてきた生データだけでレコードを構築したい場合に有効です。

var gr = new GlideRecord('incident');
gr.initialize(); // いかなる標準レイヤーも通さず空で初期化

gr.short_description = '外部システムからの自動アラート';
// デフォルト値が勝手に入力されないため、全値を明示的に指定する必要がある
gr.caller_id = 'system_integration_user';
gr.insert(); // このタイミングで初めて sys_id が確定する

📋 newRecord() を使用する場合 (ServiceNow推奨スタイル) 通常の業務ロジックで新しいレコードを作成する場合に最適です。

var gr = new GlideRecord('incident');
gr.newRecord(); // デフォルト値がセットされ、sys_id もこの時点で確定する

// sys_idが既に発行されているため、保存前でも番号(Number)やIDが確認可能
gs.info('新規採番された番号: ' + gr.number); 

gr.short_description = 'スクリプトによる障害報告'; // 差分だけを指定
gr.insert();

⚠️ 注意点:別テーブルとの紐付け(依存関係)問題

initialize()insert() されるまで sys_id が未定です。もし、「レコードを保存(insert)する前に、先にそのレコードの sys_id を使って添付ファイルや関連タスクを作りたい」という要件がある場合は、絶対に newRecord() を使用する必要があります。これを間違えると、親レコードがどのIDになるかわからず関連付けに失敗する重大なスクリプトエラーの原因となります。

まとめ

  • initialize() は、プラットフォーム設定を意図的に無視して**「空の状態から手動作成」**したい時の低レベルメソッド
  • newRecord() は、**「標準の設定を適用し、即座に sys_id を確保」**したい時に使うベストプラクティス
  • 特殊な要件がない限り、ServiceNow のプラットフォーム機能(標準レイヤー)を最大限に活かせる newRecord() を優先して使用しましょう

一言まとめ: 👉 プラットフォームの「標準処理」を利用するなら newRecord()、完全に「自由」に制御したいなら initialize() を選ぼう!