You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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调用存在配置或权限问题,按以下步骤修复:

  1. 配置脚本包含的可访问性

    • 打开CheckAttachmentsAjax脚本包含表单,确保客户端可调用选项已勾选,否则客户端无法发起调用。
    • 若脚本包含在自定义作用域中,需确认可访问的作用域设置包含当前Workspace应用所在的作用域,或直接将脚本包含设置为全局作用域(业务允许的情况下)。
  2. 添加作用域前缀到GlideAjax调用
    在作用域应用中,调用自定义脚本必须指定作用域前缀,修改checkAttachments函数中的GlideAjax实例化代码:

    // 将[你的作用域前缀]替换为实际的作用域标识(如x_custom_policy)
    var ga = new GlideAjax('[你的作用域前缀].CheckAttachmentsAjax');
    
  3. 确保表访问权限
    在当前作用域的权限设置中,为sys_attachment表添加读取权限,否则脚本包含中的GlideRecord查询会因权限不足失败。

  4. 添加错误捕获逻辑

    • 在脚本包含中添加异常捕获,便于排查问题:
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:17:16