Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Running a script include in a sysID filter

ServNowDev
Tera Guru

I am trying to return all approvals for a specific Catalog Item, i have the script working but i want to run when you select on a module in the navigation. 

 

Here is my script: 

var approvalTest = Class.create();
approvalTest.prototype = Object.extendsObject(AbstractAjaxProcessor, {

populateApprovals: function() {
        var approvals = [];
        var grApprovals = new GlideRecord('sysapproval_approver');
        grApprovals.addQuery('state', 'requested');
        grApprovals.query();

        while (grApprovals.next()) {
            var grRitm = new GlideRecord('sc_req_item');
            grRitm.addQuery('active', true);
            grRitm.addQuery('sys_id', grApprovals.sysapproval);
            grRitm.query();
            if (grRitm.next()) {
                approvals.push(grApprovals.getUniqueValue());

            }

        }
        return approvals.join(',');

    },





    type: 'approvalTest'
});

 

here is the filter but it returns null , is there a way to run javascript via a filter,

ServNowDev_0-1760987248426.png

 

 

here is the module setup:

 

ServNowDev_0-1760986342324.png

 

1 ACCEPTED SOLUTION

lauri457
Giga Sage

Check the sys_property glide.script.use.sandbox on your instance, you need to make the SI either client callable or sandbox enabled for the script to work in a list filter.  

 

Also you are doing nested queries in your script, for every row of approvals your script does a query for a matching ritm. Here are two alternative ways to achieve your result in a more performant way. Either adding a join sub query or by adding dot walked conditions.

 

var approvalSysids = []
var itemApprovalGr = new GlideRecord("sysapproval_approver");
itemApprovalGr.addQuery("state", "requested");
itemApprovalGr.addJoinQuery("sc_req_item", "sysapproval", "sys_id")
	.addCondition("active", true)
	//.addCondition("cat_item", [item sysid]);
itemApprovalGr.query()
while (itemApprovalGr.next()) {
	approvalSysids.push(itemApprovalGr.getUniqueValue())
}
var approvalSysids = []
var itemApprovalGr = new GlideRecord("sysapproval_approver");
itemApprovalGr.addQuery("state", "requested")
	.addCondition("sysapproval.sys_class_name", "sc_req_item")
	.addCondition("sysapproval.active", true)
	//.addCondition(""sysapproval.ref_sc_req_item.cat_item"", [item sysid]);
itemApprovalGr.query()
while (itemApprovalGr.next()) {
	approvalSysids.push(itemApprovalGr.getUniqueValue())
}

 

 Note the significantly lower sql count and response time that can be achieved using above logic instead.

lauri457_0-1761003285892.png

 

View solution in original post

7 REPLIES 7

looks good, seems you need to debug the script logic. and review lauri457 response, make sure you're returning a comma separated list of sys_ids.

lauri457
Giga Sage

Check the sys_property glide.script.use.sandbox on your instance, you need to make the SI either client callable or sandbox enabled for the script to work in a list filter.  

 

Also you are doing nested queries in your script, for every row of approvals your script does a query for a matching ritm. Here are two alternative ways to achieve your result in a more performant way. Either adding a join sub query or by adding dot walked conditions.

 

var approvalSysids = []
var itemApprovalGr = new GlideRecord("sysapproval_approver");
itemApprovalGr.addQuery("state", "requested");
itemApprovalGr.addJoinQuery("sc_req_item", "sysapproval", "sys_id")
	.addCondition("active", true)
	//.addCondition("cat_item", [item sysid]);
itemApprovalGr.query()
while (itemApprovalGr.next()) {
	approvalSysids.push(itemApprovalGr.getUniqueValue())
}
var approvalSysids = []
var itemApprovalGr = new GlideRecord("sysapproval_approver");
itemApprovalGr.addQuery("state", "requested")
	.addCondition("sysapproval.sys_class_name", "sc_req_item")
	.addCondition("sysapproval.active", true)
	//.addCondition(""sysapproval.ref_sc_req_item.cat_item"", [item sysid]);
itemApprovalGr.query()
while (itemApprovalGr.next()) {
	approvalSysids.push(itemApprovalGr.getUniqueValue())
}

 

 Note the significantly lower sql count and response time that can be achieved using above logic instead.

lauri457_0-1761003285892.png

 

Ankur Bawiskar
Tera Patron
Tera Patron

@ServNowDev 

there are lot of OOTB left nav modules which call script include.

check those and modify yours one as per that

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader