Using 'Event parm 1 contains recipient' to use in custom greeting on notification

LRhodes
Tera Guru

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?

4 REPLIES 4

Ankur Bawiskar
Tera Patron
Tera Patron

@LRhodes 

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.

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

@LRhodes 

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.

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

Chaitanya ILCR
Kilo Patron

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

 

Robert H
Mega Sage

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