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

Bert_c1
Kilo Patron

Your script is incomplete, post the entire contents, include the Class. Your screenshot cuts off the value. Once you do that folks here can assist.

thanks updated

Your script is not updated, nor is the screenshot showing how you are referencing the script include. I assume the script include contains no Class. but your script is missing a closing "}" after the return statement.

 

Without the requested detail, we are guessing at what is wrong.

full code is there now