Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Quick help with adding users from an array to a group

Brendan Hallida
Kilo Guru

Hi all,

I am pretty sure that I am close, however, the script is not running for all users in the array.

This is what I have so far:

var admins = ["user1","user2"]; //array
for(var i = 0; i < admins.length; i++) //for loop
   {
var gr = new GlideRecord('sys_user_grmember');
gr.initialize();
gr.user = admins[i];
gr.group.setDisplayValue('Admin') 
gr.setWorkflow(false);
gs.print(gr.insert());
}

So the script adds user1 to the group, and then also adds a blank entry in the user list of the group

find_real_file.png

find_real_file.png

 

anyone know what I'm missing?

Thanks, Brendan

1 ACCEPTED SOLUTION

Morning Brendan,

Try out the code below, i've just given it a little test and it seems to work as required. Obviously you'll need to change the user names and the group to whatever is on your instance.

var admins = ["abel.tuter","abraham.lincoln"];
for(var i = 0; i < admins.length; i++) {
	//check user is not already in group
	var gr = new GlideRecord('sys_user_grmember');
	gr.addEncodedQuery('user.user_name=' + admins[i] + '^group.name=Service Desk');
	gr.query();
	gs.debug(admins[i] + ": " + gr.hasNext());
	if (!gr.hasNext()){
		//use user_name to get the user record
		var usrGr = new GlideRecord('sys_user');
		if(usrGr.get('user_name', admins[i])) {
			//add the new record to the group
			gr.initialize();
			gr.user = usrGr.getValue('sys_id');
			gr.group.setDisplayValue('Service Desk');
			gr.setWorkflow(false);
			gs.debug(gr.insert());
		}
		else{
			// User not found by user_name
			gs.error('Cannot find user: ' + admins[i]);
		}
	}
}

View solution in original post

26 REPLIES 26

Dubz
Mega Sage

Hi Brendan,

 

The user field is a reference field, your array appears to be a string value of 'user 1' so you'll either need to use setDisplayValue() or populate the array with sys_id's

 

Cheers

Dave

Brendan Hallida
Kilo Guru

Hi guys, thanks for your help so far.

I have been able to make it work using the users sys_id's, however, I would like to query the user_name instead for ease of use.

This is what I have so far.

var user1 = "sys_id_84f3f560083a198701310c784";
var user2 = "sys_id_84f3f560083a198701310c7a8";
var admins = user1 + " " + user2;
var admins = admins.split(" ");
gs.print("1st test: " + admins);
for(var i = 0; i < admins.length; i++) //for loop
   {
gs.print("2nd test: " + i + admins[i])
var gr = new GlideRecord('sys_user_grmember');
gr.initialize();
gr.user = admins[i];
gr.group.setDisplayValue('Admin') 
gr.setWorkflow(false);
gs.print(gr.insert());
   }

Where would the best place to add the a query to the sys_user table?

var users = new GlideRecord('sys_user');
users.AddQuery('user_name', 'IN', admins[i]);
users.query();

Thanks, Brendan

Brendan Hallida
Kilo Guru

ive got the following, however, it is only querying the first entry of the array.

var admins = "user1 user2";
var admins = admins.split(" ");
gs.print("1st test: " + admins);

for(var i = 0; i < admins.length; i++) //for loop
   {
gs.print("admin " + i + " username is: " + admins[i]); // this is returning two log entries

var users = new GlideRecord('sys_user');
users.addQuery('user_name', 'IN', admins[i]);
users.query();
while(users.next()) {
gs.print('2nd test - name is: '+ users.name); //this only logs 1 entry with user1's name
}
   }

I feel I'm close, not sure why the for loop is not querying both users...

 

Hi Brendan,

 

Can you try the below and let me know 

var admins = "user1 user2";//NOTE: Makes sure none of the usernames have a space in them
admins = admins.replace(" ",",");

var users = new GlideRecord('sys_user');
users.addQuery('user_name', 'IN', admins);
users.query();
while(users.next()) {
gs.print('UserName is: '+ users.name); 
}

Chuck Tomasi
Tera Patron

The key to note is that sys_user_grmember has two reference fields. If "user1" and "user2" are names and not sys_ids, then you'll need to use setDisplayValue() like you did for the name of the group.

var admins = ["user1","user2"];
for(var i = 0; i < admins.length; i++) {
  var gr = new GlideRecord('sys_user_grmember');
  gr.initialize();
  gr.user.setDisplayValue(admins[i]);
  gr.group.setDisplayValue('Admin') 
  gr.setWorkflow(false);
  gs.print(gr.insert());
}