Execute Scheduled Jobs From UI Action

Ramananth1
Giga Contributor

Hello Everyone,

I have a requirement like I need to trigger 5 scheduled jobs from UI Action(List Banner Button) script.

For that I have written the script, but the issue i am facing is the while loop is taking only one sys_id from among the 5 scheduled jobs sys_ids.

Please need a suggestion on this to trigger all the queried sys_ids

UI Action Script :

runScript();

function runScript() {
var gr = new GlideRecord('sysauto_script');
gr.addEncodedQuery('sys_idIN690f3396db61d014b4dbb5b9689619f7,b7c91c1cdbad5850ae12ebd848961961,5f4f9f93db559810ae12ebd8489619a7,f701102fdb51d810ae12ebd8489619b6,1a9199abdb511c10ae12ebd84896199d');
gr.query();
while (gr.next()) {
SncTriggerSynchronizer.executeNow(gr);
}

}

Thanks & Regards

Ramananth

1 ACCEPTED SOLUTION

Hi,

nope

1 event, 1 script action

for event - don't give any table

Note: this is just an assumption that the job would complete in 5mins as there is dependency between those jobs; you give approx your time

Sample UI action script:

Note: Ensure you give valid scheduled job sys_id in the parameter

runScript();

function runScript() {

// for 1st job
var gdt = new GlideDateTime();
gdt.addSeconds(300);
gs.eventQueueScheduled("your_event_name", '', job1SysId ,gs.getUserName(),gdt);

// for 2nd job
var gdt = new GlideDateTime();
gdt.addSeconds(600);
gs.eventQueueScheduled("your_event_name", '', job2SysId ,gs.getUserName(),gdt);

// for 3rd job
var gdt = new GlideDateTime();
gdt.addSeconds(900);
gs.eventQueueScheduled("your_event_name", '', job3SysId ,gs.getUserName(),gdt);

// for 4th job
var gdt = new GlideDateTime();
gdt.addSeconds(1200);
gs.eventQueueScheduled("your_event_name", '', job4SysId ,gs.getUserName(),gdt);

// for 5th job
var gdt = new GlideDateTime();
gdt.addSeconds(1500);
gs.eventQueueScheduled("your_event_name", '', job5SysId ,gs.getUserName(),gdt);

}

Sample Script Action Script

var jobSysId = event.parm1; // this gives you job sys_id sent when event triggered

var gr = new GlideRecord('sysauto_script');
gr.addQuery('sys_id', jobSysId);
gr.query();
if(gr.next()) {
SncTriggerSynchronizer.executeNow(gr);
}

Mark Correct if this solves your issue and also mark 👍 Helpful if you find my response worthy based on the impact.
Thanks
Ankur

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

View solution in original post

18 REPLIES 18

Dhruv Gupta1
Kilo Sage
Kilo Sage

How about creating them as script include and calling them from UI action. I have not seen any use case where schedule job needs to be called from UI action

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

please simplify as below

Also add some info statements to verify those sys_ids are valid

Also the job won't run immediately. it will be added to queue and then it would run

runScript();

function runScript() {

var gr = new GlideRecord('sysauto_script');
gr.addEncodedQuery('sys_id', 'IN' , '690f3396db61d014b4dbb5b9689619f7,b7c91c1cdbad5850ae12ebd848961961,5f4f9f93db559810ae12ebd8489619a7,f701102fdb51d810ae12ebd8489619b6,1a9199abdb511c10ae12ebd84896199d');
gr.query();
while (gr.next()) {

gs.info('Inside Job for sys_id ' + gr.sys_id);

SncTriggerSynchronizer.executeNow(gr);
}

}

Mark Correct if this solves your issue and also mark 👍 Helpful if you find my response worthy based on the impact.
Thanks
Ankur

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

Pradeep Sharma
ServiceNow Employee
ServiceNow Employee

Hello Ramanath,

Script looks good to me. Can you print and check the row count of records. Add line gs.info('Row Count ' + gr.getRowCount()); after gr.query();

 

- Pradeep Sharma

Hi Pradeep,

Logs are already placed in each scheduled jobs those are queried, but the logs are logged only for first sys_id.

Thanks,

Ramananth