Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Help with inbound email action script

Tracey6
Tera Contributor

Hi - I need some help with a new email inbound email action script that:

1)  Checks if the sender has an open Incident created in the last 15 minutes.

2)  If no, create a new incident

3)  If yes, add the new email body as a comment on the most recent open incident.

 

The script runs and finds the last open incident but is not adding 15 minutes to the variable fifteenMinutesLater.  Therefore, a new incident always gets created.   I added some logging to get the value of fifteenMinutesLater and it's the same as the variable incidentCreated.  

 d 

Below is the script and a snapshot of the logs.

 

(function runEmailAction(email) {
var logPrefix = "[DEV OPS Inbound Email Action - Incident 15-min Rule]";
var fromAddress = (email.from || '').match(/<(.+)>/);
fromAddress = fromAddress ? fromAddress[1] : email.from;

gs.info(logPrefix + "STEP 1 - Email received from: " + fromAddress);
email.log(logPrefix + "STEP 1 - Email received from: " + fromAddress);

// Find the user based on the from address
var userGr = new GlideRecord('sys_user');
userGr.addQuery('email', fromAddress);
userGr.query();

if (!userGr.next()) {
var msg = logPrefix + "STEP 2 - No user found with email: " + fromAddress;
gs.info(msg);
email.log(msg);
return;
}

var userId = userGr.sys_id;

// Use current processing time as the email reference time
var emailSent = new GlideDateTime();
gs.info(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
email.log(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());

// Query most recent open (non-closed) incident by this user
var incGr = new GlideRecord('incident');
incGr.addQuery('caller_id', userId);
incGr.addQuery('state', '!=', '7'); // Not closed
incGr.orderByDesc('sys_created_on');
incGr.setLimit(1);
incGr.query();
(function runEmailAction(email) {
var logPrefix = "[DEV OPS Inbound Email Action - Incident 15-min Rule]";
var fromAddress = (email.from || '').match(/<(.+)>/);
fromAddress = fromAddress ? fromAddress[1] : email.from;

gs.info(logPrefix + "STEP 1 - Email received from: " + fromAddress);
email.log(logPrefix + "STEP 1 - Email received from: " + fromAddress);

// Find the user based on the from address
var userGr = new GlideRecord('sys_user');
userGr.addQuery('email', fromAddress);
userGr.query();

if (!userGr.next()) {
var msg = logPrefix + "STEP 2 - No user found with email: " + fromAddress;
gs.info(msg);
email.log(msg);
return;
}

var userId = userGr.sys_id;

// Use current processing time as the email reference time
var emailSent = new GlideDateTime();
gs.info(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());
email.log(logPrefix + "STEP 3 - Email processed at: " + emailSent.getDisplayValue());

// Query most recent open (non-closed) incident by this user
var incGr = new GlideRecord('incident');
incGr.addQuery('caller_id', userId);
incGr.addQuery('state', '!=', '7'); // Not closed
incGr.orderByDesc('sys_created_on');
incGr.setLimit(1);
incGr.query();

if (incGr.next()) {

var incidentCreated = new GlideDateTime(incGr.sys_created_on); //date and time last open incident was created
gs.log(logPrefix + "STEP 3A - Incident Created: " + incidentCreated.getDisplayValue());

var fifteenMinutesLater = new GlideDateTime(); //variable for incidentCreated plus 15 minutes
fifteenMinutesLater.setDisplayValue(incidentCreated.getDisplayValue());
fifteenMinutesLater.addMinutes(15);
gs.log(logPrefix + "STEP 3B - Fifteen Minutes Later: " + fifteenMinutesLater.getDisplayValue());

gs.info(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
email.log(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());

gs.info(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
email.log(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());

if (emailSent.compareTo(fifteenMinutesLater) < 0) {
// Within 15-minute window — update the existing incident
incGr.comments = "New email received at " + emailSent.getDisplayValue() + ":\n" + email.body_text;
incGr.update();

var updateMsg = logPrefix + "STEP 6 - Updated existing incident [" + incGr.number + "] with new email comment.";
gs.info(updateMsg);
email.log(updateMsg);
return; // Stop further processing
}

var expiredMsg = logPrefix + "STEP 7 - Email is outside 15-minute window. Creating new incident.";
gs.info(expiredMsg);
email.log(expiredMsg);
} else {
var noMatchMsg = logPrefix + "STEP 8 - No open incident found. Creating new incident.";
gs.info(noMatchMsg);
email.log(noMatchMsg);
}

// Create a new incident
var newInc = new GlideRecord('incident');
newInc.initialize();
newInc.caller_id = userId;
newInc.short_description = email.subject || "Incident submitted via email";
newInc.description = email.body_text;
newInc.comments = "Incident created from email processed at " + emailSent.getDisplayValue();
var newSysId = newInc.insert();

var newMsg = logPrefix + "STEP 9 - Created new incident [" + newInc.number + "].";
gs.info(newMsg);
email.log(newMsg);

})(email);

if (incGr.next()) {
/*var incidentCreated = new GlideDateTime(incGr.sys_created_on);
var fifteenMinutesLater = new GlideDateTime();
fifteenMinutesLater.setValue(incidentCreated.getValue());
fifteenMinutesLater.addMinutes(15);*/

var incidentCreated = new GlideDateTime(incGr.sys_created_on); //date and time last open incident was created
gs.log(logPrefix + "STEP 3A - Incident Created: " + incidentCreated.getDisplayValue());

var fifteenMinutesLater = new GlideDateTime(); //variable for incidentCreated plus 15 minutes
fifteenMinutesLater.setDisplayValue(incidentCreated.getDisplayValue());
fifteenMinutesLater.addMinutes(15);
gs.log(logPrefix + "STEP 3B - Fifteen Minutes Later: " + fifteenMinutesLater.getDisplayValue());

gs.info(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());
email.log(logPrefix + "STEP 4 - Most recent open incident: " + incGr.number + " created at " + incidentCreated.getDisplayValue());

gs.info(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());
email.log(logPrefix + "STEP 5 - Comparing current time: " + emailSent.getDisplayValue() +
" to 15-minute window ending at: " + fifteenMinutesLater.getDisplayValue());

if (emailSent.compareTo(fifteenMinutesLater) < 0) {
// Within 15-minute window — update the existing incident
incGr.comments = "New email received at " + emailSent.getDisplayValue() + ":\n" + email.body_text;
incGr.update();

var updateMsg = logPrefix + "STEP 6 - Updated existing incident [" + incGr.number + "] with new email comment.";
gs.info(updateMsg);
email.log(updateMsg);
return; // Stop further processing
}

var expiredMsg = logPrefix + "STEP 7 - Email is outside 15-minute window. Creating new incident.";
gs.info(expiredMsg);
email.log(expiredMsg);
} else {
var noMatchMsg = logPrefix + "STEP 8 - No open incident found. Creating new incident.";
gs.info(noMatchMsg);
email.log(noMatchMsg);
}

// Create a new incident
var newInc = new GlideRecord('incident');
newInc.initialize();
newInc.caller_id = userId;
newInc.short_description = email.subject || "Incident submitted via email";
newInc.description = email.body_text;
newInc.comments = "Incident created from email processed at " + emailSent.getDisplayValue();
var newSysId = newInc.insert();

var newMsg = logPrefix + "STEP 9 - Created new incident [" + newInc.number + "].";
gs.info(newMsg);
email.log(newMsg);

})(email);

1 REPLY 1

Tracey6
Tera Contributor

Screenshot script.png