The CreatorCon Call for Content is officially open! Get started here.

Show choice list option only to certain dept/groups and for rest user remove that option.

HanisahR
Tera Contributor

Hi all, so I have this task whereby in a select box choice options. The variable name of that select box for example is 'Service Request' and in there have 5 options. For option 1, 2 & 3 only users belonging to a certain department or certain groups get to see these options. If user not belonging to those exact department/groups they cannot see those options thereby only see option 4 & 5 only. I have tried in the script include and client script, but it's not working. Please help and assist me to get this to work. Much appreciated, thanks!

SCRIPT INCLUDE

var checkUserGroupDept = Class.create();
checkUserGroupDept.prototype = {
    initialize: function() {},

	getUserGroupDept: function() {
		var userId = this.getParameter('sysparm_requester_name');
		var userGR = new GlideRecord('sys_user');
		userGR.addQuery('sys_id',userId);
		gr.query();

		if(userGR.get(userSysId)) {
			var deptName = userGR.getDisplayValue('department');
			if (deptName == 'Department A' || deptName == 'Department B') {
				return true;
			}

			var gm = new GlideRecord('sys_user_grmember');
			gm.addQuery('user',userSysId);
			gm.query();
			while (gm.next()) {
				var grpName = gm.group.name.toString();
				if (grpName == 'Group 1' || grpName == 'Group 2') {
					return true;
				}
			}

			return false;
		}



	},

    type: 'checkUserGroupDept'
};
CLIENT SCRIPT

function onLoad() {
    var ga = new GlideAjax('checkUserGroupDept');
	ga.addParam('sysparm_name','getUserGroupDept');
	ga.addParam('sysparm_userId', g_user.userID);
	ga.getXMLAnswer(hideOption);

	function hideOption(response){
		var answer = response.responseXML.documentElement.getAttribute("answer");
		if (answer == 'false'){
			g_form.removeOption('service_request','option_1);
			g_form.removeOption('service_request','option_2);

		}
	}
}

 

1 ACCEPTED SOLUTION

HanisahR
Tera Contributor

Found out that these scripts worked. Would like to thank everyone who contributed to replying to this question, much appreciated!

SCRIPT INCLUDE // Client callable true, application Global

var checkUserGroupDept = Class.create();
checkUserGroupDept.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getGroupDept: function() {
        var userID = this.getParameter('sysparm_sysid');
        var userGR = new GlideRecord('sys_user');
        if (userGR.get(userID)) {
            var dept = userGR.getValue('department');
 
            var inGroup = false;
            var groupUser = new GlideRecord('sys_user_grmember');
            groupUser.addQuery('group', 'sysid1'); // sysid group1
			groupUser.addQuery('group', 'sysid2'); // sysid group2
            groupUser.query();
            while (groupUser.next()) {
                if (groupUser.user == userID) {
                    inGroup = true;
                    break;
                }
            }
 
            // Check if user is NOT in group OR department is NOT dept1 or dept2
            if (!inGroup && (dept !== 'dept1' && dept !== 'dept2)) { // sysid dept1, dept2
                return 'true';
            }
        }
        return 'false';
    }
});

 ^^ For some reason the if condition works when && is used instead of ||

CLIENT SCRIPT
function onLoad() {
    // get current user's sys_id
    var sysid = g_user.userID;

    // call Script Include via GlideAjax
    var ga = new GlideAjax('checkUserGroupDept'); // Script Include name
    ga.addParam('sysparm_name', 'getGroupDept'); // Function name in Script Include
    ga.addParam('sysparm_sysid', sysid); // pass user sys_id
    ga.getXMLAnswer(parseResponse);

    function parseResponse(answer) {
        if (answer == 'true') {
            g_form.removeOption('service_request', 'value_option1', 'Name Option1');
			g_form.removeOption('service_request', 'value_option2', 'Name Option2');
			g_form.removeOption('service_request', 'value_option3', 'Name Option3');
        }
    }
}

 

View solution in original post

9 REPLIES 9

Hi @HanisahR ,
 

If the options are still accessible, here are a few things to check:

Choice values  
g_form.removeOption() uses the Value field, not the Label. Double-check the variable’s option values in the catalog item. 

Client-callable 
Ensure your Script Include is marked as
Client Callable. 

Debug the return 
Add
gs.info(answer); in your client script to confirm you’re actually getting "true" / "false". 

Verify variable name 
Make sure the variable is really called
service_request in the catalog item (case-sensitive). 

If the log shows "false" but the options don’t disappear, it’s almost always a mismatch between the option value you’re passing and what’s configured on the variable. 

 

Thanks & Regards,  
Muhammad Iftikhar  


If my response helped, please mark it as the accepted solution so others can benefit as well. 

Zuhaib
Tera Contributor

There is no variable defined as userSysId in your script include.

 

	if(userGR.get(userSysId)) {

 

Harmeet2Singh
Tera Expert
g_form.removeOption('choices field name', 'VALUE_TO_REMOVE');

your value, option 1 is not in quotes.

 

next issue I can find is your are returning false, while checking answer == 'false', it should be answer == false.

Dinesh Patel
Tera Contributor

Step-by-Step Solution1. Identify User's Department or GroupFetch the current user's department or group with the platform's user context (often via session variable, API, or a profile data resource).Use fields like current.user.department or the roles/groups array as your identifier�.2. Filter the Select Box Options DynamicallyDefine all options for 'Service Request'.Tag each option with allowed departments/groups.Use a client script or dynamic dropdown data filter to conditionally display options.Example implementation:const userDept = getUserDepartment(); // fetch from session or data binding
const allOptions = [
{ label: 'Option 1', value: '1', allowedDept: ['HR', 'Finance'] },
{ label: 'Option 2', value: '2', allowedDept: ['HR', 'Finance'] },
{ label: 'Option 3', value: '3', allowedDept: ['HR'] },
{ label: 'Option 4', value: '4', allowedDept: ['All'] },
{ label: 'Option 5', value: '5', allowedDept: ['All'] }
];
const visibleOptions = allOptions.filter(
option => option.allowedDept.includes(userDept) || option.allowedDept.includes('All')
);
// Bind visibleOptions to your select box componentIn ServiceNow, you may also use:g_form.removeOption('service_request', '1');
g_form.removeOption('service_request', '2');
g_form.removeOption('service_request', '3');Only if the user's department doesn't match the allowed ones�.3. Remove Option for Other UsersOn page load or relevant form event, execute the filtering logic to ensure only authorized users see Options 1, 2, and 3�.The remaining users only see Option 4 and 5.Important NotesThis logic works for both UI Builder record pages or catalog item forms if integrated via client script or via a data resource in the dropdown component�.For catalog items, similar control can be enforced with Catalog Client Scripts in ServiceNow.

--------------------------------------------------------------------------------------------------------------------------------------------------
If my response solves your query, please marked helpful by selecting Accept as Solution and Helpful. Let me know if anything else is required.

Thanks,
Dinesh Patel

HanisahR
Tera Contributor

Found out that these scripts worked. Would like to thank everyone who contributed to replying to this question, much appreciated!

SCRIPT INCLUDE // Client callable true, application Global

var checkUserGroupDept = Class.create();
checkUserGroupDept.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getGroupDept: function() {
        var userID = this.getParameter('sysparm_sysid');
        var userGR = new GlideRecord('sys_user');
        if (userGR.get(userID)) {
            var dept = userGR.getValue('department');
 
            var inGroup = false;
            var groupUser = new GlideRecord('sys_user_grmember');
            groupUser.addQuery('group', 'sysid1'); // sysid group1
			groupUser.addQuery('group', 'sysid2'); // sysid group2
            groupUser.query();
            while (groupUser.next()) {
                if (groupUser.user == userID) {
                    inGroup = true;
                    break;
                }
            }
 
            // Check if user is NOT in group OR department is NOT dept1 or dept2
            if (!inGroup && (dept !== 'dept1' && dept !== 'dept2)) { // sysid dept1, dept2
                return 'true';
            }
        }
        return 'false';
    }
});

 ^^ For some reason the if condition works when && is used instead of ||

CLIENT SCRIPT
function onLoad() {
    // get current user's sys_id
    var sysid = g_user.userID;

    // call Script Include via GlideAjax
    var ga = new GlideAjax('checkUserGroupDept'); // Script Include name
    ga.addParam('sysparm_name', 'getGroupDept'); // Function name in Script Include
    ga.addParam('sysparm_sysid', sysid); // pass user sys_id
    ga.getXMLAnswer(parseResponse);

    function parseResponse(answer) {
        if (answer == 'true') {
            g_form.removeOption('service_request', 'value_option1', 'Name Option1');
			g_form.removeOption('service_request', 'value_option2', 'Name Option2');
			g_form.removeOption('service_request', 'value_option3', 'Name Option3');
        }
    }
}