ベストプラクティス:カスタムスクリプトで GlideRecord 変数名として「gr」を使用することが常に得策ではない理由Issue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } インスタンス内のあらゆるスクリプトで予期しない動作が発生する可能性があります。 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } Cause<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } ServiceNow インスタンスのスクリプト、公式ドキュメントの例、コミュニティフォーラム、その他の場所、そしてもちろんこれらのソースを学習した AI などで、変数名として「gr」が使用されているのを目にすることは非常に一般的です。例: var gr = new GlideRecord('incident'); これは得策ではありません。 プラットフォームは Javascript で、多くのコードがグローバル変数スコープで実行されます。 あるビジネスルールで定義された「gr」が、たまたま同じ更新やトランザクションの一部として実行されている他のスクリプトで定義された別の「gr」を上書きする可能性があります。 一方の「gr」をまったく関係のない別の「gr」に置き換えると、スクリプトはその「gr」が定義されたものであるとみなし、それ以降の行を実行し続けます。 スクリプトがクエリ結果を返さなかったり、スクリプトでクエリしたばかりのレコードとは異なるテーブルからのレコードを更新したりする可能性があります。 それは明らかに深刻な影響を与える可能性があります。 実例: お客様のインシデントで、ワークフロー内のスクリプトからインシデントテーブルの単純な gr.get(); クエリを実行したにもかかわらず、要求されたアイテムテーブルが実際には知らないうちにクエリされていたために、レコードが返されませんでした。 これは、同じトランザクションで実行されているリンクされた関連レコードに対して実行された Requested Item クエリビジネスルールが、sc_req_item テーブルに対してたまたま「gr」を使用していたためでした。ワークフロー内のカスタムスクリプトは、レコードが返されたと想定しましたが、実際には確認していませんでした。これは gr.assigned_to 値を使用しましたが、null であり、実際の値があるかどうかを確認していませんでした。「null」の結果は、通知のためのユーザーテーブルに対する別のクエリに使用され、その結果、社内のすべての従業員がメールを受信することになりました。 これは、大きな問題です。 この種の状況では、どの他のコードが自分のコードを破壊しているかをデバッグして把握することもほぼ不可能です。完全なトランザクションの一部として実行されているすべてを考慮に入れる必要があるためです。すべての値を再確認するために、コードに多くの gs.info() メッセージを追加することになります。 Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } 一般的な優れた javascript コーディングの実践により、これらの問題のほとんどを避けることができます。 たとえば、スクリプトが別の gr を上書きすることを避けるために、スクリプトを関数でラップする方法があります。新しいビジネスルールと計算フィールドのほとんどで、関数内の変数を保護するためにコードをラップするデフォルトのスクリプトが追加されているのはこのためですが、古いビジネスルールを含むほとんどのスクリプトでは要求されません。 優れたコーディング手法に、コードを関数でラップするというものがあります。常にこれを行ってください。 スクリプト内で複数の GlideRecord を使用する場合、誤って gr 名を再利用する可能性があります。ベストプラクティスは、次の例に示すように使用するテーブルに関連した独自の変数名を使用し、決して「gr」を使用しないことです。 function updateOpenIncidents() { var openIncidentGr = new GlideRecord('incident'); .... } updateOpenIncidents(); // runs the above function 絶対にしないということを覚えておくだけで、このような問題が起こる可能性を減らすことができます。 Related Links<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } これはなにも「gr」に限ったことではありません。どこでも for ループカウンタとして「i」を使用すると、遅かれ早かれ問題を引き起こすことになります。ループが早く終了したり、無限ループが発生するなどの症状が考えられます。 このプラットフォームには予約済みの名前があり、これも answer、current、previous など、独自の変数として使用しないでください。 この原因に直接関連する問題チケット: PRB1320166 MID サーバーのビジネスルール「プローブ - すべての MID」が、グローバルスコープの javascript 変数を上書きから保護していない (MID サーバーが誤って DOWN として報告される)PRB612498 スクリプトと計算ディクショナリーフィールドで「answer」変数 (または他の同じ変数名) を使用すると、スクリプトの「answer」変数が計算されたフィールド値で上書きされるPRB1351676 ハードウェアカタログに公開すると、publish_to_product_catalog UI ページ処理スクリプトのグローバルスコープの「gr」が原因で、「レコードが見つかりません」にリダイレクトされるPRB1508005 MID 環境キャッシュをクリアするビジネスルールがグローバル変数スコープで変数名「gr」を使用しているため、変数が上書きしたり/上書きされたり、cmdb_ci_ip_address レコードの更新が中断されたりするリスクがある