- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎07-11-2016 11:11 AM
I have a script that I need to run on many variables on change.
does servicenow provide a way to do it.
here's an example :
include script to get the variables, orders and names
var Variable_Indentifier = Class.create();
Variable_Indentifier.prototype = Object.extendsObject(AbstractAjaxProcessor, {
isnotinvariableset : function() {
var catItem = this.getParameter('sysparm_cat_item_sysid');
var gr = new GlideRecord('item_option_new');
gr.addQuery('cat_item', catItem);
gr.query();
var variables = new Array();
while(gr.next()){
var myvar = {sys_id:gr.sys_id.toString(), name:gr.name.toString(), order:gr.order.toString()};
variables.push(myvar);
}
return (JSON.stringify(variables));
}
});
client script to get what variable to reset from the include script
function onLoad() {
//Type appropriate comment here, and begin script below
var gaValid = new GlideAjax('Variable_Indentifier');
gaValid.addParam('sysparm_name','isnotinvariableset');
gaValid.addParam('sysparm_cat_item_sysid',$('sysparm_id').value);
gaValid.getXMLWait();
answer = gaValid.getAnswer();
window.toreset = JSON.parse(answer);
console.log("-----------------------------------------"+window.toreset[0].order);
}
and the script that trigger on edit of some variables that reset all other variables under it :
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
//need the client script : Find variables to reset
if(window.toreset != null){
var myorder = findOrder(control);
var myname = findName(control);
//window.toreset.length
console.log(window.toreset[56].name)
for(i = 0; i < window.toreset.length; i++){
if(window.toreset[i].name != myname && window.toreset[i].order >= myorder && window.toreset[i].name != 'ba_select_location' && window.toreset[i].name != 'ba_ipPhone_display_name')
{
g_form.setValue(window.toreset[i].name.toString(), '');
}
}
}
}
function findOrder(control)
{
var myorder = 0;
for(i = 0; i< window.toreset.length; i++){
if(window.toreset[i].sys_id == control.name.substring(3, 35)){
myorder = (window.toreset[i].order);
}
}
return myorder;
}
function findName(control)
{
var myname = 0;
for(i = 0; i< window.toreset.length; i++){
if(window.toreset[i].sys_id == control.name.substring(3, 35)){
myname = (window.toreset[i].name);
}
}
return myname;
}
first, onload I get all the variables of my item
and after if I change a variables that influence something under it I trigger the script that clean (set varaible to '')
for now it trigger onchange of these variables so I have many client script
I would like to have only one script that will do this
(I'm thinking to use a onload script with some EventListener)
Thanks, I speak french so sorry for my bad english
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎07-11-2016 01:30 PM
So now I only have this script include
var Variable_Indentifier = Class.create();
Variable_Indentifier.prototype = Object.extendsObject(AbstractAjaxProcessor, {
isnotinvariableset : function() {
var catItem = this.getParameter('sysparm_cat_item_sysid');
var gr = new GlideRecord('item_option_new');
gr.addQuery('cat_item', catItem);
gr.query();
var variables = new Array();
while(gr.next()){
var myvar = {sys_id:gr.sys_id.toString(), name:gr.name.toString(), order:gr.order.toString()};
variables.push(myvar);
}
return (JSON.stringify(variables));
}
});
and this client script onload
function onLoad() {
//Type appropriate comment here, and begin script below
var gaValid = new GlideAjax('Variable_Indentifier');
gaValid.addParam('sysparm_name','isnotinvariableset');
gaValid.addParam('sysparm_cat_item_sysid',$('sysparm_id').value);
gaValid.getXMLWait();
answer = gaValid.getAnswer();
window.toreset = JSON.parse(answer);
document.addEventListener('change', resetUnderVariables, false);
}
function resetUnderVariables(e){
var executeon = [
"ab05f8fa6fbd46007d319e4eae3ee451",
"be16d1f26ffd46007d319e4eae3ee487",
"d2a591f26ffd46007d319e4eae3ee451",
"323f85826f2e46007d319e4eae3ee436",
"6bfc2c7a6fbd46007d319e4eae3ee46c",
"e21134fa6fbd46007d319e4eae3ee494",
"23f274fa6fbd46007d319e4eae3ee4d6",
"327afb9c6f8bca00d6a2f35d5d3ee47c",
"581888246fcbca00d6a2f35d5d3ee4a3",
"7ac8c0646fcbca00d6a2f35d5d3ee421",
"c2ef77506fcbca00d6a2f35d5d3ee433",
"63c990ec6fcbca00d6a2f35d5d3ee470",
"47f54ce06fcbca00d6a2f35d5d3ee4b5",
"8c95c8e06fcbca00d6a2f35d5d3ee4f8",
"4647c4246fcbca00d6a2f35d5d3ee4a9",
"a7ed04366fbd46007d319e4eae3ee42c",
"c80dc8f26fbd46007d319e4eae3ee407",
"f01478fa6fbd46007d319e4eae3ee459",
"47f54ce06fcbca00d6a2f35d5d3ee4b5",
"3a6515f26ffd46007d319e4eae3ee43c",
"9cdf20fa6fbd46007d319e4eae3ee465",
"56a05c366fbd46007d319e4eae3ee411"];
console.log(e.target.id);
control = e.target.id.substring(3, 35);
console.log(control);
if(window.toreset != null && executeon.indexOf(control) > -1){
var myorder = findOrder(control);
var myname = findName(control);
for(i = 0; i < window.toreset.length; i++){
if(window.toreset[i].name != myname && window.toreset[i].order >= myorder && window.toreset[i].name != 'ba_select_location' && window.toreset[i].name != 'ba_ipPhone_display_name')
{
g_form.setValue(window.toreset[i].name.toString(), '');
}
}
}
}
function findOrder(control)
{
var myorder = 0;
for(i = 0; i< window.toreset.length; i++){
if(window.toreset[i].sys_id == control){
myorder = (window.toreset[i].order);
}
}
return myorder;
}
function findName(control)
{
var myname = 0;
for(i = 0; i< window.toreset.length; i++){
if(window.toreset[i].sys_id == control){
myname = (window.toreset[i].name);
}
}
return myname;
}
I hope this can help others

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎07-11-2016 11:37 AM
Hi David,
The short answer is that an onChange client script watches one field or variable at a time. If you want to watch multiple variables or fields, you need multiple client scripts.
Reference:
Client Scripts - ServiceNow Wiki

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎07-11-2016 11:38 AM
And for what it is worth, your English is better than my French.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎07-11-2016 11:44 AM
Hi Chuck, I'll try to do a onload script with EventListener and I'll let you know if it works
Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎07-11-2016 01:30 PM
So now I only have this script include
var Variable_Indentifier = Class.create();
Variable_Indentifier.prototype = Object.extendsObject(AbstractAjaxProcessor, {
isnotinvariableset : function() {
var catItem = this.getParameter('sysparm_cat_item_sysid');
var gr = new GlideRecord('item_option_new');
gr.addQuery('cat_item', catItem);
gr.query();
var variables = new Array();
while(gr.next()){
var myvar = {sys_id:gr.sys_id.toString(), name:gr.name.toString(), order:gr.order.toString()};
variables.push(myvar);
}
return (JSON.stringify(variables));
}
});
and this client script onload
function onLoad() {
//Type appropriate comment here, and begin script below
var gaValid = new GlideAjax('Variable_Indentifier');
gaValid.addParam('sysparm_name','isnotinvariableset');
gaValid.addParam('sysparm_cat_item_sysid',$('sysparm_id').value);
gaValid.getXMLWait();
answer = gaValid.getAnswer();
window.toreset = JSON.parse(answer);
document.addEventListener('change', resetUnderVariables, false);
}
function resetUnderVariables(e){
var executeon = [
"ab05f8fa6fbd46007d319e4eae3ee451",
"be16d1f26ffd46007d319e4eae3ee487",
"d2a591f26ffd46007d319e4eae3ee451",
"323f85826f2e46007d319e4eae3ee436",
"6bfc2c7a6fbd46007d319e4eae3ee46c",
"e21134fa6fbd46007d319e4eae3ee494",
"23f274fa6fbd46007d319e4eae3ee4d6",
"327afb9c6f8bca00d6a2f35d5d3ee47c",
"581888246fcbca00d6a2f35d5d3ee4a3",
"7ac8c0646fcbca00d6a2f35d5d3ee421",
"c2ef77506fcbca00d6a2f35d5d3ee433",
"63c990ec6fcbca00d6a2f35d5d3ee470",
"47f54ce06fcbca00d6a2f35d5d3ee4b5",
"8c95c8e06fcbca00d6a2f35d5d3ee4f8",
"4647c4246fcbca00d6a2f35d5d3ee4a9",
"a7ed04366fbd46007d319e4eae3ee42c",
"c80dc8f26fbd46007d319e4eae3ee407",
"f01478fa6fbd46007d319e4eae3ee459",
"47f54ce06fcbca00d6a2f35d5d3ee4b5",
"3a6515f26ffd46007d319e4eae3ee43c",
"9cdf20fa6fbd46007d319e4eae3ee465",
"56a05c366fbd46007d319e4eae3ee411"];
console.log(e.target.id);
control = e.target.id.substring(3, 35);
console.log(control);
if(window.toreset != null && executeon.indexOf(control) > -1){
var myorder = findOrder(control);
var myname = findName(control);
for(i = 0; i < window.toreset.length; i++){
if(window.toreset[i].name != myname && window.toreset[i].order >= myorder && window.toreset[i].name != 'ba_select_location' && window.toreset[i].name != 'ba_ipPhone_display_name')
{
g_form.setValue(window.toreset[i].name.toString(), '');
}
}
}
}
function findOrder(control)
{
var myorder = 0;
for(i = 0; i< window.toreset.length; i++){
if(window.toreset[i].sys_id == control){
myorder = (window.toreset[i].order);
}
}
return myorder;
}
function findName(control)
{
var myname = 0;
for(i = 0; i< window.toreset.length; i++){
if(window.toreset[i].sys_id == control){
myname = (window.toreset[i].name);
}
}
return myname;
}
I hope this can help others