目次
結論
ServiceNow上のScoped ApplicationでUI Scriptを作成するときは以下のテンプレートに則って作成しましょう。 scope_name
はApplication(sys_scope)
レコードのScope(scope)
フィールドの値、scope_name
はそのUI Script(sys_ui_script)
レコードのScript Name(script_name)
フィールドの値に読み替えてください。
var scope_name = scope_name || {};
scope_name.script_name = (function () {
"use strict";
return {
// Write your methods here
};
})();
2025年1月2日(木)時点での情報です。また、本記事は以下のPDI環境で検証しています。
Property Name | Value |
---|---|
Build name | Xanadu |
Build tag | glide-xanadu-07-02-2024__patch1-08-24-2024 |
ことの発端
Global(global)
でないアプリケーションで、Service Portal用にAngularJSのModuleを作成すべくUI Script(sys_ui_script)
レコードを作成しました。ひとまずScript Name(script_name)
フィールドに値を入れ、保存しようとしました。
すると…
…はて?
エラー文を読み解くと、「スコープ(グローバルでない)UI Scriptの既定形式と合っていません」とのこと。
そんな形式は存じませんよ…?
調査
こういった入力値の検証(いわゆるバリデーションですね)をするのは大抵Client Script(sys_script_clinet)
のType(type)
フィールドがonSubmit(onSubmit)
のものだよな、と思って調べたらありました、このEnsure IIFE format
が諸悪の根源です1。
このClient Scriptでは、スコープアプリのUI Scriptは保存時にスクリプト(Script(script)
)の最初と最後が以下の文字列でない場合はおかしいフォーマットだとエラーダイアログが表示されるようになっています(scope_name
はApplication(sys_scope)
レコードのScope(scope)
フィールドの値、scope_name
はそのUI Script(sys_ui_script)
レコードのScript Name(script_name)
フィールドの値)。
// スクリプトの最初はこの文字列でなければならない
var scope_name = scope_name || {};
scope_name.script_name = (function () {
"use strict";
// スクリプトの最後はこの文字列でなければならない
})();
「スコープアプリではこの形式で書け」と言うのなら最初のテンプレートもこの形にしておくんなまし…!
いや、理屈はわかります。スコープ名のオブジェクトがほかでまだ定義されていなければからオブジェクトを作り、さもなくば既存のものを参照してスクリプト名のプロパティをStrictモードで実装してもらうべく即時関数で代入する値を算出させているのは…でもせめてエラー文に修正のヒントを入れておくれよ…!
まとめ
Scoped Application内でUI Scriptを作成・保存する場合は以下のテンプレートにしたがって実装することでエラーを回避できます。 許すまじServiceNow
var scope_name = scope_name || {};
scope_name.script_name = (function () {
"use strict";
return {
// Write your methods here
};
})();
-
内部でパターンに合っているかどうかを実際に判定しているのは
UI Script(sys_ui_script)
テーブルにあるValidate Client Script Functions
の中で定義してあるvalidateUIScriptIIFEPattern()
関数です。 ↩