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.

How to sync Parent group members to Child groups

billi_lumley
ServiceNow Employee
ServiceNow Employee

Hello!   Looking for a business rule or SI to sync parent group members to child groups when a new members is added to a parent group.   I had created a business rule on the group member table; however I'm not having any luck.

//check if group is a Parent

var grp = new GlideRecord("sys_user_group");

grp.addQuery("parent", current.group);

grp.addQuery('type', 'CONTAINS', '7e741272efe2010047920fa3f8225643'); //human_resources

grp.addQuery('active', true);

grp.query();

//if group exists as parent, assign new user to the child groups

while (grp.next()) {

  var mem = new GlideRecord("sys_user_grmember");

  mem.addQuery("user", current.user);

  mem.addQuery("group", grp.group);

  mem.query();

  //This is checking to see if group record already exists? - What if they were added to the group prior to this rule being instituted?

  if (!mem.next()) {

  mem.user = current.user;

  mem.group = grp.group;

  mem.insert();

  }

}

1 ACCEPTED SOLUTION

Chuck Tomasi
Tera Patron

Here you go Billi. No charge for the PS time. 🙂 Comments at the top indicate how to set up the business rule. This thing adds AND deletes members from the child tables. 🙂 Don't forget to dump this stuff inside the existing wrapper function that comes with default AFTER business rules.

 

// Table sys_user_grmember
// Insert: true
// Update: true
// When: After
// Condition current.group.getDisplayValue() == 'HR Parent'

//find active child groups
var childArr = [];
var thisUser = current.getValue('user');
var grp = new GlideRecord('sys_user_group'); grp.addEncodedQuery('active=true^parent=' + current.getValue('group')); grp.query(); gs.print('count=' + grp.getRowCount()); while (grp.next()) { childArr.push(grp.getValue('sys_id')); gs.print(grp.getDisplayValue()); } // Add user to the child groups if (current.operation() == 'insert') { gs.print('INSERT'); for (var i = 0; i < childArr.length; i++) { if (userInGroup(thisUser, childArr[i])) { gs.print('user is already in the group ' + childArr[i]); continue; } addUserToGroup(thisUser, childArr[i]); } } // Remove user from child groups if (current.operation() == 'delete') { gs.print('DELETE'); for (var i = 0; i < childArr.length; i++) { if (!userInGroup(thisUser, childArr[i])) { gs.print('user is NOT in the group ' + childArr[i]); continue; } deleteUserFromGroup(thisUser, childArr[i]); } } function userInGroup(user, group) { var ug = new GlideRecord('sys_user_grmember'); var q = 'user=' + user + '^group=' + group; // user=46d44a23a9fe19810012d100cca80666^group=dc8d86c213d31200ae44b4622244b03d // HR Child1 (want to see) // user=46d44a23a9fe19810012d100cca80666^group=a49d86c213d31200ae44b4622244b0e9 // Got (3) ug.addEncodedQuery(q); ug.query(); gs.print('userInGroup(): q=' + q + ' count=' + ug.getRowCount()); return ug.hasNext(); } function deleteUserFromGroup(user, group) { if (!user) return; if (!group) return; var ug = new GlideRecord('sys_user_grmember'); var q = 'user=' + user + '^group=' + group; // user=46d44a23a9fe19810012d100cca80666^group=dc8d86c213d31200ae44b4622244b03d // HR Child1 (want to see) // user=46d44a23a9fe19810012d100cca80666^group=a49d86c213d31200ae44b4622244b0e9 // Got (3) ug.addEncodedQuery(q); ug.query(); gs.print('deleteUserFromGroup(): q=' + q + ' count=' + ug.getRowCount()); if (ug.next()) { gs.print('delete'); ug.deleteRecord(); } } function addUserToGroup(user, group) { if (!user) return; if (!group) return; var ug = new GlideRecord('sys_user_grmember'); ug.newRecord(); ug.user = user; ug.group = group; ug.insert(); gs.print('insert'); }

 

View solution in original post

16 REPLIES 16

Hello everyone,

I also had a task to sync parent and child groups. The requirement is for the parent group to be in a different domain from the child group and the syncing should be across domains. Does anyone have any idea of what I can do to trigger this?

 

ying zeng
Tera Contributor

BR

yingzeng_0-1675305275782.png

(function executeRule(current,previous){
	
	var gr_grm= new GlideRecord('sys_user_grmember');
	gr_grm.addQuery('group',current.parent);
	gr_grm.query();
    
	while(gr_grm.next()){
		var gr_grm_ins = new GlideRecord('sys_user_grmember');
		gr_grm_ins.user = gr_grm.user;
		gr_grm_ins.group = current.sys_id;
		gr_grm_ins.insert();
        gs.addInfoMessage('test');
	}
}) (current,previous);