Scheduled Jobs execute scripts automatically at specified times or intervals. They automate routine tasks like data cleanup, report generation, and maintenance.
Scheduled Jobs run in the background without user interaction. They're perfect for maintenance, batch processing, and scheduled operations.
// Scheduled Job: Close Old Incidents
// Run: Daily at 2:00 AM
// Repeat: Daily
(function() {
var gr = new GlideRecord('incident');
gr.addQuery('state', '6'); // Resolved
gr.addQuery('resolved_at', '<', gs.daysAgoStart(30));
gr.query();
var count = 0;
while (gr.next()) {
gr.state = '7'; // Closed
gr.close_code = 'Solved (Permanently)';
gr.close_notes = 'Auto-closed after 30 days';
gr.update();
count++;
}
gs.info('Auto-closed ' + count + ' old incidents');
})();
// Scheduled Job: Weekly Incident Report
// Run: Every Monday at 8:00 AM
(function() {
// Get incidents from last week
var ga = new GlideAggregate('incident');
ga.addQuery('sys_created_on', '>=', gs.daysAgoStart(7));
ga.groupBy('priority');
ga.addAggregate('COUNT');
ga.query();
var report = 'Weekly Incident Report\n\n';
while (ga.next()) {
var priority = ga.priority.getDisplayValue();
var count = ga.getAggregate('COUNT');
report += priority + ': ' + count + ' incidents\n';
}
// Send email
var email = new GlideEmailOutbound();
email.setSubject('Weekly Incident Report');
email.setBody(report);
email.addAddress('manager@company.com');
email.send();
gs.info('Weekly report sent');
})();
| Schedule Type | When It Runs | Example |
|---|---|---|
| Run once | One time only | Import data on specific date |
| Daily | Every day at specific time | Nightly cleanup at 2 AM |
| Weekly | Specific day(s) of week | Monday morning reports |
| Monthly | Specific day of month | First of month billing |
| Periodically | Every N minutes/hours | Every 15 minutes integration |
Events trigger automated actions like notifications, scripts, and workflows. They provide loose coupling between system components.
// Business Rule: Fire event when priority escalates
if (current.priority.changesFrom('3').changesTo('1')) {
gs.eventQueue('incident.priority.critical', current,
current.assigned_to, current.assignment_group);
}
// Script: Trigger custom event
gs.eventQueue('custom.order.shipped', orderRecord,
customer_sys_id, order_number);
// Fire event immediately (synchronous)
gs.eventQueueScheduled('incident.assigned', current,
gs.nowDateTime(), current.assigned_to);
// Script Action: incident.priority.critical
// Runs when event fires
(function(current, event) {
// Create high-priority task
var task = new GlideRecord('incident_task');
task.initialize();
task.parent = current.sys_id;
task.short_description = 'Urgent: Review critical incident ' + current.number;
task.priority = '1';
task.assigned_to = event.parm2; // From eventQueue parameter
task.insert();
// Log event
gs.info('Critical incident task created: ' + current.number);
})(current, event);
(function() {
try {
var startTime = new GlideDateTime();
gs.info('Starting scheduled job: MyJobName');
// Main logic
var gr = new GlideRecord('incident');
gr.addQuery('active', true);
gr.addQuery('priority', '1');
gr.setLimit(100); // Process in batches
gr.query();
var processed = 0;
while (gr.next()) {
try {
// Process each record
gr.state = '2';
gr.update();
processed++;
} catch (ex) {
gs.error('Error processing record ' + gr.number + ': ' + ex.message);
}
}
var endTime = new GlideDateTime();
var duration = GlideDateTime.subtract(startTime, endTime);
gs.info('Completed: Processed ' + processed + ' records in ' +
duration.getDisplayValue());
} catch (ex) {
gs.error('Scheduled job failed: ' + ex.message);
}
})();
gs.eventQueue() - Fire event