Iterate through variables in server side script

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-14-2023 12:45 PM
I am trying to use the 'Submit a Record Producer' REST API to create functionality to copy a ticket.
This ticket is in a table where records can be created using multiple record producers, so the variables on the table can always be different.
So I want to iterate through current.variables, to grab all of the variables on that ticket, not knowing in advance what they may be. Normally I would just stringify the object and loop through it, but JSON.stringify is throwing this error:
Evaluator.evaluateString() problem: java.lang.NullPointerException: com.glide.catalog.scripting.rhino.impl.GlideElementScriptingModel$2.put(GlideElementScriptingModel.java:501)
com.glide.script.fencing.ScopedRhinoObjectWrapper.wrap(ScopedRhinoObjectWrapper.java:58)
com.glide.script.fencing.ScopedRhinoObjectWrapper.wrap(ScopedRhinoObjectWrapper.java:27)
com.glide.script.fencing.WrappedScriptableObject.get(WrappedScriptableObject.java:55)
com.glide.script.fencing.ScopedGlideElement.get(ScopedGlideElement.java:47)
org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:2318)
org.mozilla.javascript.NativeJSON.str(NativeJSON.java:277)
org.mozilla.javascript.NativeJSON.jo(NativeJSON.java:380)
org.mozilla.javascript.NativeJSON.str(NativeJSON.java:338)
org.mozilla.javascript.NativeJSON.jo(NativeJSON.java:380)
org.mozilla.javascript.NativeJSON.str(NativeJSON.java:338)
org.mozilla.javascript.NativeJSON.stringify(NativeJSON.java:269)
org.mozilla.javascript.NativeJSON.execIdCall(NativeJSON.java:104)
org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:102)
org.mozilla.javascript.ScriptRuntime.doCall2(ScriptRuntime.java:2678)
org.mozilla.javascript.ScriptRuntime.doCall(ScriptRuntime.java:2617)
org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1518)
org.mozilla.javascript.Interpreter.interpret(Interpreter.java:830)
org.mozilla.javascript.InterpretedFunction.lambda$call$0(InterpretedFunction.java:152)
com.glide.caller.gen.sys_ui_action_0fcd817e1b5ce59044b95247624bcb9f_script.call(Unknown Source)
com.glide.script.ScriptCaller.call(ScriptCaller.java:18)
org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:151)
org.mozilla.javascript.ScriptRuntime.doCall2(ScriptRuntime.java:2678)
org.mozilla.javascript.ScriptRuntime.doCall(ScriptRuntime.java:2617)
org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1518)
org.mozilla.javascript.Interpreter.interpret(Interpreter.java:830)
org.mozilla.javascript.InterpretedFunction.lambda$call$0(InterpretedFunction.java:152)
com.glide.caller.gen.sys_ui_action_0fcd817e1b5ce59044b95247624bcb9f_script.call(Unknown Source)
com.glide.script.ScriptCaller.call(ScriptCaller.java:18)
org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:151)
org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:563)
org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3459)
org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:164)
com.glide.script.ScriptEvaluator.execute(ScriptEvaluator.java:359)
com.glide.script.ScriptEvaluator.evaluateString(ScriptEvaluator.java:182)
com.glide.script.ScriptEvaluator.evaluateString(ScriptEvaluator.java:115)
com.glide.script.GlideRhinoHelper.evaluateAsString(GlideRhinoHelper.java:138)
com.glide.script.ActionScript.conditionalEval(ActionScript.java:109)
com.glide.script.ActionScript.execute(ActionScript.java:94)
com.glide.script.ActionScriptProcessor.processScript(ActionScriptProcessor.java:217)
com.glide.script.Action.process(Action.java:117)
com.glide.ui.RedirectTransaction.invokeAction(RedirectTransaction.java:545)
com.glide.ui.RedirectTransaction.handleActions(RedirectTransaction.java:501)
com.glide.ui.RedirectTransaction.inboundActions(RedirectTransaction.java:337)
com.glide.ui.RedirectTransaction.process(RedirectTransaction.java:200)
com.glide.ui.GlideServletUITransaction.process(GlideServletUITransaction.java:100)
com.glide.processors.AProcessor.runProcessor(AProcessor.java:612)
com.glide.processors.AProcessor.processTransaction(AProcessor.java:274)
com.glide.processors.ProcessorRegistry.process0(ProcessorRegistry.java:184)
com.glide.processors.ProcessorRegistry.process(ProcessorRegistry.java:172)
com.glide.ui.GlideServletTransaction.process(GlideServletTransaction.java:46)
com.glide.sys.Transaction.run(Transaction.java:2488)
com.glide.ui.HTTPTransaction.run(HTTPTransaction.java:27)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
java.base/java.lang.Thread.run(Thread.java:829)
I know this is probably because of the Rhino engine, but what is the alternative to loop through all variables if you don't know their names ahead of time?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-14-2023 09:46 PM
HI @Mark Endsley ,
I trust you are doing great.
To loop through all variables in a ticket without knowing their names ahead of time in ServiceNow, you can use the GlideElement API to retrieve the variables dynamically. Here's a solution that avoids the error you encountered with the Rhino engine:
// Get the current ticket record
var gr = new GlideRecord('<table_name>');
gr.get('<sys_id>');
// Loop through all variables
var variables = [];
var fieldNames = gr.getFields();
while (fieldNames.next()) {
var fieldName = fieldNames.getName();
if (fieldName.startsWith('variable_')) {
var value = gr.getValue(fieldName);
variables.push({
name: fieldName,
value: value
});
}
}
// Print the variables
for (var i = 0; i < variables.length; i++) {
var variable = variables[i];
gs.info('Variable name: ' + variable.name);
gs.info('Variable value: ' + variable.value);
}
Was this answer helpful?
Please consider marking it correct or helpful.
Your feedback helps us improve!
Thank you!
Regards,
Amit Gujrathi

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-15-2023 05:05 AM
Hi Amit,
Thanks for your response, I think this gets me most of the way there. The issue I'm now running into is this.
Is there a scoped alternative for this?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
10-04-2024 04:56 AM
Hi Mark/All,
Please try code below:
var gr = new GlideRecord("table_name");
if(gr.get("sys_id")){
for(var variableName in gr.variables){
if (variableName == "variable_set_name"){
for (var variableSet_variableName in gr.variables[variableName]){
gs.info ("Variable Set Variable name: " + variableSet_variableName );
gs.info ("Variable Set Variable Value: " + gr.variables[variableName][variableSet_variableName].getDisplayValue());
}
} else{
gs.info("Variable name: " + variableName );
gs.info("Variable Value: " + gr.variables[variableName].getDisplayValue());
}
}
}