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.

Scripted API to Query data before record creation

Chad R
Tera Expert

Hi All! I have a good one today, I have a requirement to create a scripted API to create standard changes from another in house product. All was going well until I hit a snag. The data coming from the in house product will be giving me string values only, meaning I have to query those strings to get the sys_ids of each of those fields before I can create the standard change. The script below is where I have left off, the records get created but the reference fields like requested_by and company are left empty. Any advice is greatly appreciated as always many thanks!

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

       this.status = '200';
    var respObj = {}; //declare the response object
    var payload = request.body.data;  //retrieving the JSON body
    var requested_by = payload.requested_by;  
    var company = payload.company;
    var business_service = payload.business_service;
    var assignment_group = payload.assignment_group;
    var change_tester = payload.u_change_tester;

(function(){

		var grinc = new GlideRecord("change_request");
    
        grinc.initialize();
        grinc.company = company;
        grinc.requested_by = requested_by;
        grinc.business_service = business_service;
        grinc.assignment_group = assignment_group;
        grinc.u_change_tester = change_tester;
		grinc.type = 'standard';
		grinc.std_change_producer_version = '3c1015d9874f911097842137cebb358f'; // Sys ID of the Standard Change Templates version
		grinc.applyTemplate('PUPS Production Monthly Patching');
        grinc.insert();
	
	var RB = new GlideRecord("sys_user");
	RB.addQuery('user_name', 'requested_by');
    RB.query();
	while(RB.next())
		{
		
		grinc.requested_by = RB;
		grinc.u_change_tester = RB;
		grinc.update();
		}
	
	

        this.status = '200';
        respObj.body = {
            "message": "Creation Success!",
            "detail": "Change " + grinc.number + " created successfully"
			
        };


    if (this.status == '200') {
        response.setBody(respObj);
        response.setStatus(this.status);
        return response;
    } else {
        var setError= new sn_ws_err.ServiceError();  //this API used to set the custom error messages
        setError.setStatus(this.status);
        setError.setMessage(respObj.body.message);
        setError.setDetail(respObj.body.detail);
        return setError;
    }
}());
})(request, response);

 

5 REPLIES 5

I finally got this syntax cleaned up and working like it should, thank you all for your ideas and help if I keep going with this format its working exactly how I want it to. Updating the code below with the mostly finished product. 

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    this.status = '200';
    var respObj = {}; //declare the response object
    var payload = request.body.data;  //retrieving the JSON body
    var requested_by = payload.requested_by;
    var company = payload.company;
    var business_service = payload.business_service;
    var assignment_group = payload.assignment_group;
    var change_tester = payload.u_change_tester;
//query change tester WIN ID and place into tester object
 
	var tester="";
	var CT = new GlideRecord("sys_user");
	CT.addQuery('u_win_id', change_tester);
    CT.query();
		if(CT.next()){
			tester=CT.sys_id;
		}
	//query business service with name and place into the BusinessServ Object
	var BusinessServ="";
	var BS = new GlideRecord('cmdb_ci_service');
	BS.addQuery('name', business_service);
	BS.query();
	if(BS.next()){
		BusinessServ=BS.sys_id;
	}
	//query the company record by name and place into the affcust object
	var affcust="";
	var cmp = new GlideRecord('core_company');
	cmp.addQuery('name', company);
	cmp.query();
	if(cmp.next()){
		affcust=cmp.sys_id;
	}
	// query the requested by user by WIN ID and place into the requested object
	var requested="";
	var RB = new GlideRecord('sys_user');
	RB.addQuery('u_win_id', requested_by);
	RB.query();
	if(RB.next()){
		requested=RB.sys_id;
	}
	// query the assignment group by name and place into the assignment object
	var assignment="";
	var AG = new GlideRecord('sys_user_group');
	AG.addQuery('name', assignment_group);
	AG.query();
	if(AG.next()){
		assignment=AG.sys_id;
	}
// create standard change with each queried object above and utilize the pups standard change template
		var grinc = new GlideRecord("change_request");
	
        grinc.initialize();
        grinc.company = affcust;
        grinc.requested_by = requested;
        grinc.business_service = BusinessServ;
        grinc.assignment_group = assignment;
        grinc.u_change_tester = tester;
		grinc.type = 'standard';
		grinc.std_change_producer_version = '3c1015d9874f911097842137cebb358f'; // Sys ID of the Standard Change Templates version
		grinc.applyTemplate('PUPS Production Monthly Patching');
        grinc.insert();
	
	
	
	

        this.status = '200';
        respObj.body = {
            "message": "Creation Success!",
            "detail": "Change " + grinc.number + " created successfully"
			
        };


    if (this.status == '200') {
        response.setBody(respObj);
        response.setStatus(this.status);
        return response;
    } else {
        var setError= new sn_ws_err.ServiceError();  //this API used to set the custom error messages
        setError.setStatus(this.status);
        setError.setMessage(respObj.body.message);
        setError.setDetail(respObj.body.detail);
        return setError;
    }
	
})(request, response);