Welcome to Community Week 2025! Join us to learn, connect, and be recognized as we celebrate the spirit of Community and the power of AI. Get the details  

Clients script or any script onchange any variables

rolodo
Mega Contributor

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

1 ACCEPTED SOLUTION

rolodo
Mega Contributor

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


View solution in original post

5 REPLIES 5

Pradeep Sharma
ServiceNow Employee
ServiceNow Employee

Hi David,



Vous ne pouvez pas faire cela dans un script client et des besoins multiples script client onchange