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
相关产品推荐
相关产品推荐

