Business rule to view records of those groups of which loggedin user is not member of

rishabh31
Mega Sage

Hello Community members,

I want to create a BR (client callable) for a custom dynamic filter option 'Not one of my Group', which displays only those records of which loggedin user is NOT a member of.

For this I tried below useful article (refer URL- 

@https://www.servicenow.com/community/in-other-news/2-steps-to-create-a-dynamic-filter-that-returns-groups-lo...

 

but not getting the desired results.

Requesting to please help with the BR scripting part to satisfy the above explained filter condition.

 

Will mark the desired response as helpful & accepted!

 

Thanks in Advance.

 

 

1 ACCEPTED SOLUTION

Okay, so you want it to be available as a dynamic filter,

Let's make some minor changes, to make it work, see example below.

 

 

Script include:

var MembershipUtil = Class.create();
MembershipUtil.prototype = Object.extendsObject(AbstractAjaxProcessor, {

	notMyGroups : function (){
		var notMemberOf = [];

		var groupGR = new GlideRecord('sys_user_group');
		groupGR.query();

		while (groupGR.next()){
			var memberGR = new GlideRecord('sys_user_grmember');
			memberGR.addEncodedQuery('user=' + gs.getUserID() + '^group=' + groupGR.getUniqueValue());
			memberGR.query();
			if (!memberGR.hasNext()){
				notMemberOf.push(groupGR.getUniqueValue());
			}
		}

		return notMemberOf;  // returns sysID of all groups which logged in user is not member of 	
	},
	
    type: 'MembershipUtil'
});

 

Dynamic filter:

dynamic-filter-not-my-groups.png

View solution in original post

7 REPLIES 7

OlaN
Giga Sage
Giga Sage

Hi,

Try something like this as a script include:

 

var MembershipUtil = Class.create();
MembershipUtil.prototype = Object.extendsObject(AbstractAjaxProcessor, {

	notMemberOf : function (userID){
		var notMemberOf = [];

		var groupGR = new GlideRecord('sys_user_group');
		groupGR.query();

		while (groupGR.next()){
			var memberGR = new GlideRecord('sys_user_grmember');
			memberGR.addEncodedQuery('user=' + userID + '^group=' + groupGR.getUniqueValue());
			memberGR.query();
			if (!memberGR.hasNext()){
				notMemberOf.push(groupGR.getUniqueValue());
			}
		}

		return notMemberOf.join(',');  // returns sysID of all groups which this user is not member of 	
	},
	
    type: 'MembershipUtil'
});

@OlaN, Sir or anyone can please check what's wrong here the script while testing on reports not working to provide either group names (Dispalys- 'All>Assignment group is (empty)') nor their associated records of which logged in user are not member of.

-Script include: (Client callable- true)

var MembershipUtil = Class.create();
MembershipUtil.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	
    notMemberOf: function(userID) {
        var notMemberOf = [];

        var groupGR = new GlideRecord('sys_user_group');
        groupGR.query();

        while (groupGR.next()) {
            var memberGR = new GlideRecord('sys_user_grmember');
            memberGR.addEncodedQuery('user=' + userID + '^group=' + groupGR.getUniqueValue());
            memberGR.query();
            if (!memberGR.hasNext()) {
                notMemberOf.push(groupGR.getUniqueValue());
            }
        }

        return notMemberOf.join(','); // returns sysID of all groups which this user is not member of 	
    },
    type: 'MembershipUtil'
});

 

-Dynamic filter Option to call above created script include

rishabh31_0-1676265242734.png

- Result:-

rishabh31_1-1676265790956.png

 

I checked with impersonating users also, and it does not provide any records for any users who are not a member of groups.

 

Requesting to please check & provide help.

 

Thanks in advance

 

 

Okay, so you want it to be available as a dynamic filter,

Let's make some minor changes, to make it work, see example below.

 

 

Script include:

var MembershipUtil = Class.create();
MembershipUtil.prototype = Object.extendsObject(AbstractAjaxProcessor, {

	notMyGroups : function (){
		var notMemberOf = [];

		var groupGR = new GlideRecord('sys_user_group');
		groupGR.query();

		while (groupGR.next()){
			var memberGR = new GlideRecord('sys_user_grmember');
			memberGR.addEncodedQuery('user=' + gs.getUserID() + '^group=' + groupGR.getUniqueValue());
			memberGR.query();
			if (!memberGR.hasNext()){
				notMemberOf.push(groupGR.getUniqueValue());
			}
		}

		return notMemberOf;  // returns sysID of all groups which logged in user is not member of 	
	},
	
    type: 'MembershipUtil'
});

 

Dynamic filter:

dynamic-filter-not-my-groups.png

Dear @OlaN sir thank you for getting this sorted, just a question I observe the changes but did not clearly understand why you made the changes as I am new to scripting, I marked your answer Helpful & accepted, if you can please help me understand why you make certain changes so results appeared, & where we use the earlier script (which you shared as your 1st response)