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.
This helps other users find accurate and useful information more easily
- 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(','));
});
}