The CreatorCon Call for Content is officially open! Get started here.

Background Script to Close Open Requests, Requested Items, Tasks

Laurie Marlowe1
Kilo Sage

Hello,

We have a request to "cleanup" old Requests where some of the RITMs are still open because some of the Tasks were never completed.  I've got a background script working all except for closing the Tasks.

I've been given a list (a very long list) of the Request numbers that need to be cleaned up.  What is wrong with my script that I cannot get the tasks closed?  

        var scrs = ['SCR0111947', ]; //list of Requests that have open tasks - will get the list and format in Excel and paste into the script for the array

        for (var i = 0; i < scrs.length; i++) {
            var rec = new GlideRecord('sc_request');
            rec.addEncodedQuery('numberSTARTSWITH' + scrs[i]);
            rec.query();
            if (rec.next()) {
                rec.setWorkflow(false);
                rec.state = 4;
                rec.stage = 'closed_incomplete';
                rec.description = "Bulk closure of old tickets per SER0058621";
                rec.update();

                //find all the RITMs for each SCR

                var ritm = new GlideRecord('sc_req_item');
                ritm.addQuery('requestSTARTSWITH' + scrs[i]);
                ritm.addQuery('active', true);
                ritm.query();
                while (ritm.next()) {

                    ritm.setWorkflow(false);
                    ritm.state = 4;
                    ritm.stage = 'Request Cancelled';
                    ritm.update();
                }
                //find all the RTASKs for each SCR/RITM
				
                var rtask = new GlideRecord('sc_task');
                rtask.addQuery('request.numberSTARTSWITH' + scrs[i]);
                rtask.addQuery('active', true);
                while (rtask.next()) {
		    gs.print('SCR is ' + request.number);
                    rtask.setWorkflow(false);
                    rtask.state = 4;
                    rtaks.update();
                }
            }
        }
    

Any help is greatly appreciated! 

Thank you,

Laurie

1 ACCEPTED SOLUTION

Kieran Anson
Kilo Patron

You can condense this by using the updateMultiple function. Have you also considered cancelling the workflows/flows behind these records?

var SOURCE_REQUESTS = ['REQ0010027', 'REQ0010026','REQ0010011'];

var requestGR = new GlideRecord('sc_request');
requestGR.addQuery('number' , 'IN' , SOURCE_REQUESTS);
requestGR.setValue('state' , 4);
requestGR.setValue('request_state' , 'closed_incomplete');
requestGR.setValue('stage' , 'closed_incomplete');
requestGR.setValue('description' , 'Bulk closure of old tickets per SER0058621');
requestGR.setWorkflow(false);
requestGR.updateMultiple();

var requestItemGR = new GlideRecord('sc_req_item');
requestItemGR.addQuery('request.number' , 'IN' , SOURCE_REQUESTS);
requestItemGR.addActiveQuery();
requestItemGR.setValue('state' , 4);
requestItemGR.setValue('stage' , 'Request Cancelled');
requestItemGR.setWorkflow(false);
requestItemGR.updateMultiple();

var taskGR = new GlideRecord('sc_task');
taskGR.addQuery('request.number' , 'IN' , SOURCE_REQUESTS);
taskGR.addActiveQuery();
taskGR.setValue('state' , 4);
taskGR.setWorkflow(false);
taskGR.updateMultiple();

View solution in original post

8 REPLIES 8

Hi Shubham,

I have reviewed those links - thank you.

I am uncertain how to get the code written to cancel the workflows for the Requested Items when using:

requestItemGR.updateMultiple();

Laurie

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

Did you check any BR is restricting closure of sc_task?

What debugging have you performed so far?

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Hi Ankur,

This is for a background script to cleanup old tickets.  I have setWorkflow(false) so emails will not trigger.  This is preventing the business rules from closing tasks and cancelling workflows.  The original script close incompletes the Request, active Request Items, and active Tasks.  I don't know how to cancel the associated workflow to the Request Items when using updateMultiple().

Thank you,

Laurie

Laurie Marlowe1
Kilo Sage

Here is my final code which includes cancelling the workflows for the Requested Items

var SOURCE_REQUESTS = ['SCR0111939',];

var requestGR = new GlideRecord('sc_request');
requestGR.addQuery('number' , 'IN' , SOURCE_REQUESTS);
requestGR.setValue('state' , 4);
requestGR.setValue('request_state' , 'closed_incomplete');
requestGR.setValue('stage' , 'closed_incomplete');
requestGR.setValue('description' , 'Bulk closure of old tickets per SER0058621');
requestGR.setWorkflow(false);
requestGR.updateMultiple();

var requestItemGR = new GlideRecord('sc_req_item');
requestItemGR.addQuery('request.number' , 'IN' , SOURCE_REQUESTS);
requestItemGR.addActiveQuery();
requestItemGR.setValue('state' , 4);
requestItemGR.setValue('stage' , 'Request Cancelled');
requestItemGR.setWorkflow(false);
requestItemGR.updateMultiple();

//cancel workflows
var requestItemWF = new GlideRecord('sc_req_item');
requestItemWF.addQuery('request.number' , 'IN' , SOURCE_REQUESTS);
requestItemWF.query();
while(requestItemWF.next()){
requestItemWF.setWorkflow(false);
var workflow = new Workflow();
workflow.cancel(requestItemWF);
}

var taskGR = new GlideRecord('sc_task');
taskGR.addQuery('request.number' , 'IN' , SOURCE_REQUESTS);
taskGR.addActiveQuery();
taskGR.setValue('state' , 4);
taskGR.setWorkflow(false);
taskGR.updateMultiple();