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

ServiceNow Service Portal如何在GlideRecord中正确使用current.sys_id查询

问题根因

你遇到的报错核心原因是:Service Portal Widget的服务器脚本上下文不存在current对象。current对象仅在业务规则、UI Action、平台原生记录绑定类脚本场景中可用,Widget脚本无法直接调用该对象获取当前审批记录ID。

解决方案

步骤1:前端传递审批记录ID到后端

在Widget的客户端脚本触发同意/驳回操作时,将当前渲染的审批项sys_id作为参数随请求一并传给服务器:

// 客户端脚本示例:触发同意操作
$scope.handleAccept = function(approvalSysId) {
    $scope.server.get({
        action: 'acceptApproval',
        approval_sys_id: approvalSysId
    }).then(function() {
        // 补充操作成功后的列表刷新、提示逻辑即可
    });
}

步骤2:修正服务端查询逻辑

服务端直接从input对象读取前端传递的参数,替换原有的current.sys_id即可,无需使用$sp.getParameter()(该方法仅用于读取URL查询参数,不适用于Widget内部异步请求的传参读取)。

修正后的完整服务端代码如下:

//Accept Request
if(input && input.action=="acceptApproval" && input.approval_sys_id) {
    var inRec1 = new GlideRecord('sysapproval_approver');
    inRec1.addQuery('state', 'requested');
    inRec1.addQuery('sys_id', input.approval_sys_id);
    inRec1.query();
    if(inRec1.next()) {
        // 新增权限校验,避免越权操作
        if(inRec1.approver == gs.getUserID() || gs.hasRole('approval_admin')) {
            // 注意state字段存储值为小写approved,原代码的首字母大写是显示值,存储会失效
            inRec1.setValue('state', 'approved');
            inRec1.update();
            gs.addInfoMessage("Accept Approval Processed");
        } else {
            gs.addErrorMessage("无权限操作该审批记录");
        }
    } else {
        gs.addErrorMessage("未找到对应待审批记录");
    }
}
补充注意事项
  • 若你的业务场景是需要拉取当前页面关联单据的所有审批(比如打开某张需求单页面展示它的审批项),才需要使用$sp.getParameter('sys_id')读取URL上的单据ID,再通过addQuery('sysapproval', 单据ID)筛选关联的审批记录
  • 建议始终保留权限校验逻辑,避免用户越权修改不属于自己的审批记录
  • 操作sysapproval_approver的state字段时,务必使用系统存储值:requested/approved/rejected,不要使用界面显示的首字母大写值,会导致状态更新失败

内容的提问来源于stack exchange,提问作者artvader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:45:03