Set Assigned To Field Depeand on Assignment Group In Catalog variables

piyushbedre
Tera Contributor

 

I created two variable name as "Assignments Group" as a reference field and refer it to Group table , and "Assigned To"  and refer it to the user table , if there is a single user in the assignment group then the user should set auto in the assigned to field

piyushbedre_0-1779688885756.png

 

5 REPLIES 5

Tanushree Maiti
Giga Patron

Hi @piyushbedre 

 

Try this:

  1. Create a Before & Insert,Update Business Rule
    • Name: Auto-populate Assigned To.
    • Table: Select the table where your variables reside (e.g., incident or sc_task).
    • When to run: Set When to before and check both Insert and Update.
    • Filter Conditions: Set the condition to Assignment group changes AND Assignment group is not empty

2. Advanced Script: Use the following script in the Advanced tab

 

(function executeRule(current, previous /*null when async*/) {

    var grMember = new GlideRecord('sys_user_grmember');

    grMember.addQuery('group', current.assignment_group);

    grMember.query();

    if (grMember.getRowCount() == 1) {

        if (grMember.next()) {

            current.assigned_to = grMember.user;

        }

    } else {

        current.assigned_to = '';

    }

})(current, previous);

 

Please mark this response as Helpful & Accept it as solution if it assisted you with your question.
Regards
Tanushree Maiti
ServiceNow Technical Architect
Linkedin:

pr8172510
Tera Guru

Hey @piyushbedre,

Here's the complete solution using Script Include + Catalog Client Script.

Script Include: GroupMemberUtils

var GroupMemberUtils = Class.create();
GroupMemberUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getGroupMembers: function() {
        var groupId = this.getParameter('sysparm_group_id');
        var members = [];

        if (!groupId) {
            return JSON.stringify(members);
        }

        var gr = new GlideRecord('sys_user_grmember');
        gr.addQuery('group', groupId);
        gr.query();

        while (gr.next()) {
            var user = gr.user;
            members.push({
                sys_id: user.toString(),
                name: user.getDisplayValue()
            });
        }

        return JSON.stringify(members);
    },
    type: 'GroupMemberUtils'
});
Catalog Client Scripts:Auto-populate Assigned To
function onChange(control, oldValue, newValue, isLoading) {
    
    if (isLoading || !newValue) {
        return;
    }
    
    // Clear existing assigned to when group changes
    g_form.setValue('assigned_to', '');
    g_form.hideFieldMsg('assigned_to', true);
    
    // Show loading message
    g_form.showFieldMsg('assigned_to', 'Checking group members...', 'info');
    
    // Get group members using GlideAjax
    var ga = new GlideAjax('GroupMemberUtils');
    ga.addParam('sysparm_name', 'getGroupMembers');
    ga.addParam('sysparm_group_id', newValue);
    
    ga.getXMLAnswer(function(response) {
        
        try {
            var members = JSON.parse(response);
            
            if (members.length == 1) {
                // Only one member - auto-populate
                g_form.setValue('assigned_to', members[0].sys_id);
                g_form.showFieldMsg('assigned_to', 'Auto-assigned to ' + members[0].name, 'info');
            } else if (members.length > 1) {
                g_form.showFieldMsg('assigned_to', 'Select user from ' + members.length + ' group members', 'info');
            } else {
                g_form.showFieldMsg('assigned_to', 'Group has no members', 'warning');
            }
            
        } catch(e) {
            g_form.showFieldMsg('assigned_to', 'Error loading group members', 'error');
        }
    });
}​

pr8172510_0-1779690708421.pngpr8172510_1-1779690737123.pngpr8172510_2-1779690757416.png

 

 

Ankur Bawiskar
Tera Patron

@piyushbedre 

you will require onChange catalog client script and advanced reference qualifier for this

Script Include: it should be client callable

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

    checkRecordPresent: function() {

        var id = this.getParameter('sysparm_groupID');

        var gr = new GlideRecord('sys_user_grmember');
        gr.addQuery('group', id); // use valid field name here
        gr.query();
        if (gr.getRowCount() == 1 && gr.next())
            return gr.getValue('user');
        else
            return 'no member';

    },

    type: 'checkRecords'
});

Catalog client script: on change of group

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }


    var ga = new GlideAjax('checkRecords');
    ga.addParam('sysparm_name', "checkRecordPresent");
    ga.addParam('sysparm_groupID', newValue); //
    ga.getXMLAnswer(function(answer) {
        if (answer != 'no member') {
            g_form.setValue('userVariableName', answer); // give here the user variable name
        }
    });
    //Type appropriate comment here, and begin script below

}

Advanced ref qualifier on User variable since you will have to ask user to select member when more than 1 member

javascript: var users; var userArr = [];
var gr = new GlideRecord("sys_user_grmember");
gr.addQuery("group", current.variables.groupVariableName);
gr.query();
while (gr.next()) {
   userArr.push(gr.getValue('user'));
}
users = 'sys_idIN' + userArr.toString();
users;

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

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

Venky Kshatriy2
Tera Guru
Hi @piyushbedre
To accomplish this, you will need to create an onchange client script and a Script Include.Please refer to the script provided below
for guidance.
Client script:

    function onChange(control, oldValue, newValue, isLoading) {
        if (isLoading) return;

        var groupId = g_form.getValue('group_name');
        var ga = new GlideAjax('GroupMemberAjax');
        ga.addParam('sysparm_name', 'getSingleGroupMember');
        ga.addParam('sysparm_group_id', groupId);

        ga.getXML(assignto);

        function assignto(response) {
            var answer = response.responseXML.documentElement.getAttribute("answer");
            g_form.setValue('assign_to', answer);
        }

        Script include: name (GroupMemberAjax)
            var GroupMemberAjax = Class.create();
        GroupMemberAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {

            getSingleGroupMember: function() {
                var groupId = this.getParameter('sysparm_group_id');
                var gr = new GlideRecord('sys_user_grmember');

                gr.addQuery('group', groupId );

                gr.addQuery('user.active', true); // consider only active users (best practice)

                gr.query();
                while (gr.next()) {
                    var vk = gr.getRowCount();
                    if (vk == 1) {

                        return gr.getValue('user');
                    }
                }


            },


            type: 'GroupMemberAjax'
        });
 
If this response addressed your question, please mark it as Helpful and accept it as the solution.