0

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.