I have a script include that is quering a user and returning all of the assignment groups the user is in. I am only getting one group being returned when there are supposed to be several.

smetsch
Kilo Contributor

I have a script include that is querying a user and returning all of the assignment groups that the user is in. I am only getting  one group being returned when there are supposed to be several. Any thoughts?  Here is my script include:

function getUsersGroups(){
var answer = '';
var user = current.variables.install_network_device;
var grmembers = new GlideRecord('sys_user_grmember');
grmembers.addQuery('user', user);
grmembers.query();
while (grmembers.next()){
if (answer.length > 0){
answer += (',' + grmembers.group.sys_id);
} else {
answer = grmembers.group.sys_id;
}
}
return 'sys_idIN' + answer;
}

1 ACCEPTED SOLUTION

SwarnadeepNandy
Mega Sage

Hi,

Please try the below code.

function getUsersGroups() {
    var answer = [];
    var user = current.variables.install_network_device;
    var grmembers = new GlideRecord('sys_user_grmember');
    grmembers.addQuery('user', user);
    grmembers.query();
    while (grmembers.next()) {
        answer.push(grmembers.group.toString());
    }
    return 'sys_idIN' + answer;
}

Regards,

Swarnadeep Nandy

View solution in original post

9 REPLIES 9

SwarnadeepNandy
Mega Sage

Hi,

Please try the below code.

function getUsersGroups() {
    var answer = [];
    var user = current.variables.install_network_device;
    var grmembers = new GlideRecord('sys_user_grmember');
    grmembers.addQuery('user', user);
    grmembers.query();
    while (grmembers.next()) {
        answer.push(grmembers.group.toString());
    }
    return 'sys_idIN' + answer;
}

Regards,

Swarnadeep Nandy

Thank you so much!

The SN Nerd
Giga Sage
Giga Sage

I'd suggest leveraging OOTB getMyGroups function as follows:

function getUsersGroups(userSysID ){ 
var user = GlideUser.getUserByID(userSysID);
var javaGroupsArray = user.getMyGroups();

// getMyGroups returns a java array, we want an array we can use in our JavaScript
var jsGroupsArray = javaGroupsArray.toArray();

// Now we can join the array elements to make a string we can use
var qry= 'sys_idIN' + jsGroupsArray .join(",");

return qry;
}

Usage

getUsersGroups(current.variables.install_network_device);

ServiceNow Nerd
ServiceNow Developer MVP 2020-2022
ServiceNow Community MVP 2019-2022

Vishal Khandve
Kilo Sage

Hi ,

 try below code:

script include:

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

getGroupMembers: function() {
var answer = [];
var usr = this.getParameter('sysparm_user_name'); // sys_id

var gr1 = new GlideRecord('sys_user_grmember');
gr1.addQuery('user', usr);
gr1.query();
while(gr1.next()){
answer.push(gr1.getDisplayValue('group'));

}
return JSON.stringify(answer);


},

type: 'FPServiceCatalogHelperScript'
});

 

client script:

function onChange(control, oldValue, newValue, isLoading) {
if (newValue == '') {

return;
}
//Type appropriate comment here, and begin script below
var grp = new GlideAjax('FPServiceCatalogHelperScript');
grp.addParam('sysparm_name', 'getGroupMembers');
grp.addParam('sysparm_user_name', newValue);
grp.getXMLAnswer(FPServiceCatalogHelperScript);
}

function FPServiceCatalogHelperScript(response) {
var objList = JSON.parse(response);


if (objList != 'false') {
for (var i=0;i<objList.length;i++){
var obj=objList[i];
g_form.setValue('u_group', objList);

}
}

 

Thanks,

Vishal

AbhishekGardade
Giga Sage

Hello Smtsch,

function getUsersGroups(){ 
var answer = '';
var user = current.variables.install_network_device;
var grmembers = new GlideRecord('sys_user_grmember');
grmembers.addQuery('user', user);
grmembers.query();
while (grmembers.next()){
if (answer.length > 0){
answer += (',' + grmembers.group.sys_id.toString());
} else {
answer = grmembers.group.sys_id.toString();
}
}
return 'sys_idIN' + answer;
}

IMPORTANT NOTE:Whenever you're looping and pushing data directly from a query, you need tostring() it.

array.push(gr.sys_id.toString); OR array.push(gr.getValue('sys_id').toString);

And see if that helps. Whatever is causing this problem I've seen it hundreds of times. If you're looping and you're using an object, if you don't string it you may end up with a list of the same thing (or worse- if you're doing an update on this field, you'll find yourself updating the same record numerous times). I always make sure to toString() or format the object so ServiceNow treats the data separately.

Please mark as Correct Answer/Helpful, if applicable.
Thanks!
Abhishek Gardade

Thank you,
Abhishek Gardade