List collector value not removed from script
						
					
					
				
			
		
	
			
	
	
	
	
	
- Mark as New
 - Bookmark
 - Subscribe
 - Mute
 - Subscribe to RSS Feed
 - Permalink
 - Report Inappropriate Content
 
‎07-09-2025 12:24 PM
Hi,
I am trying to remove values from list collector through onsubmit client script.
I have a script include which returns what values are to be removed from the list collector on submit. I tried below script but no luck. I am getting the expected alerts. What am i missing ?
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.toString());
    }
    var userListCollector = g_form.getValue('requested_for');
    var listArr = userListCollector.split(',');
    alert('listArr  ' + listArr); //Getting expected alert
    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) {
         //returned value should be array of sysids of user to be removed from list
        var answer = response;
        var test = answer.split(',');
        alert('anser1 = ' + test); ///getting expected alert
        //if (answer.length > 0) {
        for (var a = 0; a < test.length; a++) {
            var valueToRemove = test[a];
            alert('Value to remove ' + valueToRemove);
            var index = listArr.indexOf(valueToRemove);
            alert('index ' + index); //getting expected index value
            if (index !== -1) { 
                listArr.splice(index, 1); //remove value
            }
        }
        alert('listArr100  ' + listArr); //getting expected value
        g_form.setValue('requested_for', listArr.join(','));
        return false; //This is false only for testing purpose.
There is no change in the selected values before / after clicking submit.
- Mark as New
 - Bookmark
 - Subscribe
 - Mute
 - Subscribe to RSS Feed
 - Permalink
 - Report Inappropriate Content
 
‎07-09-2025 02:11 PM - edited ‎07-09-2025 02:12 PM
The use of asynchronous javascript in an onSubmit client script can be quite tricky. You will actually need to submit the form a second time with your client script.
Here is a KB article on the topic that shows the code you will need - KB0783579
Feel free to follow up if you get stuck.
- Mark as New
 - Bookmark
 - Subscribe
 - Mute
 - Subscribe to RSS Feed
 - Permalink
 - Report Inappropriate Content
 
‎07-09-2025 11:48 PM
Hi @Community Alums , Tried this as well but no luck. Here's what i tried :
var actionName = g_form.getActionName();
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.toString());
    }
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) {
        ///returned value should be array of sysids of user to be removed from list
        var answer = response;
        var test = answer.split(',');
       
        //if (answer.length > 0) {
        for (var a = 0; a < test.length; a++) {
            var valueToRemove = test[a];
            alert('Value to remove ' + valueToRemove);
            var index = listArr.indexOf(valueToRemove);
            alert('index ' + index);
            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(','));
g_form.submit(actionName);
       //g_form.orderNow();
    }
I was getting this error message : "The g_form.submit function has no meaning on a catlog item. Perhaps you mean g_form.addToCart() or g_form.orderNow() instead ". Tried with orderNow() as well but no luck.
- Mark as New
 - Bookmark
 - Subscribe
 - Mute
 - Subscribe to RSS Feed
 - Permalink
 - Report Inappropriate Content
 
‎07-09-2025 02:16 PM - edited ‎07-09-2025 02:19 PM
Hi @Ruchi Kumari1,
Try this solution and Ken know if help you
var mrvsValues = g_form.getValue('list_the_existing_machine_name');
var mrvsSelectedUsers = [];
if (mrvsValues) {
var rows = JSON.parse(mrvsValues);
for (var i = 0; i < rows.length; i++) {
var val = rows[i].req_for;
if (val) {
mrvsSelectedUsers.push(val.toString());
}
}
}
var userListCollector = g_form.getValue('requested_for') || '';
var listArr = userListCollector ? userListCollector.split(',') : [];
alert('listArr: ' + listArr);
var gaGetUserDetails = new GlideAjax('GetUserDetails');
gaGetUserDetails.addParam('sysparm_name', 'getUserDetails');
gaGetUserDetails.addParam('sysparm_listusers', listArr.join(','));
gaGetUserDetails.addParam('sysparm_mrvsusers', mrvsSelectedUsers.join(','));
gaGetUserDetails.getXMLAnswer(parseAnswer);
function parseAnswer(response) {
var answer = response;
var usersToRemove = answer.split(',');
alert('Users to remove: ' + usersToRemove);
listArr = listArr.filter(function(userId) {
return usersToRemove.indexOf(userId) === -1;
});
alert('Updated listArr: ' + listArr);
g_form.setValue('requested_for', listArr.join(','));
}
If you’re placing this script inside an onSubmit Client Script, make sure of the following:
- Set Is Async = true in the script configuration. This is required because you’re using GlideAjax, which runs asynchronously.
 - Ensure the GlideAjax call includes a valid callback function (which you already have with parseAnswer).
Otherwise, the form may submit before the GlideAjax call finishes, which would prevent your list from being updated in time. 
- Mark as New
 - Bookmark
 - Subscribe
 - Mute
 - Subscribe to RSS Feed
 - Permalink
 - Report Inappropriate Content
 
‎07-09-2025 07:18 PM
onSubmit client scripts must return true or false synchronously to let the form know if it should proceed.
But GlideAjax is asynchronous — it finishes after the script already returned, so your g_form.setValue() runs too late to affect the submission.
That’s why your values don’t update on submit.
try this scripts:
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading) return;
    var listArr = newValue.split(',');
    var mrvsValues = g_form.getValue('list_the_existing_machine_name');
    var mrvsSelectedUsers = JSON.parse(mrvsValues).map(row => row.req_for.toString());
    var ga = new GlideAjax('GetUserDetails');
    ga.addParam('sysparm_name', 'getUserDetails');
    ga.addParam('sysparm_listusers', listArr);
    ga.addParam('sysparm_mrvsusers', mrvsSelectedUsers);
    ga.getXMLAnswer(function(answer) {
        var toRemove = answer.split(',');
        for (var i = 0; i < toRemove.length; i++) {
            var index = listArr.indexOf(toRemove[i]);
            if (index !== -1) listArr.splice(index, 1);
        }
        g_form.setValue('requested_for', listArr.join(','));
    });
}
					
				
			
			
				
			
			
				
			
			
			
			
			
			
		