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.