Step execution scripts
Summarize
Summary of Step execution scripts
Step execution scripts in ServiceNow define the specific actions a step performs when it runs within a step configuration record. These scripts interact with inputs and outputs defined in the step configuration to control the step’s behavior and outcome.
Show less
Step Inputs and Outputs
- Step Inputs: Input variables are specified in the inputs related list of the step configuration. The script accesses these inputs through the
inputsparameter, e.g.,inputs.var1. - Step Outputs: Output variables are defined in the outputs related list. The script sets output values using the
outputsparameter, such asoutputs.out1.
Controlling Step Result
The stepResult parameter provides an API to mark the step as successful or failed and to log messages:
stepResult.setSuccess()marks the step as passed.stepResult.setFailed()marks the step as failed.stepResult.setOutputMessage(message)sets the log message for the step; the last message set overwrites any previous one.
Practical Script Examples
- Record Query Step: This script queries a specified table using encoded query inputs. It fails if no records match and passes with output values if records are found, logging the count and details.
- Custom Scripted Step with Timeout: This example waits asynchronously for a condition to complete, retrying once per second up to a timeout limit. It passes if the condition completes within the timeout and fails otherwise, logging progress and final status.
Usage Notes
The custom scripted example can also be adapted for server-side scripts by replacing stepResult.setSuccess() and stepResult.setFailed() with return true and return false, respectively.
In a step configuration record, the step execution script field determines what a step with this configuration does when it runs.
Step inputs
The input variables to a step are determined by the inputs related list in the step
configuration record. The inputs parameter to
executeScript() gives the script access to these variables. For example, if
the inputs related list contains two records, var1 and
var2, the script can reference var1 with the expression
inputs.var1 and can reference var2 with
inputs.var2.
Step outputs
The output variables to a step are determined by the outputs related list in the step
configuration record. The outputs parameter to
executeScript() gives the script access to these variables. For example, if
the outputs related list contains two records, out1 and
out2, the script can reference out1 with the expression
outputs.out1 and can reference out2 with
outputs.out2.
Step result
The stepResult parameter provides access to an API that controls whether the step passes or fails. It also determines the message the step writes to the log.
The method stepResult.setSuccess() causes the step to succeed. The method
stepResult.setFailed() causes the step to fail.
The method stepResult.setOutputMessage() sets the message to write to the log
when the step succeeds or fails. It takes one parameter: the string to write to the log. If the
script calls stepResult.setOutputMessage() more than once, the most recent
value set overwrites any previous value.
Record Query step execution script
(function executeStep(inputs, outputs, stepResult) {
if (gs.nil(inputs.table)) {
stepResult.setOutputMessage(gs.getMessage("The '{0}' input variable was not specified",
'table'));
stepResult.setFailed();
return;
}
var query = new GlideRecord(inputs.table);
query.addEncodedQuery(inputs.field_values);
query.query();
if (!query.next()) {
stepResult.setOutputMessage(gs.getMessage("No records matching query:\n{0}",
inputs.field_values));
stepResult.setFailed();
} else {
stepResult.setSuccess();
outputs.table = inputs.table;
outputs.first_record = query.getUniqueValue();
stepResult.setOutputMessage(gs.getMessage("Found {0} {1} records matching query:\n{2}",
[query.getRowCount(),
inputs.table,
inputs.field_values]));
}
}(inputs, outputs, stepResult));
Custom scripted step configs
((function executeStep(inputs, outputs, stepResult, timeout) {
// Waits up to the timeout for some asynchronous logic to finish
// This script checks for completion once a second for up to 60 seconds
var counter = 1;
// Try for up to 60 seconds
while (counter <= timeout) {
// If the asynchronous logic is finished, return "true" to pass the step
// isMyAsyncLogicFinished() can be replaced with any asynchronous event that needs to be tested
if (isMyAsyncLogicFinished()) {
stepResult.setOutputMessage("Success!");
stepResult.setSuccess();
return;
}
// Wait one second, and log the total number of seconds waited
gs.info("Waited " + counter + " seconds for asynchronous logic to finish");
sn_atf.AutomatedTestingFramework.waitOneSecond();
counter++;
}
// If this point is reached, the retry loop ran out of tries; return false to fail the step
stepResult.setOutputMessage("FAILURE: Timed out after waiting for " + timeout + " seconds");
stepResult.setFailed();
}(inputs, outputs, stepResult, timeout));
stepResult.setSuccess()” and stepResult.setFailed() with
return true and return false.