Scriptable service catalog variables
Summarize
Summary of Scriptable service catalog variables
This content explains how ServiceNow customers can use scripting to access and manipulate service catalog variables within request items. It covers referencing individual variables, variable sets, and multi-row variable sets in both scoped and non-scoped environments. These scripting capabilities enable automation and customization of catalog item processing, such as creating configuration items based on user inputs.
Show less
Key Features
- Variable Referencing: Access variables using
current.variables.<variablename>. Variables in variable sets can be accessed ascurrent.variables.<variablesetname>.<variablename>. - Variable Sets Roles: Variable sets have read, write, and create roles that override individual variable roles, controlling access permissions.
- Script Examples:
- Printing and setting variable values.
- Creating CMDB records (e.g., computers) using variable values.
- GlideRecord Variables API: Methods to get variable values, elements, and details like label, read/write permissions, and decrypted values for masked variables.
- Multi-row Variable Sets: Support for accessing rows and cells, modifying values, adding or deleting rows, with relevant methods like
getRows(),addRow(), anddeleteRow(). - Handling Multi-row Variable Sets and Tasks: Examples show iterating over variables and multi-row variable sets within task records.
Important Notes and Limitations
- Variables must have a name to be referenced in scripts.
- Variables can only be set in before business rules; setting variables in after rules does not persist changes to the database.
- Variable naming collisions are not prevented; duplicate names will cause overwriting.
- Date/time variables use system-standard GMT storage and user-local display formatting.
- Multi-row variable sets support setting and getting values as JSON-like arrays of key-value pairs.
Practical Application for ServiceNow Customers
By leveraging these scripting methods, customers can dynamically read, update, and create catalog item variables and related records, enabling advanced automation of service catalog fulfillment processes. Understanding role-based access control on variable sets ensures secure handling of sensitive data. The APIs for multi-row variable sets facilitate complex forms with tabular data entry, enhancing catalog item flexibility.
These scripting capabilities empower customers to tailor the service catalog experience, automate asset creation, and integrate catalog data with the CMDB and other system components efficiently and securely.
You can use scripting to reference any request item variable from a table in scoped and non-scoped environment.
current.variables.<variable_name>When a variable is part of a variable set, you can reference it as current.variables.<variable_name> or current.variables.<variable_set_name>.<variable_name>.
Variable set is also a first-class citizen in Service Catalog. Like variables, a variable set has read, write, and create roles. If roles are provided for a variable set, the roles are applicable for the variables within the set. Roles of an individual variable are overridden by the roles of the variable set.
Print a variable
var original = current.variables.original_number;
gs.print(original);
Set a variable
current.variables.name = "Auto-Generated:" + current.variables.asset_tag;
Create an inventory item with fields set from variables
doCreation();
function doCreation ( ) {
var create = current.variables.create_item;
if (create == 'true') { // we want to create an asset
var computer = new GlideRecord('cmdb_ci_computer');
computer.initialize();
computer.asset_tag = current.variables.asset_tag;
computer.serial_number = current.variables.serial_number;
computer.name = current.variables.name;
computer.manufacturer = current.variables.company;
computer.insert(); } }
Get GlideElementVariable of variables and variable sets associated with a GlideRecord
now_GR.variables
Get the name value pair of variables associated with a GlideRecord
now_GR.variables.getVariableValue();
Get a list of GlideElementVariable for variables within a task record
now_GR.variables.getElements();
Get a list of GlideElementVariable for variables (including multi-row variable set) within a task record
now_GR.variables.getElements(true);
APIs for GlideElementVariable
- now_GR.variables.<var_name>.isMultiRow(): Get whether the GlideElementVariable is a multi-row variable set or a variable.
- now_GR.variables.<var_name>.getQuestion(): Get the Question object for a variable. Applicable only for a variable (isMultiRow() is false) and not for a multi-row variable set.
- now_GR.variables.<var_name>.getLabel(): Get the label of the GlideElementVariable. For a variable, the label of the variable is returned. For multi-row variable set, the title of the variable set is returned.
- now_GR.variables.<var_name>.canRead(): Get whether the user can view a variable or multi-row variable set.
- now_GR.variables.<var_name>.canWrite(): Get whether the user can edit a variable or multi-row variable set.
- now_GR.variables.<var_name>.getDecryptedValue(): Get the decrypted value for a masked variable. Applicable only for a masked variable.
- now_GR.variables.<var_name>.getRows(): Get the list of row objects for a multi-row variable set. Applicable only for a multi-row variable set (isMultiRow() is true).
- now_GR.variables.<var_name>.getRowCount(): Get the number of rows for multi-row variable set. Applicable only for a multi-row variable set (isMultiRow() is true).
Example to access variables of GlideRecord for the Task table
var now_GR = new GlideRecord('sc_req_item');
if (now_GR.get('635a1f5387320300e0ef0cf888cb0b73')) {
var variables = now_GR.variables.getElements();
for (var i=0;i<variables.length;i++) {
var question = variables[i].getQuestion();
gs.log(question.getLabel() + ":" + question.getValue())
}
}
Example to access a multi-row variable set of GlideRecord for the Task table
var now_GR = new GlideRecord('sc_req_item');
now_GR.get('02c38dcd87013300e0ef0cf888cb0bb2');
var vars = now_GR.variables.getElements(true);
for (var i=0; i<vars.length; i++) {
var now_V = vars[i];
if (now_V.isMultiRow()) {
var rows = now_V.getRows();
for (var j=0; j<now_V.getRowCount(); j++) {
var row = rows[j];
var cells = row.getCells();
for (var k=0; k<cells.length; k++) {
var cell = cells[k];
gs.info(cell.getLabel() + ":" + cell.getCellDisplayValue())
}
}
}
}
Multi-row variable set
| Operation | Usage |
|---|---|
| Table operations | |
| Return JSON array value as String | |
| Set value of a multi-row variable set |
Note: An array of ordered (key, value) pairs is also applicable as input. |
| Get value of column, var1, of a multi-row variable set | |
| Set value of a variable set, var1 |
Note: An array of ordered (key, value) pairs is also applicable as input. |
| Row operations | |
| Get the current row count | |
| Returns the row specified by the variable "i" - getRow(<int> i) | |
| Get the cell value for a question column mapped to <var_name> | |
| Set the cell value for a question column mapped to <var_name> | |
| Set the cell value for a question column mapped to <var_name> | |
| Add an empty row at the end of the table and return a scriptable object | |
| Delete a row | |
Notes and limitations
- //Single column of table_Var
- now_GR.variables.table_var.var1
- now_GR.variables.table_var.var1 = <val>
- You can only set a variable in a before business rule. Variables set in an after rule are not written to the database.
- There is nothing in place to prevent namespace collision with variables. Creating two variables named computer_speed would result in only one of them showing up; the second one would overwrite the first one.
- Date/time variables use the same time zone formatting and storage rules as all other dates in the system. They are stored internally in GMT, but translated into the user's local time zone and format for display.