Using 'Event parm 1 contains recipient' to use in custom greeting on notification
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-12-2025 09:59 AM
Hi all,
I'm working on a process that automatically sends a notification to a leavers line manager after X amount of days to remind them that their hardware still needs collecting.
This works perfectly fine to a point. I have a business rule:
(function executeRule(current) {
var scheduler = new HardwareReminderScheduler();
scheduler.scheduleReminder(current.sys_id);
gs.info('[HardwareReminder] Scheduled reminder for task: ' + current.number + ' (' + current.sys_id + ')');
})(current);
Which triggers a script include:
var HardwareReminderScheduler = Class.create();
HardwareReminderScheduler.prototype = {
initialize: function() {},
scheduleReminder: function(taskSysId) {
gs.info('[HardwareReminderScheduler] Attempting to schedule reminder for task: ' + taskSysId);
var taskGR = new GlideRecord('sc_task');
if (!taskGR.get(taskSysId)) {
gs.error('[HardwareReminderScheduler] Invalid task sys_id: ' + taskSysId);
return;
}
var runAt = new GlideDateTime();
//runAt.addDaysUTC(1);
runAt.addMinutesUTC(3);
gs.info('[HardwareReminderScheduler] Scheduled to run at: ' + runAt.getDisplayValue());
var trigger = new GlideRecord('sys_trigger');
trigger.initialize();
trigger.name = 'Hardware Reminder for ' + taskGR.number;
trigger.next_action = runAt;
trigger.script = this._getScript(taskSysId);
trigger.trigger_type = 0; // 0 = Run once
var triggerSysId = trigger.insert();
if (triggerSysId) {
gs.info('[HardwareReminderScheduler] sys_trigger created successfully: ' + triggerSysId);
} else {
gs.error('[HardwareReminderScheduler] Failed to create sys_trigger for task: ' + taskGR.number);
}
},
_getScript: function(taskSysId) {
return `
var task = new GlideRecord('sc_task');
if (task.get('${taskSysId}') && task.active == true) {
var ritm = task.request_item.getRefRecord();
var user = task.variables.user || ritm.variables.user;
var assetGR = new GlideRecord('cmdb_ci_computer');
assetGR.addQuery('install_status', '1'); // Installed
assetGR.addQuery('assigned_to', user);
assetGR.addQuery('u_last_logged_in_user', user);
assetGR.query();
if (assetGR.hasNext()) {
var userGR = new GlideRecord('sys_user');
if (userGR.get(user) && userGR.manager) {
gs.eventQueue('hardware.retrieval.reminder', task, userGR.manager.toString(), gs.getUserID());
gs.info('[HardwareReminderScheduler] Reminder event sent to manager: ' + userGR.manager.name);
} else {
gs.info('[HardwareReminderScheduler] No manager found for user, event not sent.');
}
gs.info('[HardwareReminderScheduler] Event triggered for task: ' + task.number);
} else {
gs.info('[HardwareReminderScheduler] No matching hardware found for user.');
}
} else {
gs.info('[HardwareReminderScheduler] Task not active or not found.');
}
`;
},
type: 'HardwareReminderScheduler'
};
Which triggers an event that in turn triggers a notification. I then use 'Event parm 1 contains recipient' to set the recipient and this works perfectly well. However I have a requirement to customize the greeting to use the name of the manager. I've tried to achieve this using a script include:
function runMailScript(current, template, email, email_action, event) {
try {
var userSysId;
// Try from current record (e.g. if this is a RITM)
if (current.variables && current.variables.user) {
userSysId = current.variables.user;
gs.info('[MailScript] Got user sys_id from current.variables.user: ' + userSysId);
}
// Try from RITM if current is a Task
if (!userSysId && current.request_item) {
var ritm = current.request_item.getRefRecord();
if (ritm.variables && ritm.variables.user) {
userSysId = ritm.variables.user;
gs.info('[MailScript] Got user sys_id from RITM.variables.user: ' + userSysId);
}
}
if (!userSysId) {
gs.warn('[MailScript] No user sys_id found in variables.');
template.print('Manager');
return;
}
// Lookup user and manager
var userGR = new GlideRecord('sys_user');
if (userGR.get(userSysId)) {
gs.info('[MailScript] Loaded user: ' + userGR.name);
if (userGR.manager) {
var managerGR = userGR.manager.getRefRecord();
gs.info('[MailScript] Found manager: ' + managerGR.name);
gs.info('[MailScript] Manager first name: ' + managerGR.first_name);
template.print(managerGR.first_name);
return;
} else {
gs.warn('[MailScript] User has no manager assigned.');
}
} else {
gs.warn('[MailScript] Could not load user record for sys_id: ' + userSysId);
}
} catch (e) {
gs.error('[MailScript] Error: ' + e.message);
}
template.print('Manager');
}
However I've now come to a point where I think I've overcomplicated it in an attempt to make it work. I think the problem is that we're getting this manager from a reference (sys_user) variable on a catalog item for the name of the user that is leaving, and from here we dig in and retrieve their manager. I'm just wondering if there's an easier way to use the information from parm 1 to include it in the HTML of the email?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-12-2025 10:16 AM
You can simply access the event.parm1 and pick recipient, then query sys_user and get manager
${mail_script:mailScriptName}
Email script: something like this
(function runMailScript(current, template, email, email_action, event) {
// Add your code here
var recipient = event.parm1;
var gr = new GlideRecord("sys_user");
gr.addQuery("sys_id", recipient);
gr.query();
if (gr.next()) {
// use the manager to print
}
})(current, template, email, email_action, event);
If my response helped please mark it correct and close the thread so that it benefits future readers.
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-12-2025 08:23 PM
Hope you are doing good.
Did my reply answer your question?
If my response helped please mark it correct and close the thread so that it benefits future readers.
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-12-2025 10:29 AM - edited ‎05-12-2025 10:30 AM
Hi @LRhodes ,
you can pass the managerName in the second parameter
make it a stringified JSON
you can extend the JSONified param with additional info as well
since you have all the validations are in place and you are repeating the same in the email script you can follow this approach
Script Include
var HardwareReminderScheduler = Class.create();
HardwareReminderScheduler.prototype = {
initialize: function() {},
scheduleReminder: function(taskSysId) {
gs.info('[HardwareReminderScheduler] Attempting to schedule reminder for task: ' + taskSysId);
var taskGR = new GlideRecord('sc_task');
if (!taskGR.get(taskSysId)) {
gs.error('[HardwareReminderScheduler] Invalid task sys_id: ' + taskSysId);
return;
}
var runAt = new GlideDateTime();
//runAt.addDaysUTC(1);
runAt.addMinutesUTC(3);
gs.info('[HardwareReminderScheduler] Scheduled to run at: ' + runAt.getDisplayValue());
var trigger = new GlideRecord('sys_trigger');
trigger.initialize();
trigger.name = 'Hardware Reminder for ' + taskGR.number;
trigger.next_action = runAt;
trigger.script = this._getScript(taskSysId);
trigger.trigger_type = 0; // 0 = Run once
var triggerSysId = trigger.insert();
if (triggerSysId) {
gs.info('[HardwareReminderScheduler] sys_trigger created successfully: ' + triggerSysId);
} else {
gs.error('[HardwareReminderScheduler] Failed to create sys_trigger for task: ' + taskGR.number);
}
},
_getScript: function(taskSysId) {
return `var task = new GlideRecord('sc_task');
if (task.get('${taskSysId}') && task.active == true) {
var ritm = task.request_item.getRefRecord();
var user = task.variables.user || ritm.variables.user;
var assetGR = new GlideRecord('cmdb_ci_computer');
assetGR.addQuery('install_status', '1'); // Installed
assetGR.addQuery('assigned_to', user);
assetGR.addQuery('u_last_logged_in_user', user);
assetGR.query();
if (assetGR.hasNext()) {
var userGR = new GlideRecord('sys_user');
if (userGR.get(user) && userGR.manager) {
gs.eventQueue('hardware.retrieval.reminder', task, userGR.manager.toString(), JSON.stringify({
currentUser: gs.getUserID(),
managerName: userGr.manager.name
}));
gs.info('[HardwareReminderScheduler] Reminder event sent to manager: ' + userGR.manager.name);
} else {
gs.info('[HardwareReminderScheduler] No manager found for user, event not sent.');
}
gs.info('[HardwareReminderScheduler] Event triggered for task: ' + task.number);
} else {
gs.info('[HardwareReminderScheduler] No matching hardware found for user.');
}
} else {
gs.info('[HardwareReminderScheduler] Task not active or not found.');
}
`;
},
type: 'HardwareReminderScheduler'
};
Notification email script
function runMailScript(current, template, email, email_action, event) {
try {
template.print("Manager : ");
template.print(JSON.parse(event.parm2).managerName);
} catch (e) {
gs.error('[MailScript] Error: ' + e.message);
}
template.print('Manager');
}
Please mark my answer as helpful/correct if it resolves your query.
Regards,
Chaitanya
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-12-2025 10:33 AM
Hello @LRhodes ,
The event parameter 1 and 2 can also be an object, so you could pass multiple pieces of information to your email script.
For example:
gs.eventQueue('hardware.retrieval.reminder', task, userGR.manager.toString(), JSON.stringify({
userName: userGR.name.toString(),
managerName: userGR.manager.name.toString(),
managerFirstName: userGR.manager.first_name.toString()
}));
In your Email Script you can then do something like this:
var parameters = JSON.parse(event.parm2);
template.print('Hello ' + parameters.managerFirstName);
Regards,
Robert