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.

Transform map to create tasks and REQ and RITM

Giri6
Tera Expert

I need to create 70 service catalog tasks based on data from excel file. I need them to be part of one RITIM of REQ. Right now, I am creating REQ and RITM manually  and copying sysids and puttin in onBefore() trasform script as shown here.

Is it possible to automate to create REQ and RITM in transform map? I am thinking this how it can be done.

1. onStart() of transform script  create  REQ/RITM

2. Somehow pass those sysids of those two to onBefore of transform script

Appreciate your thoughts and any snippet on creating and also how I can share sysids to onBefore method.

--------

//onBefore()

(function runTransformScript(source, map, log, target /*/ ) {

    // Add your code here
    target.request_item = 'ff0ce23adbb31890de375278dc9619dd';
    target.request = '0fcbeaf6dbb31890de375278dc96191b';

})(source, map, log, target);

1 ACCEPTED SOLUTION

Jon23
Mega Sage

One solution is to use Flow designer to create your REQ/RITM. You then call this flow from your transform map via the onStart script and return the sysIDs of the REQ and RITM:

  • Create a Subflow in flow Designer
  • Add outputs to store the sysid of the REQ/RITM records it creates.
  • Create the required RITM/REQ record
  • Assign your Subflow outputs
  • Save and Publish the Subflow.

find_real_file.png

  • Once published, copy the 'Code snippet':

find_real_file.png

  • You should have something like this:
(function() {
	
	try {

		// Start Asynchronously: Uncomment to run in background. Code snippet will not have access to outputs.
		// sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inBackground().run();
				
		// Execute Synchronously: Run in foreground. Code snippet has access to outputs.
		var result = sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inForeground().run();
		var outputs = result.getOutputs();

		// Get Outputs:
		// Note: outputs can only be retrieved when executing synchronously.
		var req_sysid = outputs['req_sysid']; // String
		var ritm_sysid = outputs['ritm_sysid']; // String
		
	} catch (ex) {
		var message = ex.getMessage();
		gs.error(message);
	}
	
})();

 

  • In your tansform map create an onStart script and paste in your code snippet.
  • Modify the '//Get Outputs' section so the variables are prefixed with 'this.'
(function runTransformScript(source, map, log, target /*undefined onStart*/ ) {

        try {

            // Start Asynchronously: Uncomment to run in background. Code snippet will not have access to outputs.
            // sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inBackground().run();

            // Execute Synchronously: Run in foreground. Code snippet has access to outputs.
            var result = sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inForeground().run();
            var outputs = result.getOutputs();

            // Get Outputs:
            // Note: outputs can only be retrieved when executing synchronously.
            this.req_sysid = outputs['req_sysid']; // String
            this.ritm_sysid = outputs['ritm_sysid']; // String

		} catch (ex) {
            var message = ex.getMessage();
            gs.error(message);
        }

})(source, map, log, target);

 

  • Create script field maps to use the 'this.variable' on the required target fields:

find_real_file.png

source script example:

answer = (function transformEntry(source) {

	return this.req_sysid; // return the value to be put into the target field

})(source);

View solution in original post

5 REPLIES 5

Jon23
Mega Sage

One solution is to use Flow designer to create your REQ/RITM. You then call this flow from your transform map via the onStart script and return the sysIDs of the REQ and RITM:

  • Create a Subflow in flow Designer
  • Add outputs to store the sysid of the REQ/RITM records it creates.
  • Create the required RITM/REQ record
  • Assign your Subflow outputs
  • Save and Publish the Subflow.

find_real_file.png

  • Once published, copy the 'Code snippet':

find_real_file.png

  • You should have something like this:
(function() {
	
	try {

		// Start Asynchronously: Uncomment to run in background. Code snippet will not have access to outputs.
		// sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inBackground().run();
				
		// Execute Synchronously: Run in foreground. Code snippet has access to outputs.
		var result = sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inForeground().run();
		var outputs = result.getOutputs();

		// Get Outputs:
		// Note: outputs can only be retrieved when executing synchronously.
		var req_sysid = outputs['req_sysid']; // String
		var ritm_sysid = outputs['ritm_sysid']; // String
		
	} catch (ex) {
		var message = ex.getMessage();
		gs.error(message);
	}
	
})();

 

  • In your tansform map create an onStart script and paste in your code snippet.
  • Modify the '//Get Outputs' section so the variables are prefixed with 'this.'
(function runTransformScript(source, map, log, target /*undefined onStart*/ ) {

        try {

            // Start Asynchronously: Uncomment to run in background. Code snippet will not have access to outputs.
            // sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inBackground().run();

            // Execute Synchronously: Run in foreground. Code snippet has access to outputs.
            var result = sn_fd.FlowAPI.getRunner().subflow('global.my_req_ritm_subflow').inForeground().run();
            var outputs = result.getOutputs();

            // Get Outputs:
            // Note: outputs can only be retrieved when executing synchronously.
            this.req_sysid = outputs['req_sysid']; // String
            this.ritm_sysid = outputs['ritm_sysid']; // String

		} catch (ex) {
            var message = ex.getMessage();
            gs.error(message);
        }

})(source, map, log, target);

 

  • Create script field maps to use the 'this.variable' on the required target fields:

find_real_file.png

source script example:

answer = (function transformEntry(source) {

	return this.req_sysid; // return the value to be put into the target field

})(source);

Hello @Jon23 

 

I was trying to follow your instructions on how to create REQ/RITM using subflow.  However, I got stuck at Action 1 and 2.  What value do you pass in the requires Field?   Thank you

 

Jessica28_0-1684958568290.png

 

Hi @Jessica28 - The value may depend on what fields are required for those records on your instance. 

I think OOB there are any for sc_request so just pick one.  I would suggest the very least you would want something in the short description to help you identify the ones created.

Thank you for your help @Jon23 

 

I have a spreadsheet with 5 records. I used the following steps to create 5 requests.

  1. Created Data Source
  2. Created Transform Map
  3. Created Scheduled Import and attached the spreadsheet in it.

I would like to learn how to use “Flow Designer” to create 2 RITM for each of the requests and 1 task for each of the RITM.

For example:  

  • REQ0010240
    • RITM0027227
      • SCTASK0027324
  • REQ0010241
    •  RITM0027225
      • SCTASK0027564

Could you please provide suggestions how I can do this using Flow Designers?

Thank you