Insert Approval BR
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-11-2025 05:45 AM
Hey everyone,
I have an After Insert/Update Business Rule that is designed to:
- Insert approvals in the Review stage for users listed in the Reviewers field (which is a List type).
- When the Reviewers field value changes, insert new approvals accordingly.
- When the State changes from "Awaiting Approval" to "Review", insert new approvals and mark previously inserted approvals for the current reviewer as "Not Required."
However, the script is not working as expected. I’ve made some changes, but I’m still unable to get it to function correctly.
I’d really appreciate any insights into where I might be going wrong.
Thank you in advance for your help!
After Insert/Update Business rule-
Condition- state is review OR reviewer changes OR state changesto review
(function executeRule(current, previous /*null when async*/ ) {
var currentReviewer = current.reviewers.split(',');
var previousReviewer = [];
if (previous && previous.reviewers != '') {
previousReviewer = previous.reviewers.split(',');
}
var changesToReview = previous.state != 'review' && current.state == 'review';
var awaitingToReview = previous.state == 'awaiting_approval' && current.state == 'review';
for (var i = 0; i < currentReviewer.length; i++) {
if (previousReviewer.length == 0 || previousReviewer.indexOf(currentReviewer[i]) == -1 || changesToReview || awaitingToReview) {
var approvalrecord = new GlideRecord('sysapproval_approver');
approvalrecord.addQuery('approver', currentReviewer[i]);
approvalrecord.addQuery('document_id', current.sys_id);
approvalrecord.addEncodedQuery('stateNOT INrejected,not_required,approved,cancelled');
approvalrecord.addQuery('u_reviewers', true);
approvalrecord.query();
if (!approvalrecord.next()) { // Add approval if not found
approvalrecord.initialize();
approvalrecord.approver = currentReviewer[i] + '';
approvalrecord.source_table = 'sn_compliance_policy';
approvalrecord.document_id = current.sys_id;
approvalrecord.state = 'requested';
approvalrecord.u_reviewers = true;
approvalrecord.insert();
} else {
approvalrecord.state = 'requested';
approvalrecord.update();
}
}
}
for (var j = 0; j < previousReviewer.length; j++) {
if (currentReviewer.indexOf(previousReviewer[j]) == -1) {
var approvalrecord2 = new GlideRecord('sysapproval_approver');
approvalrecord2.addQuery('approver', previousReviewer[j]);
approvalrecord2.addQuery('document_id', current.sys_id);
approvalrecord2.addQuery('u_reviewers', true);
approvalrecord2.addEncodedQuery('stateNOT INrejected,not_required');
approvalrecord2.query();
if (approvalrecord2.next()) {
approvalrecord2.state = 'not_required';
approvalrecord2.update();
}
}
}
// Update approval records when state changes from "awaiting_approval" to "review"
for (var k = 0; k < currentReviewer.length; k++) {
if (awaitingToReview) {
var approvalUpdate = new GlideRecord('sysapproval_approver');
approvalUpdate.addQuery('approver', currentReviewer[k]);
approvalUpdate.addQuery('document_id', current.sys_id);
approvalUpdate.addQuery('u_reviewers', true);
approvalUpdate.addEncodedQuery('stateNOT INrejected,not_required');
approvalUpdate.query();
if (approvalUpdate.next()) {
approvalUpdate.state = 'not_required'; // Or any other appropriate state
approvalUpdate.update();
}
}
}
})(current, previous);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-11-2025 06:00 AM
try this and add logs and debug
(function executeRule(current, previous /*null when async*/ ) {
var currentReviewer = current.reviewers.split(',');
var previousReviewer = [];
if (previous && previous.reviewers != '') {
previousReviewer = previous.reviewers.split(',');
}
var changesToReview = previous.state != 'review' && current.state == 'review';
var awaitingToReview = previous.state == 'awaiting_approval' && current.state == 'review';
// Insert new approvals
for (var i = 0; i < currentReviewer.length; i++) {
if (previousReviewer.length == 0 || previousReviewer.indexOf(currentReviewer[i]) == -1 || changesToReview || awaitingToReview) {
var approvalrecord = new GlideRecord('sysapproval_approver');
approvalrecord.addQuery('approver', currentReviewer[i]);
approvalrecord.addQuery('document_id', current.sys_id);
approvalrecord.addEncodedQuery('stateNOT INrejected,not_required,approved,cancelled');
approvalrecord.addQuery('u_reviewers', true);
approvalrecord.query();
if (!approvalrecord.next()) { // Add approval if not found
approvalrecord.initialize();
approvalrecord.approver = currentReviewer[i] + '';
approvalrecord.source_table = 'sn_compliance_policy';
approvalrecord.document_id = current.sys_id;
approvalrecord.state = 'requested';
approvalrecord.u_reviewers = true;
approvalrecord.insert();
} else {
approvalrecord.state = 'requested';
approvalrecord.update();
}
}
}
// Mark previous approvals as "not_required"
for (var j = 0; j < previousReviewer.length; j++) {
if (currentReviewer.indexOf(previousReviewer[j]) == -1) {
var approvalrecord2 = new GlideRecord('sysapproval_approver');
approvalrecord2.addQuery('approver', previousReviewer[j]);
approvalrecord2.addQuery('document_id', current.sys_id);
approvalrecord2.addQuery('u_reviewers', true);
approvalrecord2.addEncodedQuery('stateNOT INrejected,not_required');
approvalrecord2.query();
if (approvalrecord2.next()) {
approvalrecord2.state = 'not_required';
approvalrecord2.update();
}
}
}
// Update approval records when state changes from "awaiting_approval" to "review"
for (var k = 0; k < currentReviewer.length; k++) {
if (awaitingToReview) {
var approvalUpdate = new GlideRecord('sysapproval_approver');
approvalUpdate.addQuery('approver', currentReviewer[k]);
approvalUpdate.addQuery('document_id', current.sys_id);
approvalUpdate.addQuery('u_reviewers', true);
approvalUpdate.addEncodedQuery('stateNOT INrejected,not_required');
approvalUpdate.query();
if (approvalUpdate.next()) {
approvalUpdate.state = 'not_required'; // Or any other appropriate state
approvalUpdate.update();
}
}
}
})(current, previous);
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
‎03-11-2025 06:51 AM
Hello @Ankur Bawiskar ,
I’ve made changes in my script as suggested by you but can’t get it to function correctly. The script is marking all newly inserted approvals for the current reviewers as "Not Required," which means no approvals remain in the "Review" stage.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-11-2025 08:18 AM
what debugging did you perform?
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-11-2025 06:05 AM - edited ‎03-11-2025 06:07 AM
Hi @Utkarsha - this should work -
(function executeRule(current, previous /*null when async*/ ) {
// Log initial state
gs.log('start approval business rule', 'approval_rule');
gs.log('Current state: ' + current.state, 'approval_rule');
gs.log('Previous state: ' + (previous ? previous.state : 'null'), 'approval_rule');
// Get reviewers arrays with logging
var currentReviewer = current.reviewers.split(',');
var previousReviewer = [];
if (previous && previous.reviewers != '') {
previousReviewer = previous.reviewers.split(',');
}
gs.log('current reviewer: ' + currentReviewer.join('|'), 'approval_rule');
gs.log('previous reviewers: ' + previousReviewer.join('|'), 'approval_rule');
// State change flags with logging
var changesToReview = previous.state != 'review' && current.state == 'review';
var awaitingToReview = previous.state == 'awaiting_approval' && current.state == 'review';
gs.log('state to review: ' + changesToReview, 'approval_rule');
gs.log('awaiting to review: ' + awaitingToReview, 'approval_rule');
// Insert new approvals with logging
for (var i = 0; i < currentReviewer.length; i++) {
if (previousReviewer.length == 0 || previousReviewer.indexOf(currentReviewer[i]) == -1 || changesToReview || awaitingToReview) {
var approvalrecord = new GlideRecord('sysapproval_approver');
approvalrecord.addQuery('approver', currentReviewer[i]);
approvalrecord.addQuery('document_id', current.sys_id);
approvalrecord.addEncodedQuery('stateNOT INrejected,not_required,approved,cancelled');
approvalrecord.addQuery('u_reviewers', true);
approvalrecord.query();
gs.log('processing reviewer: ' + currentReviewer[i], 'approval_rule');
if (!approvalrecord.next()) {
approvalrecord.initialize();
approvalrecord.approver = currentReviewer[i] + '';
approvalrecord.source_table = 'sn_compliance_policy';
approvalrecord.document_id = current.sys_id;
approvalrecord.state = 'requested';
approvalrecord.u_reviewers = true;
var result = approvalrecord.insert();
gs.log('create new approval for ' + currentReviewer[i] + ': ' + result, 'approval_rule');
} else {
approvalrecord.state = 'requested';
var result = approvalrecord.update();
gs.log('Updated existing approval for ' + currentReviewer[i] + ': ' + result, 'approval_rule');
}
}
}
// Mark previous approvals as "not_required" with logging
for (var j = 0; j < previousReviewer.length; j++) {
if (currentReviewer.indexOf(previousReviewer[j]) == -1) {
var approvalrecord2 = new GlideRecord('sysapproval_approver');
approvalrecord2.addQuery('approver', previousReviewer[j]);
approvalrecord2.addQuery('document_id', current.sys_id);
approvalrecord2.addQuery('u_reviewers', true);
approvalrecord2.addEncodedQuery('stateNOT INrejected,not_required');
approvalrecord2.query();
if (approvalrecord2.next()) {
approvalrecord2.state = 'not_required';
var result = approvalrecord2.update();
gs.log('mark approval as not_required for ' + previousReviewer[j] + ': ' + result, 'approval_rule');
}
}
}
// Update approval records when state changes from "awaiting_approval" to "review"
if (awaitingToReview) {
for (var k = 0; k < currentReviewer.length; k++) {
var approvalUpdate = new GlideRecord('sysapproval_approver');
approvalUpdate.addQuery('approver', currentReviewer[k]);
approvalUpdate.addQuery('document_id', current.sys_id);
approvalUpdate.addQuery('u_reviewers', true);
approvalUpdate.addEncodedQuery('stateNOT INrejected,not_required');
approvalUpdate.query();
if (approvalUpdate.next()) {
approvalUpdate.state = 'not_required';
var result = approvalUpdate.update();
gs.log('updated approval state for ' + currentReviewer[k] + ': ' + result, 'approval_rule');
}
}
}
gs.log('complete approval business rule execution', 'approval_rule');
})(current, previous);
Thanks.