Get all users, who are part of the requester's groups

Harsha Pappala
Kilo Sage

Hello guys,

For a catalog request, i want to update all the incidents. Where assigned or caller is a user who is part of requester's group/groups. 

Using below script to get the information. But it is very time taking, as i have to parse multiple incidents.

Could anybody suggest me a better way to do this

var sg = new GlideRecord('sys_user_grmember');
sg.addQuery('user', requester);
sg.query();
var group_list = [];
var num = sg.getRowCount();
while (sg.next()) {
gs.info('groups found' + num);
group_list.push(sg.group);
}

for (var j = 0; j < group_list.length; j++) {

var users = [];
var grp = new GlideRecord('sys_user_grmember');
grp.addQuery('group', group_list[j]);
grp.query();

while (grp.next()) {
users.push(grp.user);
gs.info('user name ' + users[j].getDisplayValue());
}
}

1 ACCEPTED SOLUTION

Willem
Giga Sage
Giga Sage

You got above code working right? So "requester" variable is already set somewhere in the code?

Then this will improve the speed. It will only trigger 2 queries instead of 1 query, plus additional queries for each group:

var sg = new GlideRecord('sys_user_grmember');
sg.addQuery('user', requester);
sg.query();
var group_list = [];
var num = sg.getRowCount();
while (sg.next()) {
    gs.info('groups found' + num);
    group_list.push(sg.group);
}


var users = [];
var grp = new GlideRecord('sys_user_grmember');
grp.addQuery('group', 'IN', group_list);
grp.query();
while (grp.next()) {
    users.push(grp.getUniqueValue());
    gs.info('user name ' + grp.getDisplayValue());
}

//now you have an array of users you can use for an "IN" on the incident table

View solution in original post

14 REPLIES 14

Hi Harsha,

there is no way other than query.

had it been for logged in user then you could have used gs.getUser().getMyGroups();

So you need to query twice sys_user_grmember table

Regards
Ankur

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

Willem
Giga Sage
Giga Sage

You got above code working right? So "requester" variable is already set somewhere in the code?

Then this will improve the speed. It will only trigger 2 queries instead of 1 query, plus additional queries for each group:

var sg = new GlideRecord('sys_user_grmember');
sg.addQuery('user', requester);
sg.query();
var group_list = [];
var num = sg.getRowCount();
while (sg.next()) {
    gs.info('groups found' + num);
    group_list.push(sg.group);
}


var users = [];
var grp = new GlideRecord('sys_user_grmember');
grp.addQuery('group', 'IN', group_list);
grp.query();
while (grp.next()) {
    users.push(grp.getUniqueValue());
    gs.info('user name ' + grp.getDisplayValue());
}

//now you have an array of users you can use for an "IN" on the incident table

@Harsha Pappala where you able to test this solution? If it works, please mark answer as Correct. This way others can find the answer more easily as well and the thread will be closed.

It is working as expected and the execution time improved by a lot. 

Thanks for your support 

Much appreciated

Himanshu Dubey
Giga Guru

Hi Harsha,

Try below code to get all group members of requester

I have tried this code in background script it is working for me

var groupArray = gs.getUser().­getUserByID('your_requester_name').getMyGroups().toArray();

var len = groupArray.length;
 
var users = [];

for( var i = 0; i<len; i++)
{
  var gr = new GlideRecord('sys_user_grmember');
    gr.addQuery('group', groupArray[i]);
    gr.query();
    while(gr.next())
    {  
     users.push(gr.user.toString());
       
    }
}
var allMembers = [];
 var ut = new ArrayUtil();
 allMembers = ut.unique(users);
 for (var j=0;j<allMembers.length; j++)
{  
  gs.print(allMembers[j]);
} 

Thanks

Himanshu