Variable Sets - make a field open if the user is part of a group
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
So here is the situation we have and what we are trying to do
I have a Variable Set - User Information
It has the following
Customer Name (reference to active users)
Manager - Customers Manager
Business Reason for Request
What we are trying to do
Manager should be read only, unless the person is part of a group that is allowed to select someone else to approve their request. We have some EA's that have multiple managers that might have to approve.
For the below
We made a group called SN-Multi Approvers, then I added myself to the group for testing.
I found this as a possible solution
- Navigate to Business Rules in the Application Navigator.
- Click New.
- Fill in the form:
- Name: A descriptive name (e.g., Set g_scratchpad for Group Membership).
- Table: Select the table where the variable set is used (e.g., sc_req_item, sc_task, or the specific table if used outside the catalog).
- Active: Checked.
- Advanced: Checked.
- When to run:
- When: Display
- In the Script field, add the following code, replacing 'YOUR_GROUP_NAME' with the actual name of the group:
(function executeRule(current, previous /*null when async*/) { // Check if the current user is a member of the specified group and store the result (true/false) in g_scratchpad g_scratchpad.isGroupMember = gs.getUser().isMemberOf('YOUR_GROUP_NAME'); })(current, previous);
- Save the Business Rule.
- Navigate to Catalog Client Scripts under Service Catalog > Catalog Administration in the Application Navigator.
- Click New.
- Fill in the form:
- Name: A descriptive name (e.g., Make Variable Read Only if Group Member).
- Applies to: A Variable Set
- Variable Set: Select the relevant variable set.
- UI Type: All (ensures it works in both the standard UI and Service Portal).
- Type: onLoad.
- In the Script field, add the following code, replacing 'your_variable_name' with the actual name of the variable you want to make read-only:
function onLoad() { // Check the value from the g_scratchpad set by the Business Rule if (g_scratchpad.isGroupMember == 'true') { // Make the variable read-only. // Use the 'variables.' prefix for variables within a variable set in the catalog environment g_form.setReadOnly('your_variable_name', true); // If you have multiple variables, you can set them individually: // g_form.setReadOnly('another_variable_name', true); } }
- Save the Catalog Client Script.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
Your logic is inverted and there are two ServiceNow-specific issues:
- Display Business Rules do NOT run for Service Catalog items
- Display Business Rules do not execute when loading a catalog item / record producer / variable set.
- Because of that, g_scratchpad is never populated your client script receives nothing.
- Your script makes the field read-only for group members
- But your requirement is the opposite:
- Default: Manager = Read-only
- Exception: Editable only for users in SN-Multi Approvers
Create a Catalog Client Script
Applies to: Variable Set
Type: onLoad
UI Type: All
function onLoad() {
// Default: Manager is read-only
g_form.setReadOnly('manager', true);
// If user is in the allowed group, make it editable
if (g_user.isMemberOf('SN-Multi Approvers')) {
g_form.setReadOnly('manager', false);
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
appreciate it
looks like it tries to load, but I get javascript error
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
Display Business rule don't run on catalog form
Use onLoad catalog client script + GlideAjax for this
Script Include: It should be client callable
var checkRecords = Class.create();
checkRecords.prototype = Object.extendsObject(AbstractAjaxProcessor, {
checkRecordPresent: function() {
var id = this.getParameter('sysparm_userID');
var gr = new GlideRecord('sys_user_grmember');
gr.addQuery('group.name', 'YOUR_GROUP_NAME'); // use group name here
gr.addQuery('user', id);
gr.query();
return gr.hasNext().toString();
},
type: 'checkRecords'
});
onChange catalog client script on Customer Name:
Applies to Catalog Item
UI Type - ALL
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
var ga = new GlideAjax('checkRecords');
ga.addParam('sysparm_name', "checkRecordPresent");
ga.addParam('sysparm_userID', newValue);
ga.getXMLAnswer(function(answer) {
if (answer == 'false') {
g_form.setReadOnly('another_variable_name', true);
} else {
g_form.setReadOnly('another_variable_name', false);
}
});
}
💡 If my response helped, please mark it as correct ✅ and close the thread 🔒— this helps future readers find the solution faster! 🙏
Ankur
✨ Certified Technical Architect || ✨ 10x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 weeks ago
Thanks
The second script I put in the variable set, the first script where do I create that?

