
Create Template:
change.itil.approve.role.custom
Sibject:${sysapproval.sys_class_name} ${sysapproval} Approval Request
Hi ${approver},
Please review the request and take appropriate action.
Request Details:
${mail_script:request_item_summary_custom}
${mail_script:mail_to_custom}
Approval Activity:
${mail_script:approval_activity}
Click here to view Approval Request: ${URI+&sysparm_record_target=sysapproval_approver}
Click here to view ${sysapproval.sys_class_name}: ${sysapproval.URI}
Mail Script:
request_item_summary_custom
var keys = [];
if (current.sysapproval.sys_class_name == 'sc_req_item') {
var html = '<table style="height: 13px; width: 75%; border-collapse: collapse"; border="1"><tbody>';
html = html + '<tr style="height: 13px;">';
html = html + '<td style="width: 45%; height: 13px;"><strong>';
html = html + 'Number:</strong></td>';
html = html + '<td style="width: 30%; height: 13px;">';
html = html + current.sysapproval.number + '</td></tr>';
html = html + '<tr style="height: 13px;">';
html = html + '<td style="width: 45%; height: 13px;"><strong>';
html = html + 'Short Description:</strong></td>';
html = html + '<td style="width: 30%; height: 13px;">';
html = html + current.sysapproval.short_description + '</td></tr>';
html = html + '<tr style="height: 13px;">';
html = html + '<td style="width: 45%; height: 13px;"><strong>';
html = html + 'Created By:</strong></td>';
html = html + '<td style="width: 30%; height: 13px;">';
html = html + current.sysapproval.opened_by.getDisplayValue() + '</td></tr>';
html = html + '<tr style="height: 13px;">';
html = html + '<td style="width: 45%; height: 13px;"><strong>';
html = html + 'Date Created:</strong></td>';
html = html + '<td style="width: 30%; height: 13px;">';
html = html + current.sysapproval.opened_at.getDisplayValue() + '</td></tr>';
var set = new GlideappVariablePoolQuestionSet();
set.setRequestID(current.sysapproval);
set.load();
var vs = set.getFlatQuestions();
for (var i = 0; i < vs.size(); i++) {
if (vs.get(i).getLabel() != '' && vs.get(i).getDisplayValue() != '' && vs.get(i).getDisplayValue() != 'No') {
html = html + '<tr style="height: 13px;">';
var quest = vs.get(i).getLabel();
html = html + '<td style="width: 45%; height: 13px;"><strong>';
html = html + quest.replace("?", "") + ':</strong></td>';
html = html + '<td style="width: 30%; height: 13px;">';
if (vs.get(i).getDisplayValue() == 'true') {
html = html + 'Yes' + '</td></tr>';
} else if (vs.get(i).getDisplayValue() == 'false') {
html = html + 'No' + '</td></tr>';
} else {
html = html + vs.get(i).getDisplayValue() + '</td></tr>';
}
}
}
html = html + '</table>';
template.print(html);
}
var set = new GlideappSequencedQuestionSet();
set.setTableName(current.sysapproval.sys_class_name);
set.setTableSysID(current.sysapproval);
set.load();
var vs = set.getFlatQuestions();
if (vs.size() > 0)
printVariables(vs);
function printVariables(vs) {
template.space(4);
template.print("Summary of Change request:<br />");
for (var i = 0; i < vs.size(); i++) {
if (vs.get(i).getLabel() != '')
template.space(4);
template.print(' ' + vs.get(i).getLabel() + " = " + vs.get(i).getDisplayValue() + "<br />");
}
}
2. mail_to_custom
(function runMailScript(/* GlideRecord */ current, /* TemplatePrinter */ template,
/* Optional EmailOutbound */ email, /* Optional GlideRecord */ email_action,
/* Optional GlideRecord */ event) {
// Add your code here
var html = '<table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="25%">';
var number = current.document_id.number;
html = html + "<a href='mailto:" + gs.getProperty('instance_name') +"@service-now.com?subject=Re%3A" + number + "%20-%20approve&body=%0A%0A"+ email.watermark +"%20' target='_blank' style='font-size: 16px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; border-radius: 3px; background-color: #057E1F; border-top: 12px solid #057E1F; border-bottom: 12px solid #057E1F; border-right: 18px solid #057E1F; border-left: 18px solid #057E1F; display: inline-block;'> Approve </a></td><td width='25%'>";
html = html + "<a href='mailto:" + gs.getProperty('instance_name') +"@service-now.com?subject=Re%3A" + number + "%20-%20reject&body=%0A%0A"+ email.watermark +"%20' target='_blank' style='font-size: 16px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; border-radius: 3px; background-color: #CA0000; border-top: 12px solid #CA0000; border-bottom: 12px solid #CA0000; border-right: 18px solid #CA0000; border-left: 18px solid #CA0000; display: inline-block;'> Reject </a></td> </tr></table>";
template.print(html);
})(current, template, email, email_action, event);
3. approval_activity
(function runMailScript(/* GlideRecord */ current, /* TemplatePrinter */ template,
/* Optional EmailOutbound */ email, /* Optional GlideRecord */ email_action,
/* Optional GlideRecord */ event) {
var approvers = new GlideRecord('sysapproval_approver');
approvers.addNotNullQuery('approver');
approvers.addQuery('approver', '!=', current.approver);
if (!gs.nil(current.sysapproval))
approvers.addQuery('sysapproval', current.sysapproval);
else
approvers.addQuery('document_id', String(current.document_id));
approvers.addQuery('state', 'IN', 'approved,rejected,requested');
approvers.orderBy('approver');
approvers.query();
var limit = 20;
approvers.setLimit(limit);
if (approvers.getRowCount() > 0) {
while (approvers.next()) {
template.print(approvers.approver.getDisplayValue() + ' - ' + approvers.state.getDisplayValue() + '<br/>');
}
if (approvers.getRowCount() > limit) {
template.print('Additional approvers are available and require viewing the record.<br/>');
}
} else {
template.print('You are the sole approver.<br/>');
}
})(current, template, email, email_action, event);
How to create an approval notification with action buttons and other necessary information.
Working Code Edited question August 26, 2025
Sorry, you do not have permission to read comments.