Script to check if a group has only one user and the user is a given user

Karthick Nagara
Tera Expert

Hi ,

Looking for suggestions to improve this script.

I have a requirement to know if a group has only one member in it and that member is a Requested by user.

For this, I created the below script include which is taking userID & GroupID as inputs and checks if the given user is the only available member of the group.

Any suggestions to achieve this without using a GlideRecord inside GlideAggregate...

	isUser_the_OnlyMember: function(userID,groupID)
	{

	var grCheckMemCount = new GlideAggregate('sys_user_grmember');
	grCheckMemCount.addQuery('group', groupID);
    grCheckMemCount.addQuery('user.active',true);
	grCheckMemCount.addAggregate('COUNT');
    grCheckMemCount.query();

	if(grCheckMemCount.next()) 
    {
		if(grCheckMemCount.getAggregate('COUNT') == 1)
		{

		 gs.print("Group has only one member");
//Creating a GlideRecord since Im not able access any value of grCheckMemCount after the getAggregate.
			var grUserIsOnlyMem = new GlideRecord('sys_user_grmember');
			grUserIsOnlyMem.addQuery('group',groupID);
			
			grUserIsOnlyMem.query();

			if(grUserIsOnlyMem.next())	
			{
				if(grUserIsOnlyMem.user == userID)
				return true;
				else
				{return false;}		
			}	
		}
		else{
			return false;
		}
	}
1 ACCEPTED SOLUTION

Hi,

got it

then the only way is what you mentioned OR the other approach I mentioned

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

View solution in original post

6 REPLIES 6

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

another option

isUser_the_OnlyMember: function(userID,groupID)
{

	var grUserIsOnlyMem = new GlideRecord('sys_user_grmember');
	grUserIsOnlyMem.addQuery('group',groupID);
	grUserIsOnlyMem.addQuery('user.active',true);
	grUserIsOnlyMem.query();
	var totalCount = grUserIsOnlyMem.getRowCount();
	var flag;
	// if count is 0 or more than 1 member
	if(totalCount > 1 || totalCount == 0){
		flag = false;
	}
	else if(totalCount == 1){
		grUserIsOnlyMem.next();
		if(grUserIsOnlyMem.user == userID)
			flag = true;
		else
			flag = false;
	}

	return flag;

},

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Thanks Ankur. I avoided getRowCount() as it is not recommended. Wont it impact the performance of script especially if a group has many members like 1000s?

Hi,

try this and no need of GlideRecord

isUser_the_OnlyMember: function(userID,groupID)
{
	var grCheckMemCount = new GlideAggregate('sys_user_grmember');
	grCheckMemCount.addAggregate('count');
	grCheckMemCount.orderByAggregate('count');
	grCheckMemCount.groupBy('user'); 
	grCheckMemCount.addQuery('group', groupID);
	grCheckMemCount.addQuery('user.active',true);
	grCheckMemCount.query();
	if(grCheckMemCount.next()) 
	{
		if(grCheckMemCount.getAggregate('COUNT') == 1)
		{
			var user = grCheckMemCount.user;
			if(user == userID)
				return true;
			else
			{return false;}		
		}	
	}
	else{
		return false;
	}
}

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

This fails for the below given scenario,

Group ID : A group abc having more than one member

UserID: First available member of the group abc

 

Grouping by USER is making the below condition true all time

grCheckMemCount.getAggregate('COUNT') == 1

Aggregate object will have one record for each user in the group