From 0f69f5dc3857455e1fcdb744e715b94068f0702a Mon Sep 17 00:00:00 2001 From: keshava-palisetti Date: Mon, 27 Oct 2025 18:26:20 +0530 Subject: [PATCH 1/2] Create Readme.md Auto assign unassigned incidents --- .../Readme.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/Readme.md diff --git a/Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/Readme.md b/Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/Readme.md new file mode 100644 index 0000000000..5f3f165b7c --- /dev/null +++ b/Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/Readme.md @@ -0,0 +1,16 @@ +This scheduled job automatically assigns unassigned incidents in ServiceNow to a random active user from the incident’s assignment group, but only if the incident is at least 30 minutes old. +It ensures timely triaging of new incidents and avoids backlog accumulation caused by unassigned tickets. + +How It Works + +Identify Eligible Incidents + Fetch all incidents from the incident table whereassigned_to is empty (unassigned) and assignment_group is not empty + +Find Active Group Members + For each incident, look up the related group (sys_user_grmember table).Join with the sys_user table. This allows filtering users based on their active status. + +Random Assignment + From the list of active members, pick a random user. Assign that user to the incident’s Assigned To field + +Update & Log + Update the incident record in the database. Log success or skip messages to the system log From e67004aabbe84aeb78d8945745e303a4c8e97f3a Mon Sep 17 00:00:00 2001 From: keshava-palisetti Date: Mon, 27 Oct 2025 18:32:24 +0530 Subject: [PATCH 2/2] ServiceNow code snippet Scheduled job to auto-assign unassigned incidents --- ..._unassigned_incidents_via_scheduled_job.js | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/auto_assign_unassigned_incidents_via_scheduled_job.js diff --git a/Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/auto_assign_unassigned_incidents_via_scheduled_job.js b/Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/auto_assign_unassigned_incidents_via_scheduled_job.js new file mode 100644 index 0000000000..7d08148f1a --- /dev/null +++ b/Server-Side Components/Scheduled Jobs/Auto-Assign Unassigned Incidents Older Than 30 Minutes/auto_assign_unassigned_incidents_via_scheduled_job.js @@ -0,0 +1,82 @@ +(function executeAutoAssignment() { + // --- CONFIGURABLE SETTINGS --- + var MINUTES_DELAY = 30; // Only assign incidents older than this many minutes + + // --- COMPUTE TIME CUTOFF --- + var cutoffTime = new GlideDateTime(); + cutoffTime.addMinutes(-MINUTES_DELAY); // incidents created before this time are eligible + + // --- QUERY: Find eligible unassigned incidents --- + var incGr = new GlideRecord('incident'); + incGr.addNullQuery('assigned_to'); // incident not yet assigned + incGr.addNotNullQuery('assignment_group'); // has an assignment group + incGr.addQuery('sys_created_on', '<=', cutoffTime); // created at least 30 minutes ago + incGr.query(); + + var totalAssigned = 0; + + // --- LOOP THROUGH EACH ELIGIBLE INCIDENT --- + while (incGr.next()) { + var groupSysId = incGr.assignment_group.toString(); + if (!groupSysId) { + gs.info('[AutoAssign] Skipped ' + incGr.number + ': No assignment group defined.'); + continue; + } + + // --- FETCH ACTIVE USERS IN THAT ASSIGNMENT GROUP --- + var members = getActiveGroupMembers(groupSysId); + + if (members.length === 0) { + gs.info('[AutoAssign] Skipped ' + incGr.number + ': No active users found in group ' + incGr.assignment_group.name); + continue; + } + + // --- PICK A RANDOM USER --- + var assignedUser = getRandomElement(members); + + // --- ASSIGN AND UPDATE --- + incGr.assigned_to = assignedUser; + incGr.update(); + + gs.info('[AutoAssign] Incident ' + incGr.number + ' assigned to user: ' + assignedUser); + totalAssigned++; + } + + gs.info('[AutoAssign] Total incidents auto-assigned: ' + totalAssigned); + + // ------------------------------------------------------------------- + // --- HELPER FUNCTIONS --- + // ------------------------------------------------------------------- + + /** + * Fetches all active users in a given assignment group. + * @param {String} groupSysId - sys_id of assignment group + * @returns {Array} - Array of user sys_ids + */ + function getActiveGroupMembers(groupSysId) { + var users = []; + var grMember = new GlideRecord('sys_user_grmember'); + grMember.addQuery('group', groupSysId); + grMember.addJoinQuery('sys_user', 'user', 'sys_id'); + grMember.addQuery('user.active', true); + grMember.query(); + + while (grMember.next()) { + users.push(grMember.user.toString()); + } + return users; + } + + /** + * Returns a random element from an array. + * @param {Array} arr + * @returns {*} Random element + */ + function getRandomElement(arr) { + if (!arr || arr.length === 0) return null; + var index = Math.floor(Math.random() * arr.length); + return arr[index]; + } + +})(); +