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.

Need to set value in MRVS via script

magee
Tera Guru

Requirement:

We have a multi-row variable set on a form. If the user enters more than 1 row on the MRVS, then create a RITM for each row after row 0.

 

Development so far:

I've been able to script a solution that will kick off a RITM for each row in the MRVS based on a great article by @Vishal Birajdar  (Create multiple RITM under single request dependin... - ServiceNow Community)

 

The script will create the RITM and what I need is to take data from a row in the MRVS and populate the MRVS on the new RITM

 

Example:

Bob is requesting software for 4 of his colleagues.

On the software form is a MRVS for Bob to enter the users who are getting the software:

magee_0-1701101832062.png

 

In the example above, 3 new RITMs will be created, started with Abe Lincoln, then Quintin, then Zack.

The script will create the 3 RITMs as expected.

I'm able to grab the data for each user, but my script to set the MRVS in the RITM is no populating via a Run Script in workflow editor.

Here's a snippet of the script that I'm trying to use to populate the MRVS:

var    v1 = parseMrvs[i].customer_name.toString();
 var   v2 = parseMrvs[i].network.toString();
 var   v3 = parseMrvs[i].business_need.toString();
var    v4 = parseMrvs[i].justification.toString();
var    v5 = parseMrvs[i].nro_customer.toString();
var    v6 = parseMrvs[i].customer_phone_number.toString();
var    v7 = parseMrvs[i].customer_email.toString();

	gs.info('MM in here line 164');
	gs.info('MM RITM sys_id ' + ritmSysId);
	gs.info('MM v1 ' + v1);
	gs.info('MM v2 ' + v2);
    var gr = new GlideRecord('sc_req_item');
    gr.get(ritmSysId);
    gr.query();
	gs.info('MM count: ' + gr.getRowCount());
    if (gr.next()) {
        var mrvs = gr.variables.u_customer_information;
        for (var rc = 0; rc < 1; rc++) {
            var newRow = mrvs.addRow();
            newRow.setCellValue('customer_name', v1);
            newRow.setCellValue('network', v2);
            newRow.setCellValue('business_need', v3);
            newRow.setCellValue('justification', v4);
            newRow.setCellValue('nro_customer', v5);
            newRow.setCellValue('customer_phone_number', v6);
            newRow.setCellValue('customer_email', v7);
//	    newRow.customer_name = v1;
//          newRow.network = v2;
//          newRow.business_need = v3;
//          newRow.justification = v4;
//          newRow.nro_customer = v5;
//          newRow.customer_phone_number = v6;
//          newRow.customer_email = v7;
        }
        gr.update();
    }

 

The log statements in the script show up perfectly so the data is there.

 

Here's the kicker:

When I run the code above in a background script, the MRVS will populate perfectly w/ the data (variables) I'm expecting.

 

So why would the script run in a background script but not a Run Script in Editor?

 

Any help is greatly appreciated

5 REPLIES 5

Vishal Birajdar
Giga Sage

Hi @magee 

 

If possible can you share the whole run script from workflow...!!!

 

 

Vishal Birajdar
ServiceNow Developer

I know one thing, and that is that I know nothing.
- Socrates

Hey @Vishal Birajdar 

Here's the code so far. Please note there are lots of comments for logs and other stuff

 

/* ============Start of run script activity===============*/
/* 1. Get values from user list variable */
var v1;
var v2;
var v3;
var v4;
var v5;
var v6;
var v7;
var mrvs = current.variables.u_customer_information.toString(); //customer MRVS name
var parseMrvs = JSON.parse(mrvs); //parse out mrvs
//var array = list.split(',');
gs.info('MM parse mrvs: ' + JSON.stringify(parseMrvs));

/* 2. Get current ritm’s request  this will be used to set request on multiple Ritm to be created*/
var request = current.request;
gs.info('MM request: ' + request);

/* 3. Store sys_id of our catalog item */
//var catalogItem = '3cecd2350a0a0a6a013a3a35a5e41c07';  // Not to hardcode (use system property)
var catalogItem = current.cat_item.toString(); //sys_id of catalog item
//var catalogItem = gs.getProperty(‘name of property where sysid of cat item stored’);

/* 4. loop through array we have created in 1 and create RITM */
/* Loop will initialize from 1 because we have creating one ritm from main request. */

for (var i = 1; i < parseMrvs.length; i++) { //if there are 5 records in the MRVS (0 1 2 3 4), this for loop will run 4 times (it will start at row 1)
    gs.info('MM parseMrvs length: ' + parseMrvs.length);
    /* 4a. Create RITM*/

    //Requester Information variables//
    var roomNum = current.variables.room_number.toString();
    var secEmail = current.variables.secure_email.toString();
    var building = current.variables.building.toString();
    var userName = current.variables.user_name.toString();
    var valOrg = current.variables.validating_organization.toString();
    var nonSecPhone = current.variables.non_secure_phone.toString();
    var secPhone = current.variables.secure_phone.toString();
    gs.info('MM Requester info: ' + 'Room Num: ' + roomNum + ' - ' + 'Secure Email: ' + secEmail + ' - ' + 'Building: ' + building + ' - ' + 'User Name: ' + userName + ' - ' + 'Validating Org: ' + valOrg + ' - ' + 'Non Sec Phone: ' + nonSecPhone + ' - ' + 'Secure Phone: ' + secPhone);

    //MRVS variables//
    v1 = parseMrvs[i].customer_name.toString();
    v2 = parseMrvs[i].network.toString();
    v3 = parseMrvs[i].business_need.toString();
    v4 = parseMrvs[i].justification.toString();
    v5 = parseMrvs[i].nro_customer.toString();
    v6 = parseMrvs[i].customer_phone_number.toString();
    v7 = parseMrvs[i].customer_email.toString();
    gs.info('MM Customer name: ' + v1 + ' Network: ' + v2 + ' Business Need: ' + v3 + ' Justificaiton ' + v4 + ' NRO Customer: ' + v5 + ' Phone: ' + v6 + ' Email: ' + v7);

    var grRitm = new GlideRecord("sc_req_item"); //this creates a new RITM
    grRitm.initialize();
    grRitm.cat_item = catalogItem;
    grRitm.price = current.price;
    grRitm.request = request;
    grRitm.requested_for = v1;
    grRitm.due_date = current.due_date;
    //Store the sys Id in another variable

    var ritmSysId = grRitm.insert(); //insert new RITM
    /*End of RITM creation*/
	ritmSysId = ritmSysId.toString();
    setMRVSvalues(ritmSysId);

    /* 4b. Store the variables from catalog Item in an array */
    //var itemName = grRitm.cat_item.name;
    var itemVar = new GlideRecord('item_option_new'); //this is the variable table
    itemVar.addEncodedQuery('variable_set.title=Requester Information^ORvariable_set.title=Customer Information'); //query variables for our variable sets
    itemVar.query();
    gs.info('MM itemVar length: ' + itemVar.getRowCount());
    var itemVarList = [];
    while (itemVar.next()) {
        itemVarList.push(itemVar.getUniqueValue('name')); //push variable name to itemVarList array. In the example above, there are 14 variables between the two variable sets
    }
    gs.info('MM itemVarList: ' + itemVarList);
    gs.info('MM itemVarList length: ' + itemVarList.length);
    /*End of Store the variables from catalog Item in an array */


    /* 4c.Create records in sc_item_option  */
    /* This table contains value of variable filled by end user , In this case we will update it through script */
    var itemOption = new GlideRecord('sc_item_option'); //values entered into portal form in the variables



    for (var j = 0; j < itemVarList.length; j++) { //if there are 14 variables in the itemVarList array above, this loop will run 14 times

        itemOption.initialize(); //create new record on sc_item_option table

        itemOption.order = j;
        itemOption.item_option_new = itemVarList[j]; //this sets the variable to the variable name in the arrary above

        //declare requester variable information for the RITM being created//
        if (itemOption.item_option_new == '6dd8b36e47123110d61db7f3846d43b0') { //variable for building
            itemOption.value = building; //set variable value for building
        }
        if (itemOption.item_option_new == 'fcf8fbae47123110d61db7f3846d4358') { //variable for non sec phone
            itemOption.value = nonSecPhone; //set variable value for non secure phone
        }
        if (itemOption.item_option_new == '58a8fb6e47123110d61db7f3846d43fb') { //variable for room number
            itemOption.value = roomNum; //set variable value for non secure phone
        }
        if (itemOption.item_option_new == '6a29bfae47123110d61db7f3846d43cd') { //variable for sec email
            itemOption.value = secEmail; //set variable value for secure email
        }
        if (itemOption.item_option_new == 'e019f36e47123110d61db7f3846d430a') { //variable for sec phone
            itemOption.value = secPhone; //set variable value for secure phone
        }
        if (itemOption.item_option_new == 'cb97736e47123110d61db7f3846d43f4') { //variable for user name
            itemOption.value = userName; //set variable value for user name
        }
        if (itemOption.item_option_new == 'ed58f36e47123110d61db7f3846d4339') { //variable for validating org
            itemOption.value = valOrg; //set variable value for validating org
        }

        // save the record in sc_item_option
        var optSysID = itemOption.insert();

        /* 4d. Create a relationship of RITM with variables value */
        var ritmM2M = new GlideRecord('sc_item_option_mtom');
        ritmM2M.initialize();
        ritmM2M.request_item = ritmSysId; // Parent Item
        ritmM2M.sc_item_option = optSysID; // Dependent Value
        ritmM2M.insert();
    }

    /* 4e. Start the workflow (sys_id of workflow from "wf_workflow" table  “Copy of Procurement Process Flow - Hardware”)*/

    startWorkflow('492da4c347163110d61db7f3846d4388');

    /*for startWorkflow() – Taken reference from OOTB Business rule from RITM table
    Business rule : Start Workflow
    */

}

/* 4. End of loop through array we have created in 1 and create RITM */

/* Attach workflow to Ritm */
function startWorkflow(id) {
    var grRitm1 = new GlideRecord("sc_req_item");
    grRitm1.addQuery("sys_id", ritmSysId);
    grRitm1.query();
    if (grRitm1.next()) {
        var w = new Workflow();
        var context = w.startFlow(id, grRitm1, grRitm1.operation(), getVars(grRitm1));
        if (context != null)
            grRitm1.context = context.sys_id;
        workflow.info("context = " + grRitm1.context);

    }
    grRitm1.update();
}
/* Send the RITM variables to workflow*/
function getVars(grRitm1) {
    var vars = {};
    for (var n in grRitm1.variables)
        vars[n] = grRitm1.variables[n];

    return vars;
}

function setMRVSvalues(ritmSysId) {
    //set MRVS values in RITM created
	gs.info('MM in here line 164');
	gs.info('MM RITM sys_id ' + ritmSysId);
	gs.info('MM v1 ' + v1);
	gs.info('MM v2 ' + v2);
    var gr = new GlideRecord('sc_req_item');
    gr.get(ritmSysId);
    gr.query();
	gs.info('MM count: ' + gr.getRowCount());
    if (gr.next()) {
        var mrvs = gr.variables.u_customer_information;
        for (var rc = 0; rc < 1; rc++) {
            var newRow = mrvs.addRow();
            newRow.setCellValue('customer_name', v1);
            newRow.setCellValue('network', v2);
            newRow.setCellValue('business_need', v3);
            newRow.setCellValue('justification', v4);
            newRow.setCellValue('nro_customer', v5);
            newRow.setCellValue('customer_phone_number', v6);
            newRow.setCellValue('customer_email', v7);
//			newRow.customer_name = v1;
//          newRow.network = v2;
//          newRow.business_need = v3;
//          newRow.justification = v4;
//          newRow.nro_customer = v5;
//          newRow.customer_phone_number = v6;
//          newRow.customer_email = v7;
        }
        gr.update();
    }
}
/*Update User list for main (current) RITM*/
//current.variables.user_list = parseMrvs[0];
//current.requested_for = parseMrvs[0];

/*====================End of run script Activity===============================*/

Hi @magee 

 

I tried with MRVS , unfortunately I did not find a way to attach MRVS to new RITM from script.

 

but below is workaround not sure if that helps you or not...

 

Workaround : 

 

Step 1 : Create new normal variables same as present on MRVS such as Name,Network,Business need etc.

Step 2 : Hide these on Catalog form & make Visible on RITM & Catalog task.

Step 3 : In workflow run script, loop through MRVS  (we will get the Data from MRVS) and update the variables created in Step 1 for each RITM (RITM Created through script).

 

With this we will have data on RITM for separate row of MRVS.

 

Hope this helps...!!

 

 

 

 

 

 

 

 

 

Vishal Birajdar
ServiceNow Developer

I know one thing, and that is that I know nothing.
- Socrates

I'm going to try calling a script include to see if that will add the data to the MRVS. Stand by