logo

NJP

Mastering Script Includes and GlideAjax: Real-World Scenarios & Interview Use Cases

New article articles in ServiceNow Community · Aug 23, 2026 · article

Hello everyone,

 

Today, I’m going to write an article about  Script Includes and GlideAjax. I know there are already several articles available on Script Includes and GlideAjax, but I want this one to be a little different.

 

I’m not going to cover the basics, such as what a Script Include is, its different types, or how to call one Instead, I’ll focus mainly on practical and unique use cases that developers can apply in real-time projects.

 

I’ll also cover scenarios that can be helpful when preparing for ServiceNow developer interviews, especially because GlideAjax and Script Includes are among the topics that are frequently asked during interviews.

 

So, let’s get started!

 

1]How to Return an Array from script include?

==>

Script Include:

var ReturnArrayScriptInclude = Class.create(); ReturnArrayScriptInclude.prototype = Object.extendsObject(AbstractAjaxProcessor, { AssetDeatils: function() { var arr = []; var caller = this.getParameter('sysparm_caller'); var GrAsset = new GlideRecord('alm_asset'); GrAsset.addQuery('assigned_to', caller); GrAsset.query(); while (GrAsset.next()) { arr.push(GrAsset.display_name.toString()); } return JSON.stringify(arr);//no need to use JSON Stringify }, type: 'ReturnArrayScriptInclude' });

Client Script:

function onChange(control, oldValue, newValue, isLoading, isTemplate) { if (isLoading || newValue === '') { return; } var ga = new GlideAjax('global.ReturnArrayScriptInclude'); ga.addParam("sysparm_name", "AssetDeatils"); ga.addParam("sysparm_caller", newValue); ga.getXMLAnswer(getDetails); function getDetails(response) { var answer = response; //["Logitech Logitech Desktop Optical Wireless Mouse","Logitech Logitech Desktop Keyboard","P1000597 - Apple MacBook Pro 15\"","P1000178 - Sony VAIO SA Series","P1000690 - Apple MacBook Air 13\"","P1000488 - Apple MacBook Pro 15\""] var asset = JSON.parse(answer); g_form.setValue("description", asset[1]);//i want asset of index 1 only } }

 

2]Check attachment size of incident before submission it should be less than  1MB.if it's greater than 1MB abort form submission:(getXMLWait will cover here).

==>

Script Include:

var getXMLAnswer_Check_Attachement_Size = Class.create(); getXMLAnswer_Check_Attachement_Size.prototype = Object.extendsObject(AbstractAjaxProcessor, { checkSize: function() { var cat_id = this.getParameter('sysparm_sys_id'); var gr = new GlideRecord('sys_attachment'); gr.addQuery("table_sys_id", cat_id); gr.query(); var flag; var totalSize = 0; if (gr.next()) { totalSize = parseInt(gr.size_bytes); totalSize = (totalSize / Math.pow(1024, 2)).toFixed(2) * 1; if (totalSize > 1) { return false; } else { return true; } } }, type: 'getXMLAnswer_Check_Attachement_Size' });

 

 Client Script:

function onSubmit() { var sys_id = g_form.getUniqueValue(); alert(sys_id); var ga = new GlideAjax('global.getXMLAnswer_Check_Attachement_Size'); ga.addParam('sysparm_name', 'checkSize'); ga.addParam('sysparm_sys_id', sys_id); ga.getXMLWait(); //getAnswer we can only use in getXMLWait()sync call. if(ga.getAnswer().toString() == "false") { return false; } }

 

3]Check whether the caller is a contractor or a full-time employee. If the caller is a contractor, they should not be allowed to submit the request. To achieve this during form submission, we need to use getXMLWait() and getAnswer().

==>

Script include:

var GetXMLwaitScriptInclude = Class.create(); GetXMLwaitScriptInclude.prototype = Object.extendsObject(AbstractAjaxProcessor, { getfullTimeEmployee:function() { var gr=new GlideRecord('sys_user'); gr.addQuery('sys_id',this.getParameter('sysparm_user_name')); gr.query(); if(gr.next()) { return gr.u_contractor; } }, type: 'GetXMLwaitScriptInclude' });

 

Client Script:

function onSubmit() { var ga = new GlideAjax('global.GetXMLwaitScriptInclude'); ga.addParam('sysparm_name','getfullTimeEmployee'); ga.addParam('sysparm_user_name',g_form.getValue('caller_id')); ga.getXMLWait(); var answer=ga.getAnswer(); if(answer=="true")//true means caller is contractor so he can not submit request. { alert("Abort Form Submission"); return false; } }

 

4]Return caller details as a string from a Script Include. This scenario demonstrates how to return a string and use the split() function

==>

Script Include:

var ReturnStringScriptinclude = Class.create(); ReturnStringScriptinclude.prototype = Object.extendsObject(AbstractAjaxProcessor, { getUserDetails:function() { var user=this.getParameter("sysparm_user"); var gr=new GlideRecord('sys_user'); gr.addQuery("sys_id",user); gr.query(); if(gr.next()) { return gr.first_name+","+gr.last_name+","+gr.manager; } }, type: 'ReturnStringScriptinclude' });

 

Client Script:

function onChange(control, oldValue, newValue, isLoading, isTemplate) { if (isLoading || newValue === '') { return; } var caller=g_form.getValue("caller_id"); var ga=new GlideAjax("global.ReturnStringScriptinclude"); ga.addParam("sysparm_name","getUserDetails"); ga.addParam("sysparm_user",caller); ga.getXML(getDetails); function getDetails(response) { var serverResponse=response.responseXML.documentElement.getAttribute("answer"); var result=serverResponse.split(","); g_form.setValue("assigned_to",result[2]); } }

 

5]Pass multiple values from a Script Include to a Business Rule.

==>

Script Include:

var Pass_multiple_values = Class.create(); Pass_multiple_values.prototype = { initialize: function() {}, AssetDeatils: function(caller) { var arr = []; var caller_id = caller; // var caller = this.getParameter('sysparm_caller'); var GrAsset = new GlideRecord('alm_asset'); GrAsset.addQuery('assigned_to', caller_id); GrAsset.query(); while (GrAsset.next()) { arr.push(GrAsset.display_name.toString()); } return JSON.stringify(arr); }, type: 'Pass_multiple_values' };

 

Use any Business Rule:

(function executeRule(current, previous /*null when async*/) { var obj=new global.Pass_multiple_values(); var data=obj.AssetDeatils(current.caller_id); gs.addErrorMessage(data); var parsed_data=JSON.parse(data);//array gs.addInfoMessage(parsed_data[0]); })(current, previous);

 

6]Without Stringify method return Array using split and join function.

==>

Script Include:

var Pass_multiple_values = Class.create(); Pass_multiple_values.prototype = { initialize: function() {}, AssetDeatils: function(caller) { var arr = []; var caller_id = caller; // var caller = this.getParameter('sysparm_caller'); var GrAsset = new GlideRecord('alm_asset'); GrAsset.addQuery('assigned_to', caller_id); GrAsset.query(); while (GrAsset.next()) { arr.push(GrAsset.display_name.toString()); } // return JSON.stringify(arr); return arr.join(','); }, type: 'Pass_multiple_values' };

 

Business Rule Any:

(function executeRule(current, previous /*null when async*/) { var obj=new global.Pass_multiple_values(); var data=obj.AssetDeatils(current.caller_id); gs.addErrorMessage(data); var parsed_data=data.split(','); gs.addInfoMessage(parsed_data[0]); })(current, previous);

 

7]Return an Array Without Using JSON.stringify(), split(), or join().

==>

Script Include:

var Pass_multiple_values = Class.create(); Pass_multiple_values.prototype = { initialize: function() {}, AssetDeatils: function(caller) { var arr = []; var caller_id = caller; // var caller = this.getParameter('sysparm_caller'); var GrAsset = new GlideRecord('alm_asset'); GrAsset.addQuery('assigned_to', caller_id); GrAsset.query(); while (GrAsset.next()) { arr.push(GrAsset.display_name.toString()); } // return JSON.stringify(arr); return arr; }, type: 'Pass_multiple_values' };

 

Business Rule Any:

==>

(function executeRule(current, previous /*null when async*/) { var obj=new global.Pass_multiple_values(); var data=obj.AssetDeatils(current.caller_id); //gs.addErrorMessage(data); var parsed_data=data; gs.addInfoMessage(parsed_data[0]); gs.addInfoMessage(parsed_data[1]); })(current, previous);

 

8]Return JSON Array from script Include to client script

==>

Script include:

var CallerIncidents = Class.create(); CallerIncidents.prototype = Object.extendsObject(AbstractAjaxProcessor, { getCallersIncs: function() { var incArray = []; // Create an empty array var callersRecords = new GlideRecord('incident'); callersRecords.addQuery('caller_id', this.getParameter('sysparm_callerID')); callersRecords.query(); while (callersRecords.next()) { // Build the array of objects var incDetails = {}; incDetails.number = callersRecords.number.toString(); incDetails.priority = callersRecords.priority.getDisplayValue(); incDetails.shortDesc = callersRecords.short_description.toString(); incArray.push(incDetails); } // Convert the array to JSON and return it return JSON.stringify(incArray); }, type: 'CallerIncidents' });

 

Script Include:

// Create a GlideAjax object and call the Script Include var incGA = new GlideAjax('CallerIncidents'); incGA.addParam('sysparm_name', 'getCallersIncs'); incGA.addParam('sysparm_callerID', g_form.getValue('caller_id')); incGA.getXMLAnswer(CallerIncidentsParse); function CallerIncidentsParse(response) { // Convert JSON response into a JavaScript object var myObj = JSON.parse(response); g_form.addInfoMessage('User has raised the following incidents:'); for (var i = 0; i < myObj.length; i++) { g_form.addInfoMessage( myObj[i].number + ': ' + myObj[i].shortDesc ); } }

 

Q.9]If the priority changes to P1, display all incident numbers and short descriptions for incidents with P1 priority.

Script Include:

var P1Incidents = Class.create(); P1Incidents.prototype = Object.extendsObject(AbstractAjaxProcessor, { getP1IncidentList: function() { var incArray = []; var callersRecords = new GlideRecord('incident'); callersRecords.addQuery('priority', '1'); callersRecords.query(); while (callersRecords.next()) { var incDetails = {}; incDetails.number = callersRecords.number.toString(); incDetails.priority = callersRecords.priority.getDisplayValue(); incDetails.shortDesc = callersRecords.short_description.toString(); incArray.push(incDetails); } return JSON.stringify(incArray); } });

 

Client Script:Onchange of P1

function onChange(control, oldValue, newValue, isLoading, isTemplate) { if (isLoading || newValue === '') { return; } var ga = new GlideAjax('P1Incidents'); ga.addParam('sysparm_name', 'getP1IncidentList'); ga.getXMLAnswer(function(response) { alert(response); var incidents = JSON.parse(response); alert(incidents); for (var i = 0; i < incidents.length; i++) { var inc = incidents[i]; g_form.addErrorMessage(incidents[i]); g_form.addErrorMessage("Number: " + inc.number); g_form.addErrorMessage("Priority: " + inc.priority); g_form.addErrorMessage("Short Description: " + inc.shortDesc); } }); }

 

If you enjoyed this ServiceNow content and found it helpful, feel free to connect with me on LinkedIn.

Hit the helpful button if you liked it or found it helpful. Bookmark it for further updates!

Stay tuned for more insights, tips, and tutorials on mastering ServiceNow.

Regards,

Abhijeet Pawar.

 

View original source

https://www.servicenow.com/community/itsm-articles/mastering-script-includes-and-glideajax-real-world-scenarios-amp/ta-p/3590211