- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-03-2023 04:19 AM
I have the following fields in my catalog item :
1. Name of creator(name_of_creator) - Reference from custom user table
2. Creator Mail id(creator_mail_id) - single line text
3. Process(process) - single line text
4. Supervisor mail id(supervisor_mail_id) - single line text
and want to auto populate Creator Mail id, Process and Supervisor mail id onChange of Name of creator.
I am relatively new to ServiceNow. Please explain the method to do this in a way a fresher can understand.
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-03-2023 08:31 AM - edited 01-03-2023 08:31 AM
Hello @Aju Sam
You need to create a script include and catalog client script with type onChange.
You can use below script . (Tested on my PDI)
1)Catalog Client Script
function onChange(control, oldValue, newValue, isLoading) { if (isLoading || newValue == '') { return; } //fetch value of creator var creator = g_form.getValue('name_of_creator'); // call script include var userDetails = new GlideAjax('populateDetails'); // "populateDetails" name of script include userDetails.addParam('sysparm_name', 'details'); // "details" is the function name that present in script include userDetails.addParam('sysparm_userSelaected', creator); userDetails.getXMLAnswer(function(response) { var userObj = JSON.parse(response); g_form.setValue('creator_mail_id', userObj.grMail); g_form.setValue('supervisor_mail_id', userObj.grSupervisorMail); g_form.setValue('process', userObj.grProcess); }); }
2) Script Include
var populateDetails = Class.create(); populateDetails.prototype = Object.extendsObject(AbstractAjaxProcessor, { details: function() { var userObj = {}; // fetch creator email , process and supervisor mail from user table(you need to use yout custome table name) var gr = new GlideRecord('sys_user'); if (gr.get(this.getParameter('sysparm_userSelaected'))) { // for below lines use backend names of email , and process fields of custom table userObj.grMail = gr.email.getDisplayValue(); userObj.grProcess = gr.process.getDisplayValue(); userObj.grSupervisorMail = gr.manager.email.getDisplayValue(); } return JSON.stringify(userObj); }, type: 'populateDetails' });
@Aju Sam Let me know if any queries.
Please mark this as correct answer/accepted and helpful if it resolved, or mark this helpful if this help you to reach towards solution.
Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-03-2023 08:31 AM - edited 01-03-2023 08:31 AM
Hello @Aju Sam
You need to create a script include and catalog client script with type onChange.
You can use below script . (Tested on my PDI)
1)Catalog Client Script
function onChange(control, oldValue, newValue, isLoading) { if (isLoading || newValue == '') { return; } //fetch value of creator var creator = g_form.getValue('name_of_creator'); // call script include var userDetails = new GlideAjax('populateDetails'); // "populateDetails" name of script include userDetails.addParam('sysparm_name', 'details'); // "details" is the function name that present in script include userDetails.addParam('sysparm_userSelaected', creator); userDetails.getXMLAnswer(function(response) { var userObj = JSON.parse(response); g_form.setValue('creator_mail_id', userObj.grMail); g_form.setValue('supervisor_mail_id', userObj.grSupervisorMail); g_form.setValue('process', userObj.grProcess); }); }
2) Script Include
var populateDetails = Class.create(); populateDetails.prototype = Object.extendsObject(AbstractAjaxProcessor, { details: function() { var userObj = {}; // fetch creator email , process and supervisor mail from user table(you need to use yout custome table name) var gr = new GlideRecord('sys_user'); if (gr.get(this.getParameter('sysparm_userSelaected'))) { // for below lines use backend names of email , and process fields of custom table userObj.grMail = gr.email.getDisplayValue(); userObj.grProcess = gr.process.getDisplayValue(); userObj.grSupervisorMail = gr.manager.email.getDisplayValue(); } return JSON.stringify(userObj); }, type: 'populateDetails' });
@Aju Sam Let me know if any queries.
Please mark this as correct answer/accepted and helpful if it resolved, or mark this helpful if this help you to reach towards solution.
Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-23-2025 05:26 AM
🎯 Goal:
When a user selects a Name of creator, you want to automatically fill:
Creator Mail ID
Process
Supervisor Mail ID
🧱 Step-by-Step Guide:
✅ Step 1: Identify Field Names
Make sure your variable names in the catalog item exactly match:
name_of_creator (reference to custom user table)
creator_mail_id (single line text)
process (single line text)
supervisor_mail_id (single line text)
✅ Step 2: Add a Catalog Client Script
Open your catalog item in Maintain Items (sc_cat_item).
Scroll down to the "Catalog Client Scripts" related list.
Click New to create a new client script.
Fill it out like this:
Name: Auto-populate fields from creator
Type: onChange
Variable name: name_of_creator
UI Type: All
Paste this into the script field:
function onChange(control, oldValue, newValue, isLoading) { if (isLoading || newValue == '') { return; } // Use GlideAjax to call a Script Include that fetches user details var ga = new GlideAjax('GetCreatorDetails'); ga.addParam('sysparm_name', 'getDetails'); ga.addParam('sysparm_user_sysid', newValue); ga.getXMLAnswer(function(response) { var result = JSON.parse(response); g_form.setValue('creator_mail_id', result.email); g_form.setValue('process', result.process); g_form.setValue('supervisor_mail_id', result.supervisor_email); }); }
✅ Step 3: Create a Script Include to Fetch Data
Go to System Definition → Script Includes.
Click New, and configure it as:
Name: GetCreatorDetails
Client Callable: ✅ Checked
Accessible from: All Application Scopes
Paste this code:
var GetCreatorDetails = Class.create(); GetCreatorDetails.prototype = Object.extendsObject(AbstractAjaxProcessor, { getDetails: function() { var userSysId = this.getParameter('sysparm_user_sysid'); var userGR = new GlideRecord('your_custom_user_table'); // Replace with actual table name if (userGR.get(userSysId)) { var result = { email: userGR.getValue('email'), process: userGR.getValue('process'), supervisor_email: userGR.getValue('supervisor_email') }; return JSON.stringify(result); } return JSON.stringify({}); } });
Important: Replace 'your_custom_user_table' with the actual name of your custom user table.
🔄 How It Works:
When user picks a name from the name_of_creator field…
The onChange client script sends a request to the Script Include with the selected user’s sys_id.
The Script Include looks up the user and returns the needed fields.
The script then fills those values into the catalog item fields.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-01-2025 11:03 PM
@Aju Sam Please accept my solution and mark it as helpful, if it was found useful.
Thanks and regards
Nitya Bansal
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-01-2025 11:21 PM
@Aju Sam :
I know this would be too late for your use, but can be used for future RPs, if this feature is not already known.
@nityabans27 : We should propose, low code / No code options as much as possible. I know we eat, breathe, sleep...code 🙂
I strongly recommend to use Auto populate feature which got introduced with Utah rather than going through scripting and reducing the technical debt.
There is this amazing article by @Mark Roethof that explains this feature
Auto-populate a variable based on a reference type variable (Utah)