Some PDIs are currently unavailable, and PDI actions are paused. View the latest updates here. Read More

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

 

6 REPLIES 6

Tanushree Maiti
Tera 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 Accept the solution if it assisted you with your question & Mark this response as Helpful.
Regards
Tanushree Maiti
ServiceNow Technical Architect
LinkedIn: https://www.linkedin.com/in/tanushreemaiti

pr8172510
Kilo Sage

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
Mega Sage
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.