メインコンテンツへスキップ
見出し画像

Client ScriptとUI Policyの違い(フォーム挙動)


    ServiceNow のフォームを開くと、ある項目が突然「必須」になったり、グレーアウトして「読み取り専用」になったり、条件によって項目そのものが消えたりします。この「フォームがブラウザ側で動く」挙動を作っているのが、主に Client Script と UI Policy です。

    この記事では、フォーム挙動を機能論だけで説明しません。実際の sys_script_client(Client Script)と sys_ui_policy(UI Policy)を起点にします。UI Policy の動作1行ぶんを保存する sys_ui_policy_action(UI Policy Action)も含めて、両者が何を担い、どう違うのかを確認します。表示・必須・読み取りをどこで制御しているかも、PDI(Zurich)の OOTB で確認した実測値とともに示します。

    この記事は、ServiceNow の Incident は触ったことがある人を対象にしています。想定しているのは、フォームの裏側(Client Script と UI Policy のテーブル構造)をこれから理解したい人です。管理者・開発者が実機で確認するときに見るべき点は、両テーブルの位置づけと使い分けです。あわせて UI Policy Action の動作項目、Client Script の種別も確認します。

    この記事で分かること

    • フォームのブラウザ側挙動を担う2本柱が Client Script と UI Policy であること

    • UI Policy は「条件→動作」、Client Script は「JavaScript」という作り方の違い

    • UI Policy の動作が sys_ui_policy_action に1フィールド=1レコードとして保存されること

    • 表示/必須/読み取りが visible / mandatory / disabled で制御されること

    • Client Script の type(onLoad / onChange / onSubmit / onCellEdit)の違い

    • 実機で確認するときに見るべき一覧URL

    この記事の内容は ServiceNow の PDI(Personal Developer Instance)Zurich(ズーリッヒ)リリースの OOTB(初期設定)で確認した個人メモです。本番環境やカスタマイズ済み環境では、スクリプト・ポリシー・件数の内容が異なる場合があります。


    Client Script と UI Policy とは

    ServiceNow のフォームは、サーバから返ってきた後、ブラウザ側でも挙動を変えられます。「入力中に他の項目を自動で埋める」「ある条件で項目を必須にする」「使わない項目を隠す」といった動きが、サーバへ保存する前にブラウザ上で起きます。これを担う代表が Client Script と UI Policy です。

    • Client Script(sys_script_client) … フォーム上で動く JavaScript。値の計算・入力検証・他項目の自動入力など、ロジックを自由に書けます。

    • UI Policy(sys_ui_policy) … 「この条件のときに、この項目を表示/必須/読み取りにする」を、基本ノーコードで設定する仕組みです。その具体的な動作は UI Policy Action(sys_ui_policy_action)に分けて保存されます。

    どちらもブラウザ側(クライアントサイド)で動く点は共通ですが、「コードを書くか/条件と動作を設定するか」という作り方が違います。


    3つのテーブルの位置づけ

    Client Script・UI Policy・UI Policy Action は、いずれも業務データ(incident のようなレコード)ではありません。フォームの挙動を決める「設定(メタデータ)」を保存するテーブルです。


    画像

    今回確認した PDI(Zurich / OOTB)では、3テーブルとも sys_metadata(ラベル: Application File)を直接継承していました。それぞれの固有フィールド数は、sys_script_client が19、sys_ui_policy が23、sys_ui_policy_action が12 でした。

    UI Policy(sys_ui_policy)は「いつ動かすかの条件」を持ち、その「何をするか」は sys_ui_policy_action 側に ui_policy 参照でぶら下がります。 1つの UI Policy が複数フィールドを制御する場合、その数だけ UI Policy Action レコードが並びます。Client Script は逆に、動作を script 本文に直接書くため、別テーブルへは分かれません。

    テーブル定義は、次のURLで確認できます(先頭の <YourInstance> は自分のインスタンスに置き換えてください)。

    https://<YourInstance>/sys_db_object_list.do?sysparm_query=name=sys_script_client^ORname=sys_ui_policy^ORname=sys_ui_policy_action

    どう使い分けるか(Client Script vs UI Policy)

    実機でフォームに手を入れるとき、まず迷うのが「Client Script と UI Policy のどちらでやるか」です。大まかな向き不向きは次のとおりです。


    画像


    画像
    • UI Policy が向くこと … 項目の表示・必須・読み取りを、条件に応じて切り替えること。スクリプトを書かずに設定でき、条件が false に戻ったときの「逆適用」も reverse_if_false で自動化できます。

    • Client Script が向くこと … 値の計算・入力検証・他項目の自動入力・複雑な分岐など、ロジックが必要な処理です。type で実行タイミングを選びます。

    公式ドキュメントでも、表示・必須・読み取りのような単純な制御は UI Policy が推奨とされ、UI Policy はノーコードで多くの要件を満たせると説明されています。一方で、計算や検証のようなロジックは Client Script の領域です。なお UI Policy と Client Script は実行順序が関係する場面があり、公式に説明がありますが、本記事では実機での順序計測まではしていません(詳細は末尾の公式リンクを参照)。


    UI Policy の「動作」は UI Policy Action に保存される

    UI Policy の本体(sys_ui_policy)は「いつ動くか」を持ちます。「何をするか」は UI Policy Action(sys_ui_policy_action)に1フィールド=1レコードで保存されます。


    画像

    制御に使う3つの値

    UI Policy Action の主なフィールドは次のとおりです。中心になるのは visible(表示)/mandatory(必須)/disabled(読み取り専用) の3つです。


    画像

    visible / mandatory / disabled は3値(True / False / Leave alone)です。既定は「Leave alone(=触らない)」で、1つの Action は指定した項目だけを制御に反映し、それ以外は触りません。ほかに cleared(値をクリアするか)と field_message(項目の下に出す注意書き)というフィールドもあります。次の実機画面は、incident の priority を読み取り専用にする UI Policy Action です。Read only が True、Mandatory と Visible は Leave alone になっています。


    画像

    この Action の親 UI Policy が次の画面です。Table=Incident、Conditions(条件)と On load / Reverse if false などの設定を持ちます。「条件が成立したら priority を読み取り専用にする」という1つのまとまりです。


    画像

    スクリプトと値の自動設定もできる

    UI Policy 側には run_scripts(スクリプトを実行するか)、script_true / script_false(条件成立時/不成立時に実行するスクリプト)という項目もあります。UI Policy Action 側にも value / value_action(値を自動設定する)という項目があり、表示・必須・読み取りの切り替えだけでなく、値の設定やスクリプト実行までカバーできる作りです。

    UI Policy の一覧は、次のURLで確認できます。

    https://<YourInstance>/sys_ui_policy_list.do?sysparm_query=table=incident^active=true


    画像

    公式の Create a UI policy(Zurich) に、UI Policy で項目を表示・非表示・必須・読み取りにする手順と、条件(Conditions)・On load・Reverse if false の意味が説明されています。


    Client Script の種別(type)

    Client Script は、いつ動くかを type で選びます。今回確認した PDI(Zurich / OOTB)では、type の選択肢は次の4種でした。


    画像

    4つの type

    • onLoad … フォーム表示時に1回実行。初期表示の調整に使います。

    • onChange … 指定した field の値が変わったときに実行(フォーム読込時にも1回走ります)。対象フィールドを field で1つ指定します。

    • onSubmit … フォーム送信時に実行。保存前の入力検証などに使います。

    • onCellEdit … リストのセル編集時に実行。フォームではなくリスト用です。

    次の実機画面は、incident の onChange Client Script です。Type が onChange、Field name が Caller、そして Script に実際の JavaScript(onChange 関数)が書かれています。UI Policy と違い、動作はこの script 本文に直接書く点が見て取れます。ほかに applies_extended(拡張テーブルにも適用するか)という設定もあり、対象テーブルの子テーブルまで動作範囲を広げられる仕組みです。


    画像

    Client Script の一覧は、次のURLで確認できます。

    https://<YourInstance>/sys_script_client_list.do?sysparm_query=table=incident^active=true^ORDERBYtype


    画像

    公式の Client Scripts best practices(Zurich) に、Client Script の種別や書き方の注意点(重い処理を避ける等)がまとめられています。


    incident に紐づくフォーム挙動の実測

    実際に incident テーブルへ紐づく Client Script と UI Policy を数えると、フォーム挙動が複数の設定の積み重ねでできていることが分かります。


    画像

    incident での件数

    今回確認した PDI(Zurich / OOTB・active 中心・2026-06-21 確認)では、次の件数でした。

    • Client Script(incident)… 19件。内訳は onLoad 8 / onChange 10 / onSubmit 1 / onCellEdit 0 で、合計が19件と一致しました。うち global=true は15件です。

    • UI Policy(incident)… 15件。うち on_load=true が14件、reverse_if_false=true が13件でした。

    • UI Policy Action(incident の UI Policy に紐づくもの)… 38件(ui_policy.table=incident)。UI Policy 1件あたり平均で複数の Action を持つことが分かります。

    インスタンス全体で見ると

    参考として、インスタンス全体の件数も確認しました。Client Script(active)は約2,486件です。UI Policy(active)は約2,842件(うち global が2,791件)、UI Policy Action は全体で5,055件でした。UI Policy Action の内訳は、Read only(disabled=true)が940件です。Mandatory(mandatory=true)は785件、非表示(visible=false)は2,013件です。表示制御(隠す)が最も多く使われている傾向が見えます。

    ここで数えているのは、incident(基底)に直接紐づく設定です。 フォームの挙動は、これらに加えて Business Rule(サーバ側)や ACL(権限)なども関係します。Client Script と UI Policy だけで全挙動が決まるわけではありません。


    ServiceNow のフォーム挙動(Client Script / UI Policy)のポイント

    • フォームのブラウザ側挙動は、主に Client Script(JavaScript)と UI Policy(条件→動作) の2本柱でできています。どちらもクライアントサイドで動きますが、作り方が違います。

    • 表示・必須・読み取りのような単純な制御は UI Policy が向きます。計算・検証・自動入力のようなロジックは Client Script が向きます(公式も単純制御は UI Policy 推奨です)。

    • UI Policy の「何をするか」は sys_ui_policy_action に1フィールド=1レコードで保存されます。制御には visible / mandatory / disabled(既定は Leave alone)を使います。

    • Client Script は type(onLoad / onChange / onSubmit / onCellEdit)で実行タイミングを選びます。onChange は対象 field を1つ指定します。動作は script 本文に直接書きます。

    • 今回の PDI では、incident に Client Script 19件(onLoad 8 / onChange 10 / onSubmit 1)が紐づいていました。UI Policy は15件、UI Policy Action は38件です。フォーム挙動は複数設定の積み重ねです。

    フォームの挙動を調べるときは、まず「これは UI Policy の仕事か、Client Script の仕事か」を切り分けます。UI Policy なら sys_ui_policy → sys_ui_policy_action(visible/mandatory/disabled)を確認します。Client Script なら type と script を見ます。この順で確認すると整理しやすくなります。


    実機で気づいたこと

    気づいたことは3つあります。

    • UI Policy は表示・必須・読み取りをノーコードで切り替える仕組みだと思っていましたが、実機には run_scripts や script_true / script_false という項目もありました。条件が成立・不成立になったタイミングで JavaScript を実行できる作りで、UI Policy Action 側にも value / value_action という値を自動設定する項目があります。「UI Policy はノーコードで Client Script はコードを書く」という単純な線引きは、フィールド一覧を開くと崩れます。

    • sys_script_client のフィールド一覧に isolate_script という項目がありました。Client Script の実行環境を他の JavaScript から隔離するかどうかのフラグで、公式のベストプラクティスでもオンを推奨されている設定です。フォーム上は小さなチェックボックス1つですが、こういう重要な設定もフィールド一覧を見るまで気づきませんでした。

    • UI Policy Action の visible / mandatory / disabled が、どれも既定で Leave alone なのは理にかなっていると感じました。実機で priority を読み取り専用にする Action を見ると、Mandatory と Visible は触らず Read only だけを True にしています。複数の UI Policy が同じフィールドを触っても、指定していない制御まで巻き込まれない設計です。

    • sys_script_client のフィールドには messages(多言語対応のメッセージ定義)と sys_overrides(OOTBのどのレコードを上書きしているか)というものもありました。単なる JavaScript の置き場ではなく、国際化やカスタマイズ追跡まで意識したフィールドが用意されている点は、名前だけでは分かりませんでした。


    次に読むなら

    次回のテーマとして、次の3点を予定しています。

    • Client Script と UI Policy の実行順序(読込時・値変更時にどちらが先に走るか)

    • UI Policy の reverse_if_false が条件 false 時にどう逆適用するか

    • Catalog 側(Catalog Client Script / Catalog UI Policy)との違い

    特に「同じ項目を UI Policy でも Client Script でも触っているときに、最終的にどちらの指定が効くか」は、実環境のトラブルで頻出します。これらは本記事の「使い分け」「UI Policy Action」で触れた仕組みの先にあたり、別記事で扱う予定です。


    用語

    主な用語は6つです。

    • PDI:Personal Developer Instance(無料の検証用インスタンス)

    • OOTB:Out of the Box(初期設定のまま)

    • Client Script:フォーム上で動く JavaScript(sys_script_client)

    • UI Policy:条件に応じて項目の表示/必須/読み取りを切り替える設定(sys_ui_policy)

    • UI Policy Action:UI Policy の具体的な動作1行(sys_ui_policy_action)

    • Leave alone(ignore):UI Policy Action で「その制御は触らない」を表す既定値

    自分の環境で確認するときのURL

    先頭に自分のインスタンスを付けると、同じ画面が開けます。

    テーブル定義   : sys_db_object_list.do?sysparm_query=name=sys_script_client^ORname=sys_ui_policy^ORname=sys_ui_policy_action
    Client Script : sys_script_client_list.do?sysparm_query=table=incident^active=true^ORDERBYtype
    UI Policy      : sys_ui_policy_list.do?sysparm_query=table=incident^active=true
    UI Policy Action: sys_ui_policy_action_list.do?sysparm_query=ui_policy.table=incident
    固有フィールド  : sys_dictionary_list.do?sysparm_query=name=sys_ui_policy_action^elementISNOTEMPTY

    検証範囲とおことわり

    確認した範囲は次のとおりです。すべて PDI(Zurich / 2026-06-21 確認)の OOTB で取得しています。

    • 3テーブルの継承(いずれも sys_metadata=Application File 直下)

    • 固有フィールド数(sys_script_client 19 / sys_ui_policy 23 / sys_ui_policy_action 12)

    • Client Script の type(4種)

    • UI Policy / UI Policy Action の主要フィールドと visible/mandatory/disabled の値

    • incident に紐づく件数(type別内訳・global比率含む)

    • インスタンス全体の参考件数

    • スクショ対象レコードの実値

    確認していない範囲(断定しません)は次のとおりです。これらは別記事で扱います。

    • 各スクリプト本文の挙動

    • Client Script と UI Policy の厳密な実行順序(公式ドキュメントの記載のみ参照し、実機計測はしていません)

    • Catalog Client Script / Catalog UI Policy(カタログ側)

    • UI Builder / Service Portal 側のクライアントスクリプト

    • ドメイン分離環境での適用範囲

    今回は PDI の OOTB(初期設定)を前提に、フォーム挙動を担うテーブルの構造を確認しました。実環境では、既存のカスタマイズによってスクリプト・ポリシーの数・内容が変わります。

     
     
    ServiceNowのPDI(Personal Developer Instance)を実機で観察して、Noteに記事を書いています 実装・運用・教育の現場視点で淡々と記録中です リクエストがあればその記事も書きます 個人の観察日記です

    あなたへのおすすめ