ServiceNow Workspace中UI Action调用GlideAjax返回undefined问题排查
ServiceNow作用域应用GlideAjax调用报错问题解决
需求
检查记录是否关联附件,若存在附件则允许用户停用记录;若无附件,则向用户展示错误提示。
问题情况
在作用域应用中运行以下Workspace客户端脚本,点击按钮时触发错误:
错误信息
Unhandled exception in GlideAjax. undefined
Workspace客户端脚本
function onClick(g_form) { // 检查是否存在附件 checkAttachments(g_form.getUniqueValue(), function(attachmentCount) { attachmentCount = parseInt(attachmentCount); if (attachmentCount > 0) { // 若存在附件,确认停用操作 var msg = getMessage('停用政策后,关联的政策确认活动将被取消,部分控制目标会被停用,相关控制项也将被停用。确定要继续吗?'); g_modal.confirm(getMessage('确认'), msg).then( function onSuccess() { g_form.submit('policy_retire'); } ); } else { // 若无附件,展示警告信息 g_form.addErrorMessage("停用政策前请添加附件。"); } }); return false; } function checkAttachments(sysId, callback) { var ga = new GlideAjax('CheckAttachmentsAjax'); ga.addParam('sysparm_name', 'checkAttachments'); ga.addParam('sysparm_sysid', sysId); ga.getXML(function(response) { var attachmentCount = parseInt(response.responseXML.documentElement.getAttribute("answer")); callback(attachmentCount); }); }
脚本包含(Script Include)
var CheckAttachmentsAjax = Class.create(); CheckAttachmentsAjax.prototype = Object.extendsObject(global.AbstractAjaxProcessor, { checkAttachments: function() { var sysId = this.getParameter('sysparm_sysid'); var attachmentGR = new GlideRecord('sys_attachment'); attachmentGR.addQuery('table_name', 'sn_compliance_policy'); attachmentGR.addQuery('table_sys_id', sysId); attachmentGR.query(); var attachmentCount = attachmentGR.getRowCount(); return attachmentCount; }, type: 'CheckAttachmentsAjax' });
问题排查与修复方案
出现Unhandled exception in GlideAjax. undefined错误,核心原因是作用域应用中GlideAjax调用存在配置或权限问题,按以下步骤修复:
配置脚本包含的可访问性
- 打开
CheckAttachmentsAjax脚本包含表单,确保客户端可调用选项已勾选,否则客户端无法发起调用。 - 若脚本包含在自定义作用域中,需确认可访问的作用域设置包含当前Workspace应用所在的作用域,或直接将脚本包含设置为全局作用域(业务允许的情况下)。
- 打开
添加作用域前缀到GlideAjax调用
在作用域应用中,调用自定义脚本必须指定作用域前缀,修改checkAttachments函数中的GlideAjax实例化代码:// 将[你的作用域前缀]替换为实际的作用域标识(如x_custom_policy) var ga = new GlideAjax('[你的作用域前缀].CheckAttachmentsAjax');确保表访问权限
在当前作用域的权限设置中,为sys_attachment表添加读取权限,否则脚本包含中的GlideRecord查询会因权限不足失败。添加错误捕获逻辑
- 在脚本包含中添加异常捕获,便于排查问题:
checkAttachments: function() { try { var sysId = this.getParameter('sysparm_sysid'); var attachmentGR = new GlideRecord('sys_attachment'); attachmentGR.addQuery('table_name', 'sn_compliance_policy'); attachmentGR.addQuery('table_sys_id', sysId); attachmentGR.query(); return attachmentGR.getRowCount(); } catch (e) { gs.error('CheckAttachmentsAjax执行错误: ' + e.message); return 0; } } - 在客户端脚本的GlideAjax调用中添加错误回调:
ga.getXML(function(response) { var attachmentCount = parseInt(response.responseXML.documentElement.getAttribute("answer")); callback(attachmentCount); }, function(error) { g_form.addErrorMessage('检查附件时出现错误,请稍后重试。'); gs.error('GlideAjax请求错误: ' + error); });
- 在脚本包含中添加异常捕获,便于排查问题:
内容的提问来源于stack exchange,提问作者Morris
相关产品推荐
相关产品推荐

