Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

How to access variable set variables in flow designer

SHALIKAS
Tera Guru

I have created a custom action to run a script. But I am not sure how to access the variable set variables here. 

SHALIKAS_0-1713275748569.png

Also I need to use this script in all the catalog items. So how can I do this. 

1 ACCEPTED SOLUTION

Community Alums
Not applicable

Hi @SHALIKAS ,

Interestingly there doesn't seem to be an OOTB way of accessing Variables from a Variable Set directly using the "Flow Designer support for Service Catalog". 

Steps to do this for a MVS (for a Variable Set just use an object, not Array.object:

1. Create a custom Action:

Feed the custom action the RITM that you'll be using in the flow (I've been forced to feed it the RITM number/Sys ID, as for some reason unknown to me you can't feed the flow a single record, there is only multi record select). 

2. Create a Script Step:

Set the input variable to the request item (number/sys ID). Now in the script you'll need to GlideRecord into the RITM process the data into an Objects Array. In the below case I have looped through a multi variable set and set the OUTPUT variable to the newly created object.Array. 

(function execute(inputs, outputs) {
// ... code ...
    var ritm = new GlideRecord('sc_req_item');
  ritm.get(inputs.sc_req_item);
  
  var objectArray = [];
  var fullSet = ritm.variables.[YOUR VARIABLE SET NAME];
  
  for ( var i = 0 ; i < fullSet.getRowCount() ; i++){
    var item = {};
    item.hostType = fullSet[i].[VARIABLE NAME 1];
    item.hostName = fullSet[i].[VARIABLE NAME 2];
    item.hostOperatingName = fullSet[i].[VARIABLE NAME 3];
    item.networkZone = fullSet[i].[VARIABLE NAME 4];
    item.dataCenter = fullSet[i].[VARIABLE NAME 5];
    item.componentName = fullSet[i].[VARIABLE NAME 6];
    item.applicationImplementationLanguage = fullSet[i].[VARIABLE NAME 7];
    item.languageVersion = fullSet[i].[VARIABLE NAME 8];
    item.applicationServer = fullSet[i].[VARIABLE NAME 9];
    item.lifeCycleStage = fullSet[i].[VARIABLE NAME 10];
    item.brand = fullSet[i].[VARIABLE NAME 11];
    objectArray.push(item);
  }
  outputs.objectarray = objectArray;
  
})(inputs, outputs);

In the above case I've had to loop through depending on the row count, this is used in the case of a multi variable set (as the number of loops can vary from RITM to RITM). 

Tip: Remember to set outputs.NAME and not outputs.LABEL (easy mistake to make).

 

3. Set the Script Steps Output Variables:

You'll now need to set the output variable of the Script Step to the same structure of the object.Array you've created. Currently Flow Designer supports String, Integer, Date/Time, Choice, True/False and Object as outputs in your object. See below for my setup.

 

 

4. Parsing your data back to your flow

For this step you'll need to create a new object.Array output variable and drop the script steps output variable to the subflow output variable value:

 

 

5. (Optional) Accessing data in Flow when multi variable set used.

In the case of pulling data from a multi variable set you'll have to create a forEach loop in your Flow and loop through the object.Array to access the data as you'll have a variable number of objects in that Array. In the Case of a Variable Set you can just use an object output and not an Array.object.

 

View solution in original post

3 REPLIES 3

Community Alums
Not applicable

Hi @SHALIKAS ,

Interestingly there doesn't seem to be an OOTB way of accessing Variables from a Variable Set directly using the "Flow Designer support for Service Catalog". 

Steps to do this for a MVS (for a Variable Set just use an object, not Array.object:

1. Create a custom Action:

Feed the custom action the RITM that you'll be using in the flow (I've been forced to feed it the RITM number/Sys ID, as for some reason unknown to me you can't feed the flow a single record, there is only multi record select). 

2. Create a Script Step:

Set the input variable to the request item (number/sys ID). Now in the script you'll need to GlideRecord into the RITM process the data into an Objects Array. In the below case I have looped through a multi variable set and set the OUTPUT variable to the newly created object.Array. 

(function execute(inputs, outputs) {
// ... code ...
    var ritm = new GlideRecord('sc_req_item');
  ritm.get(inputs.sc_req_item);
  
  var objectArray = [];
  var fullSet = ritm.variables.[YOUR VARIABLE SET NAME];
  
  for ( var i = 0 ; i < fullSet.getRowCount() ; i++){
    var item = {};
    item.hostType = fullSet[i].[VARIABLE NAME 1];
    item.hostName = fullSet[i].[VARIABLE NAME 2];
    item.hostOperatingName = fullSet[i].[VARIABLE NAME 3];
    item.networkZone = fullSet[i].[VARIABLE NAME 4];
    item.dataCenter = fullSet[i].[VARIABLE NAME 5];
    item.componentName = fullSet[i].[VARIABLE NAME 6];
    item.applicationImplementationLanguage = fullSet[i].[VARIABLE NAME 7];
    item.languageVersion = fullSet[i].[VARIABLE NAME 8];
    item.applicationServer = fullSet[i].[VARIABLE NAME 9];
    item.lifeCycleStage = fullSet[i].[VARIABLE NAME 10];
    item.brand = fullSet[i].[VARIABLE NAME 11];
    objectArray.push(item);
  }
  outputs.objectarray = objectArray;
  
})(inputs, outputs);

In the above case I've had to loop through depending on the row count, this is used in the case of a multi variable set (as the number of loops can vary from RITM to RITM). 

Tip: Remember to set outputs.NAME and not outputs.LABEL (easy mistake to make).

 

3. Set the Script Steps Output Variables:

You'll now need to set the output variable of the Script Step to the same structure of the object.Array you've created. Currently Flow Designer supports String, Integer, Date/Time, Choice, True/False and Object as outputs in your object. See below for my setup.

 

 

4. Parsing your data back to your flow

For this step you'll need to create a new object.Array output variable and drop the script steps output variable to the subflow output variable value:

 

 

5. (Optional) Accessing data in Flow when multi variable set used.

In the case of pulling data from a multi variable set you'll have to create a forEach loop in your Flow and loop through the object.Array to access the data as you'll have a variable number of objects in that Array. In the Case of a Variable Set you can just use an object output and not an Array.object.

 

Community Alums
Not applicable

Hi @SHALIKAS ,

 

@SHALIKAS this is a very helpful post, it matches closely to what I am trying to achieve. Would you be able to elaborate a bit more on these steps copied below?  If you don't mind, could you post screenshots of how you configure the Action Input and Output. Thank you ! 🙂

1. Create a custom Action:

Feed the custom action the RITM that you'll be using in the flow (I've been forced to feed it the RITM number/Sys ID, as for some reason unknown to me you can't feed the flow a single record, there is only multi record select). 

2. Create a Script Step:

Set the input variable to the request item (number/sys ID).