ServiceNow 传统脚本(ServiceNow Legacy Scripting)使用 GlideRecord API 进行服务端数据访问,用 Script Include 类封装可复用的服务端逻辑,用 Business Rules 实现服务端自动化,用 g_form/g_user/g_list 进行客户端表单操作。本技能用于生成和审查此类脚本。
用途
- 生成 GlideRecord 查询与增删改查操作
- 生成 Script Include 类
- 生成客户端脚本(Client Script)
- 用于 Business Rules、Scheduled Jobs、服务端逻辑与客户端表单操作
- 审查已有 ServiceNow 脚本中的常见问题
参考文件
技能说明强调按需读取参考文件,不要在会话开始时预加载全部参考。路径相对于技能根目录(即包含 SKILL.md 的目录)。
- references/gliderecord.md:在生成或审查 GlideRecord 查询、CRUD 操作或 addQuery/getValue 模式时读取
- references/server-side.md:在生成 Script Include、Business Rules 或使用 GlideSystem(gs.*)日志时读取
- references/client-side.md:在生成使用 g_form、g_user 或 g_list 的客户端脚本,或进行任何客户端表单操作时读取
- references/gotchas.md:在生成或审查任何 ServiceNow 脚本之前读取,用于检查幻觉陷阱
脚本
- scripts/validate-script.sh:在部署前校验 ServiceNow 脚本文件是否存在常见问题
示例
示例仅作为结构模板使用,只读取与目标类型匹配的示例,不要预加载全部:
- assets/examples/gliderecord-crud.js:演示完整的 GlideRecord CREATE、READ(单条与多条)、UPDATE、DELETE,以及正确的 getValue() 用法
- assets/examples/script-include-class.js:演示使用 Class.create() 模式的 Script Include,包含 initialize()、工具方法与 type 属性
- assets/examples/client-script-gform.js:演示客户端脚本 onLoad/onChange 处理函数,使用 g_form.getValue()、g_form.setMandatory()、g_user.hasRole()
硬性规则
- 当存在 ServiceNow Fluent SDK 时,绝不使用 GlideRecord。如果工作区包含 now.config.json、.now.ts 文件,或从 @servicenow/sdk/core 导入,则开发者使用的是 Fluent SDK 应用,应停止并转向提示:"I can see you're working in a Fluent SDK project. Use the sn-sdk-fluent skill to generate typed metadata definitions instead of GlideRecord scripts. GlideRecord is the legacy scripting API and does not work inside Fluent SDK .now.ts files."
- GlideRecord 仅限服务端,绝不在客户端脚本中生成 GlideRecord,应使用 GlideAjax。
- 始终先调用 query() 再调用 next();没有 gr.query() 的 while(gr.next()) 永远不会执行。
- 在循环中使用 getValue();gr.field_name 返回指针,gr.getValue('field_name') 返回字符串值。
- 只使用有文档的 API 方法,不要发明 gr.getField()、gr.setQuery()、gr.addOrder() 之类的方法。
按任务类型的行为
生成时
- 首先检查 Fluent SDK 信号(硬性规则 1);若检测到,立即转向,不生成 GlideRecord 代码
- 判断脚本上下文:服务端(Business Rule、Script Include)还是客户端(Client Script)
- 服务端:读取 references/gliderecord.md 获取 CRUD 模式,读取 references/server-side.md 获取 Script Include 结构与 Business Rule 上下文变量
- 客户端:读取 references/client-side.md 获取 g_form/g_user/g_list API;绝不在客户端脚本中生成 GlideRecord(硬性规则 2)
- 使用 assets/examples/ 中的示例文件作为可用模板
审查时
- 检查硬性规则 3 和 4:next() 之前是否有 query(),循环中是否使用 getValue()
- 确认客户端代码中没有 GlideRecord(硬性规则 2)
- 确认没有发明的方法,与 references/gliderecord.md 中有文档的 API 对照(硬性规则 5)
- 运行 scripts/validate-script.sh <file>,检查客户端脚本中的 GlideRecord、裸 setAbortAction 以及 g_form 误用
解释时
- 将开发者引导到相关参考文件以查看详细方法文档
- 对于 Fluent SDK 相关问题,转向 sn-sdk-fluent 技能
适用场景与限制
适用于 ServiceNow 传统脚本的生成、审查与解释,涵盖服务端与客户端脚本。不适用于 Fluent SDK 项目;在检测到 Fluent SDK 信号时必须转向 sn-sdk-fluent 技能。技能的官方收费、价格、平台支持与效果等信息暂未提供。