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.

Inbound action to avoid duplicate incident.

Meenal Gharat
Tera Guru

Hi,

Inbound email action to avoid duplicate incident.

If the incident is created using inbound emai action with the same CI name it's state is Resolved/closed it should create new incident.

if the state is open/active it should not create new incident rather it should update the same incident

I have tried writting the below code,kindly assist.

 

current.caller_id = gs.getUserID();
current.comments = "received from: " + email.origemail + "\n\n" + email.body_text;
//current.short_description = email.subject;
current.short_description = email.body.short_description;

//current.category = "inquiry";
current.incident_state = IncidentState.NEW;
current.notify = 2;
current.contact_type = "email";

if(email.body.category!= undefined)
current.category = email.body.category;

//gs.log('email'+ email.direct.toString());

//if(email.body.subcategory!=undefined)
current.subcategory=email.body.subcategory;

if (email.body.assign != undefined)
current.assigned_to.setDisplayValue(email.body.assign_to);

// if (email.subject.toLowerCase().indexOf("configuration item") >= 0
// && email.subject.toLowerCase().indexOf("device ip address") > 0
// && email.subject.toLowerCase().indexOf("severity: critical") > 0 )
if (email.subject.indexOf("configuration item") >= 0
&& email.subject.indexOf("device ip address") > 0
&& email.subject.indexOf("severity: critical") > 0 ) {

var subjectSplit = email.subject.split('item:');
var theName = subjectSplit[1].split(',');
var res = theName[0];
gs.log('meen gharat 1'+ res);
var op = res.replace(/ /g,'');
gs.log('meen gharat'+op);

var cmdbci = new GlideRecord("cmdb_ci");
cmdbci.addQuery('name',op);
cmdbci.query();
gs.log('row count '+ cmdbci.getRowCount());
if(cmdbci.next())
{
gs.log('ci getting' +cmdbci.sys_id);
current.cmdb_ci = cmdbci.sys_id;
}
if(!cmdbci.next())
{
current.cmdb_ci.setDisplayValue('Dummy');
}
if(cmdbci.next())
{
var inc = new Gliderecord("incident");
inc.addQuery('active',true);
inc.addQuery('state','!=',4);
inc.addQuery('state','!=', 5);
inc.addQuery('cmdb_ci','=',cmdbci.sys_id);
inc.query();

if(!inc.next())
{
current.incident_state = IncidentState.NEW;
current.notify = 2;
current.comments = "received from: " + email.origemail + "\n\n" + email.body_text;
current.short_description = email.body.short_description;
current.category = email.body.category;
current.subcategory=email.body.subcategory;
//current.cmdb_ci.setDisplayValue(cmdbci.sys_id);
current.insert();

}
}
else
{
gs.addErrorMessage('Incident Already Exist');
}

}

current.insert();

1 ACCEPTED SOLUTION

Meenal Gharat
Tera Guru

Hi all

 I have used below code and it works fine for me.

 


var eSubject = email.subject;
var grInc = new GlideRecord('incident');
var grEmail = new GlideRecord('sys_email');
var incUpdated = false;
grEmail.addEncodedQuery('sys_created_onONToday@javascript:gs.daysAgoStart(0)@javascript:gs.daysAgoEnd(0)^subject=' + eSubject);
grEmail.query();
if(grEmail.getRowCount != 0){
while(grEmail.next() && incUpdated != true){
grInc.get(grEmail.instance);


if(grInc.active == true && grInc.state < 6){ //is the existing incident active and not in closed or resolved state

incUpdated = true;

gs.log('Incident already exists');
grInc.work_notes = '\nFrom: ' + email.from + '\nTo: ' + email.to + '\nSubject: ' + email.subject + '\n\n' + email.body_text;
grInc.update();
}
}
}

//if(!gr.next());
if(incUpdated == false)

{
current.caller_id = gs.getUserID();
current.comments = "received from: " + email.origemail + "\n\n" + email.body_text;
//current.short_description = email.subject;
current.short_description = email.body.short_description;

//current.category = "inquiry";
current.incident_state = IncidentState.NEW;
current.notify = 2;
current.contact_type = "email";

if(email.body.category!= undefined)
current.category = email.body.category;

//gs.log('email'+ email.direct.toString());

//if(email.body.subcategory!=undefined)
current.subcategory=email.body.subcategory;

if (email.body.assign != undefined)
current.assigned_to.setDisplayValue(email.body.assign_to);

var subjectSplit = email.subject.split('item:');
var theName = subjectSplit[1].split(',');
var res = theName[0];
gs.log('meen gharat 1'+ res);
var op = res.replace(/ /g,'');
gs.log('meen gharat'+op);

var cmdbci = new GlideRecord("cmdb_ci");
cmdbci.addQuery('name',op);
cmdbci.query();
gs.log('row count '+ cmdbci.getRowCount());
if(cmdbci.next())
{
gs.log('ci getting' +cmdbci.sys_id);
current.cmdb_ci = cmdbci.sys_id;
}
//if(!cmdbci.next())
else
{
current.cmdb_ci.setDisplayValue('Dummy');
}


current.insert();
//your code to create an incident
}


})(current, event, email, logger, classifier);

 

Thank you for relpying my query.

Regards,

Meenal

View solution in original post

37 REPLIES 37

Are you using Asifnoors code exactly as he pasted it? Your original code had 2 current.insert() lines which would be causing duplication but the code posted a few messages back doesn't. If you're using Asifnoors code as it is there should be no duplication.

Probably best to post up you current code in it's entirety.

Yes if I use asifnoor code as it is, then no incident is getting created. I checked in  email logs it is skipping the process.

And if I add current.insert on last line then only a new incident is getting created.

This is my updated code.

 


var inc = new Gliderecord("incident");
inc.addEncodedQuery("active=true^state!=4^ORstate!=5^cmdb_ci="+cmdbci.sys_id);
inc.query();
if(!inc.next())
{
current.caller_id = gs.getUserID();
current.comments = "received from: " + email.origemail + "\n\n" + email.body_text;
current.short_description = email.body.short_description;

//current.category = "inquiry";
current.incident_state = IncidentState.NEW;
current.notify = 2;
current.contact_type = "email";

if(email.body.category!= undefined)
current.category = email.body.category;

if(email.body.subcategory!=undefined)
current.subcategory=email.body.subcategory;

if(email.body.assign != undefined)
current.assigned_to.setDisplayValue(email.body.assign_to);

if (email.subject.indexOf("configuration item") >= 0
&& email.subject.indexOf("device ip address") > 0
&& email.subject.indexOf("severity: critical") > 0 )
{
var subjectSplit = email.subject.split('item:');
var theName = subjectSplit[1].split(',');
var res = theName[0];
gs.log('meen gharat 1'+ res);
var op = res.replace(/ /g,'');
gs.log('meen gharat'+op);
var cmdbci = new GlideRecord("cmdb_ci");
cmdbci.addQuery('name',op);
cmdbci.query();
gs.log('row count '+ cmdbci.getRowCount());
if(cmdbci.next())
{
gs.log('ci getting' +cmdbci.sys_id);
current.cmdb_ci = cmdbci.sys_id;
}
else
{
current.cmdb_ci.setDisplayValue('Dummy');
}


}
current.insert();
}

Hi Meenal,

ARe you getting row count as 1 or 0?

If you are getting 0, then it means your value of OP is not finding any record in cmdb_ci. Because of which it will create a new record and will NOT update.

And if record exists, what exactly you wanted to do?

 

Now I'm getting row count as 1

okay, great.

So do you need any other help now?

If this is solved, kindly mark my comment as correct answer and helpful.