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.

Arrayutil / Script include/For loop not working as expected

Ruchi Kumari1
Tera Expert

Hi,
I have a catalog where there are 2 fields :
1. List type > Multiple users can be selected
2. MRVS (having 3 variables : users,machine name,serial number) > This gets populated based on user selected in field 1.

If i remove any row from MRVS, then the list should also be updated. That is user removed from MRVS, should be removed from list as well.
To achieve this, i am writing an onsubmit client script which further calls a script include(passing values from list and MRVS).
My Client script is as below:

function onSubmit() {
    var mrvsValues = g_form.getValue('list_the_existing_machine_name');
    var mrvsSelectedUsers = [];
    var rows = JSON.parse(mrvsValues);
    for (var i = 0; i < rows.length; i++) {
        var val = rows[i].req_for;
        mrvsSelectedUsers.push(val);
    }
var userListCollector = g_form.getValue('requested_for');
var listArr = userListCollector.split(',');

var gaGetUserDetails = new GlideAjax('GetUserDetails');
gaGetUserDetails.addParam('sysparm_name', 'getUserDetails');
gaGetUserDetails.addParam('sysparm_listusers', listArr);
gaGetUserDetails.addParam('sysparm_mrvsusers', mrvsSelectedUsers);
gaGetUserDetails.getXMLAnswer(parseAnswer);

    function parseAnswer(response) {
        var answer = JSON.parse(response); //returned value should be array of sysids of user to be removed from list
        //if (answer.length > 0) {
        for (var a = 0; a < answer.length; a++) {
            var valueToRemove = answer[i];
            var index = listArr.indexOf(valueToRemove);
            if (index !== -1) { //valueToRemove was found in array
                listArr.splice(index, 1); //remove array member from this array
            }
        }
        g_form.setValue('requested_for', listArr.join(','));
        //return false;
    }
    return false;
}

 

My script include is as below:

getUserDetails: function() {
        var listUsers = this.getParameter('sysparm_listusers');
        var mrvsUsers = this.getParameter('sysparm_mrvsusers');
        gs.log('EMEA2 script include called values  listUsers -- ' + listUsers + ' --mrvsUsers---  ' + mrvsUsers); //GETTING EXPECTED VALUES

        var listUserName = [];
        var gr = new GlideRecord('sys_user');
        gr.addEncodedQuery('sys_idIN' + listUsers);
        gr.query();
        while (gr.next()) {
            listUserName.push(gr.name.toString());
        }
      gs.log('EMEA2 script include listUserName -- ' + listUserName); //GETTING EXPECTED VALUE

var finalValuesList = [];
var removeValuesList = [];
gs.log('EMEA3 SI listUserName.length --' + listUserName.length); //GETTING EXPECTED VALUE

for (var i = 0; i < listUserName.length; i++) {
            gs.log('EMEA3 SI listUserName[i] --  ' + listUserName[i]+' value of i '+i); //NOT COMING AS EXPECTED // THIS IS COMING ONLY ONCE FOR INDEX 0 ??
      var arrayUtil1 = new arrayUtil();
      if (arrayUtil1.contains(mrvsUsers, listUserName[i])) {
            finalValuesList.push(listUserName[i].toString());
       } else {
                removeValuesList.push(listUserName[i].toString());
            }
        }

 gs.log('EMEA3 SI finalValuesList --  ' + finalValuesList + ' removeValuesList ' + removeValuesList); //NOT COMING

        var removeUserId = [];
        var grUser = new GlideRecord('sys_user');
        grUser.addEncodedQuery('nameIN' + removeValuesList);
        grUser.query();
        while (grUser.next()) {
            removeUserId.push(grUser.getUniqueValue());
        }
        gs.log('emea script include ' + removeUserId); //NOT COMING
        //return array removeUserId;
        gs.log('EMEA script include 1 finalValuesList -- ' + finalValuesList + ' --removeValuesList--- ' + removeValuesList); //NOT COMING

    },

 

I am not sure what is not working in script include after for loop. Why is for loop iterating only once and not for the entire length ?

 

11 REPLIES 11

@Ruchi Kumari1 

Hope you are doing good.

Did my reply answer your question?

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

Mohammad Danis1
Giga Guru

Hi @Ruchi Kumari1 ,
Hope you are doing well !

Were you able to figure out the issue ?

If my response helped please mark it correct and close the thread so that it benefits future readers.

Regards,
Mohammad Danish