ServiceNow のサーバーサイドスクリプト(Business RuleやScript Includeなど)を開発する際、current.isValidRecord() の使用は非常に重要です。このチェックを適切に行うことで、予期せぬランタイムエラーを防ぎ、データの整合性を保つことができます。
1. current.isValidRecord() とは?
current.isValidRecord() は単なるデータベース上の存在チェックではなく、現在の GlideRecord オブジェクトが**「有効なポインタ状態にあるか」を確認するための安全ガード(Safety Guard)**です。
- 戻り値: オブジェクトが有効なレコードを正しく指しており、アクセス可能な場合は
true、それ以外(存在しない、削除済み、権限不足、またはポインタが外れた状態)の場合はfalseを返します - 主な役割: null 参照や「未定義オブジェクトへのアクセス」による重大なスクリプトエラーを防ぎ、システム全体の堅牢性を高めます
2. 実は重要! false が返される4つのシナリオ
オブジェクトは初期化されていても、以下のようなケースではこのメソッドは false を返し、ポインタが無効であることを知らせます。
- 1. 不正確な sys_id: 存在しない
sys_idを指定してget()クエリを実行した場合 - 2. レコードセットの範囲外:
while(gr.next())ループが終了した後など、有効なレコードを指していないポインター状態にある場合 - 3. 削除済みレコード: ループなどの処理待ち時間中に、他のユーザーやプロセスによってそのレコードが既に削除されてしまった場合
- 4. 権限不足(ACLエラー): アクセス制御(ACL)のセキュリティルールにより、現在のユーザーがそのレコードを読み取る権限を持っていない場合
3. なぜ使うべきなのか?(実装のメリット)
- 致命的なエラーの防止: 無効な状態のオブジェクトに対してフィールド値の取得(例:
current.number)や更新(current.update())を行おうとするエラーを未然に防ぎます - データ整合性の確保: 確実に存在するレコードに対してのみロジックを進行させることで、不正なデータ処理や異常終了を回避します
4. 主な活用シーンと実装例
✅ ビジネスルール(Business Rules) before や after のタイミングで、複雑な更新ロジックを開始する前にレコードがまだ有効であることを確認します。
// スクリプトの入り口でレコードの有効なポインタ状態をチェック
if (current.isValidRecord()) {
// レコードが有効な場合のみ実行する安全な処理
gs.info("Processing valid record: " + current.number);
// 複雑なロジックをここに記述...
} else {
// レコードが無効な場合のエラーハンドリング
gs.warn("Record is no longer valid or accessible.");
}
✅ UI アクション(UI Actions) ユーザーがボタンをクリックした際、サーバー側で処理を継続する前にそのレコードが(裏側で)まだ存在しているかを確認します。
✅ スケジュール設定済みジョブ(Scheduled Jobs) 外部ソースから連携されたデータや大量のレコード群をバッチ処理する際、一つ一つのレコードを更新する直前に有効性をチェックします。
💡 補足:より確実なバリデーションのための代替手段
isValidRecord() に依存するだけでなく、以下の手法を組み合わせることでServiceNowのスクリプトはさらに堅牢になります。
- 特定フィールドのチェック: 単なるレコードの存在確認に加えて、
if (!current.short_description.nil())のように必須フィールドに値が入っているかを併せて確認します - ログ出力(Logging):
isValidRecord()がfalseを返した際にgs.error()等でログを残すことで、権限エラーなのかデータ欠落なのかの後追い調査(トラブルシューティング)を容易にします
まとめ
current.isValidRecord()は、データ操作を行う前に必ず挟むべき「ポインタの安全確認」ステップです- 特に、レコードの削除や複数ユーザーの非同期操作が絡む動的な処理においては、このメソッドによるチェックを標準化しましょう
- 単一のチェックに頼らず、フィールドバリデーションやログ出力を適切に組み合わせるのがプロフェッショナルなベストプラクティスです
一言まとめ: 👉 エラー知らずのスクリプトを書くために、処理の入り口では isValidRecord() で安全なポインタ状態か確認しよう!