Scripted Approvals via Flow Action
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
3 hours ago - last edited 3 hours ago
Hello,
I have a need to generate approvals via a script in a custom flow action so I can pass custom inputs into a notification without triggering the OOB "approval.inserted" event. For this I have basically recreated the "Ask for Approvals" flow action step.
My script appears to be working as in the attached script it generates system info logs for each user I need an approval for with the correct information, however the approvals are never actually inserted into 'sysapproval_approver'. Is there something I'm missing in my script here? I am separating out user sys_ids into a string Array and then looping through each to create the approvals. I am doing the same if a group is entered and a system log is created for each expected record.
Per another post the only thing I can see I may be missing to set is the apprRec.source_table, but I do not want to set this directly as I would like this flow action to be reusable for any approvals that need my custom fields.
(function execute(inputs, outputs) {
function normalizeArray(input) {
if (!input) return [];
return Array.isArray(input) ? input : [input];
}
var approvalUsers = normalizeArray(inputs.approvalUsers);
var approvalGroups = normalizeArray(inputs.approvalGroups);
var specialInstructions = inputs.specialInstructions || '';
var approvalReason = inputs.approvalReason || '';
var currentRecordSysId = '';
if (inputs.currentRecord && inputs.currentRecord.sys_id) {
currentRecordSysId = inputs.currentRecord.sys_id.toString();
gs.info('[Approval Script] Valid currentRecord.sys_id found. : + currentRecordSysId');
}
if (!currentRecordSysId) {
gs.error('[Approval Script] No valid currentRecord.sys_id found.');
outputs.approvals_created = 0;
return;
}
var approverArray = [];
for (var i = 0; i < approvalUsers.length; i++) {
var user = approvalUsers[i];
var userSysId = (user && typeof user === 'object' && user.getTableName)
? user.getValue('sys_id')
: user.toString();
if (userSysId && approverArray.indexOf(userSysId) === -1) {
approverArray.push(userSysId);
}
}
for (var j = 0; j < approvalGroups.length; j++) {
var groupSysId = approvalGroups[j];
var groupGR = new GlideRecord('sys_user_grmember');
groupGR.addQuery('group', groupSysId);
groupGR.query();
while (groupGR.next()) {
var userSysId = groupGR.getValue('user');
if (approverArray.indexOf(userSysId) === -1) {
approverArray.push(userSysId);
}
}
}
var approvalsCreated = 0;
for (var k = 0; k < approverArray.length; k++) {
var userId = approverArray[k];
gs.info('[Approval Script] Creating approval for user sys_id: ' + userId);
var apprRec = new GlideRecord('sysapproval_approver');
apprRec.newRecord();
apprRec.document_id = currentRecordSysId;
apprRec.approver = userId;
apprRec.u_special_instructions = true;
apprRec.u_special_instructions_for_approval = specialInstructions;
apprRec.state = 'requested';
apprRec.sysapproval = currentRecordSysId
apprRec.approval_reason = approvalReason;
apprRec.short_description - 'Special Instructions Approval via Flow Action "Approval - Special Instructions"';
apprRec.insert();
var approvalId = apprRec.insert();
if (approvalId) {
approvalsCreated++;
gs.info('[Approval Script] Approval created: ' + approvalId + ' for user: ' + apprRec.approver + ' document id: ' + currentRecordSysId + ' state: ' + apprRec.state + ' approval reason: ' + approvalReason + ' speical instructions Output: ' + specialInstructions + ' special instructions true/false: ' + apprRec.u_special_instructions);
gs.eventQueue('special.approval.instructions', apprRec, specialInstructions, null);
} else {
gs.error('[Approval Script] Failed to create approval for user: ' + userId)
}
}
outputs.approvals_created = approvalsCreated;
})(inputs, outputs);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
2 hours ago
Hi @tiguin2798,
in the Flow Designer there's Flow variable (top-right corner), you can create one and script the logics of who will be the approver(s) and this variable can be then used as a input for the ootb action Ask for Approval as a data pill.
If it is more complex, maybe you can consider Decision tables for that as well.
100 % GlideFather experience and 0 % generative AI
