【ServiceNow】修復スクリプト(fix script)の基本

こんにちは
SCSKの庄司です。

今回はServiceNowの修復スクリプト(Fix Script)について紹介していきます。

本記事は執筆時点(2025年9月)の情報になります。最新の内容は製品ドキュメントを参考にしてください。

修復スクリプト(Fix Script)とは

Fix Script は、アプリのインストール/アップグレード後に走らせて、データや設定の補正・初期化・移行を行うためのサーバサイド JavaScript です。
更新セットやアプリ更新だけでは反映しきれない、

  • 既存データの補正
  • 特定条件のデータの作成・更新

など、大量のデータを一回のみ、自動更新・作成することに向いています。
逆に「任意タイミングで複数回実行するスクリプト」や「定期的なスクリプト実行」はスケジュール済みジョブなどが適しているので、そちらの利用を検討してください。

修復スクリプトレコードはsys_script_fixテーブルに格納されており、すべて > システム定義 > 修復スクリプト から遷移可能です。

 

修復スクリプトレコードのオプション  

  • 読み込み不能:チェックをするとスクリプト実行時に顧客アップデートレコードを作成する。必要に応じて顧客アップデートレコードを更新セットに格納し、移送することも可能に。
  • ロールバック用に記録:ロールバック用にスクリプトの実行を記録し、必要に応じて元に戻すことが可能になる。
  • :アプリのインストールまたはアップグレード前にスクリプトを実行することができる。

 

実行前の注意事項

  • 事前検証:本番前に開発環境やPDIでテスト
  • ロールバックを有効化:ロールバック用に記録にチェックをしてから実行
  • バックアップ:更新対象のレコードを事前にCSVエクスポート
  • 負荷配慮:業務時間帯の実施は環境に負荷を与えるため控える(特に大量のレコードを更新する場合)

 

修復スクリプトの実践

では、ここからは簡単な修復スクリプトを実際に使ってみようと思います。

すべて > システム定義 > 修復スクリプトに遷移し、[新規]を押下します。

今回は以下の条件で実施します。

  • 読み込み不能:true
  • ロールバック用に記録:true
  • :false

以下のスクリプトを記載します。
指定したカタログ配下にあるアクティブなすべてのカタログアイテムに対して、「利用可能」のユーザー基準を作成するスクリプトです。

// ===== 設定 =====
var catalogSysId = '742ce428d7211100f2d224837e61036d'; // 本番対象カタログ sys_id
var userCriteriaSysId = '322f2efa83bb6210b7e5f9a6feaad35d'; // 付与する User Criteria の sys_id
// =================

// 対象アイテムを取得
var grItem = new GlideRecord('sc_cat_item');

// カタログ配下の全アイテム
grItem.addQuery('sc_catalogs', catalogSysId);
gs.info('=== カタログ ' + catalogSysId + ' 配下のアイテムすべて ===');
grItem.addQuery('active', true);
grItem.query();

var count = 0;
while (grItem.next()) {
    // 既存レコードの重複チェック
    var grCheck = new GlideRecord('sc_cat_item_user_criteria_mtom');
    grCheck.addQuery('sc_cat_item', grItem.sys_id);
    grCheck.addQuery('user_criteria', userCriteriaSysId);
    grCheck.query();

    if (!grCheck.hasNext()) {
        var grNew = new GlideRecord('sc_cat_item_user_criteria_mtom');
        grNew.initialize();
        grNew.setValue('sc_cat_item', grItem.sys_id);
        grNew.setValue('user_criteria', userCriteriaSysId);
        grNew.insert();
        count++;
        gs.info('ユーザー基準を追加: ' + grItem.name);
    } else {
        gs.info('すでに存在: ' + grItem.name);
    }
}

gs.info('合計 ' + count + ' 件のレコードを作成しました。');

今回の対象となるユーザー基準とカタログは以下になります。

ユーザー基準:fix script test user criteria

カタログ:Technical Catalog

利用可能なカタログアイテムテーブルとロールバックコンテキストテーブルに該当するレコードが存在しないことを確認します。

では、[スクリプト修復の実行]を押下し、今回は[続行]を押下します。

   

修復スクリプトが実行され、ログが表示されています。
今回はスクリプト内で記載していたため、ユーザー基準を追加したカタログアイテム名と合計レコード作成数がログに表示されています。

では、実行結果を確認しに行きます。

まず、利用可能なカタログアイテムテーブルを見ると実際に6レコード分のレコードが作成されています。

次に、今回は「読み込み不能」をtrueにしているので顧客アップデートテーブルも確認しに行きます。
先ほど作成したレコードの顧客アップデートレコードが作成されています。
 

必要に応じてこちらのレコードを顧客アップデートレコードに追加することで、別環境に移送することが出来ます。

今回は「ロールバック用に記録」もtrueにしているのでロールバックコンテキストテーブルにもレコードが作成されています。

ロールバックコンテキストレコードを開くと、「ロールバックレコード」関連リストに今回のスクリプト実行に際して作成されたレコード(sc_cat_item_user_criteria_mtomレコード、sys_update_xmlレコード、sys_update_versionレコードsys_metadata_customizationレコード)が紐づけられています。 

せっかくなので、今回はロールバックまで実行してみようと思います。
[ロールバック]関連リンクを押下すると、「Execute Rollback?」というポップアップが表示されるので、「yes」と入力し、[OK]を押下します。

ロールバックが完了しました。

先ほどと同じ条件で利用可能なカタログアイテムテーブル、顧客アップデートテーブルを確認すると、レコードが表示されません。  

 

まとめ

以上、今回はServiceNowの修復スクリプト(fix script)を紹介しました。
あまり使う機会はないかもしれませんが、特定のシチュエーションでは大きく力を発揮する機能です。

ぜひ参考にしてみてください。

著者について
庄司をフォローする

クラウドに強いによるエンジニアブログです。

SCSKでは、自社クラウドと3大メガクラウドの強みを活かし、ハイブリッドクラウド/マルチクラウドのソリューションを展開しています。業界の深い理解をもとに、お客様の業務要件に最適なアーキテクチャをご提案いたします。サービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。

ServiceNowクラウド
シェアする
タイトルとURLをコピーしました