Strip or replace quotes " from Work notes

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-11-2020 05:03 AM
Hoping someone can help. My knowledge is very limited and I didn't write any of the code mentioned here.
We have a business rule (Task [task] that updates the body of a Zendesk ticket (third party ticketing system) via TASK. Everything works fine in regards to adding/posting updates to Zendesk, with the except of Quotes.
The only issue we have is; IF the Work notes contain Double Quotes (") the Zendesk ticket is not updated.
The error refers to this part of code I think... lines 111 - 121 - I think I need some extra code added to strip or replace the ", Not sure to be honest, but a string of some kind needs adding.
This is the full code:
(function executeRule(current, previous /*null when async*/) {
gs.addInfoMessage("Task Type : " + current.sys_class_name);
if(current.work_notes.changes()) {
gs.addInfoMessage("Worknotes changed ");
}
if(current.comments.changes()) {
gs.addInfoMessage("comments changed ");
}
if(current.state.changes()) {
gs.addInfoMessage("state changed ");
}
if (gs.getProperty('integrations.zendesk.enable') == 'true') {
var status = 'new';
var fileToken = '';
//State Mapping
if (current.sys_class_name == 'incident'){
if (current.state == '1' ) {
status = 'new';
} else if (current.state == '2') {
status = 'open';
} else if (current.state == '3') {
status = 'hold';
} else if (current.state == '6') {
status = 'solved';
} else if (current.state == '7') {
status = 'solved';
} else if (current.state == '8') {
status = 'solved';
}
} else if (current.sys_class_name == 'incident_task'){
if (current.state == '1' ) {
status = 'open';
} else if (current.state == '2') {
status = 'open';
} else if (current.state == '-5') {
status = 'open';
} else if (current.state == '3') {
status = 'solved';
} else if (current.state == '4') {
status = 'solved';
} else if (current.state == '7') {
status = 'solved';
}
}
if(current.hasAttachments()){
var max_size = 5000000; //5 MB
var count = 1;
var cgiAttch = new GlideRecord('sys_attachment');
cgiAttch.addQuery('table_sys_id',current.sys_id);
cgiAttch.addQuery("sys_created_on", '>=', 'javascript:gs.minutesAgo(30)'); //Created in last 30 mins
cgiAttch.query();
while(cgiAttch.next()){
var sa = new GlideSysAttachment();
var binData = sa.getBytes(cgiAttch);
var size = parseInt(cgiAttch.size_bytes);
if(size > max_size) {
//gs.addInfoMessage("Ignoring sending of attachment to remedy, size exceeds 2MB");
gs.log('Ignoring sending of attachment to remedy, size exceeds 2MB','Remedy Integration');
//current.setAbortAction(true);
} else {
if (count == '1' || gs.nil(fileToken)) {
fileToken = getAttachmentToken(cgiAttch.file_name,GlideStringUtil.base64Encode(binData),'');
count = count + 1;
gs.log("File Token: " + fileToken);
} else {
getAttachmentToken(cgiAttch.file_name,GlideStringUtil.base64Encode(binData),fileToken);
}
}
}
}
var r = new sn_ws.RESTMessageV2('Zendesk', 'Update');
r.setStringParameterNoEscape('zendesk_domain', gs.getProperty('integrations.zendesk.domain'));
r.setStringParameter('fileToken',fileToken);
r.setStringParameterNoEscape('ticketId', current.correlation_id);
if (status == 'solved'){
r.setStringParameterNoEscape('closed_code', 'closed_in_sn');
}
r.setStringParameterNoEscape('status', status);
if (current.sys_class_name == 'incident_task' && current.work_notes.changes()) {
r.setStringParameter('comments', new global.JSON().encode(current.work_notes.getJournalEntry(1)));
}
if ((current.sys_class_name == 'incident')&&(current.state == '6')) {
var notes = '';
notes = 'Restoration Item: ' + current.u_closure_item;
notes += '\n Restoration Code: ' + current.close_code;
notes += '\n Restoration Notes: ' + current.close_notes;
comm=current.work_notes.getJournalEntry(1).toString();
notes += '\n Work Notes: ' + comm;
r.setStringParameter('comments', new global.JSON().encode(notes));
comm=current.comments.getJournalEntry(1).toString();
notes += '\n Additional Comments: ' + comm;
r.setStringParameter('comments', new global.JSON().encode(notes));
}
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
if (httpStatus == '200') {
var parser = new JSONParser();
var parsed = parser.parse(response.getBody());
var ticketId = parsed.ticket.id;
gs.addInfoMessage("Zendesk incident "+ ticketId.toString() + " updated successfully");
} else {
gs.addErrorMessage("Error while updating zendesk incident " + responseBody);
}
}
function getAttachmentToken(fileName, fileData, tokenData) {
var returnToken = '';
var attachmentRequest = new sn_ws.RESTMessageV2('Zendesk','CreateAttachment');
attachmentRequest.setStringParameter('zendesk_domain', gs.getProperty('integrations.zendesk.domain'));
attachmentRequest.setStringParameter('file_name', fileName);
attachmentRequest.setStringParameter('file_data', fileData);
if (!gs.nil(tokenData)){
attachmentRequest.setStringParameter('file_token', tokenData);
}
var responseResponse = attachmentRequest.execute();
var attachmentHttpStatus = responseResponse.getStatusCode();
if (attachmentHttpStatus == '201') {
var parsedAttachment = new global.JSON().decode(responseResponse.getBody());
returnToken = parsedAttachment.upload.token;
gs.log("Attachment Response fileToken: " + returnToken + 'Zendesk Integration');
return returnToken;
} else {
gs.addErrorMessage("Error while sending attachment to zendesk " + fileName);
}
return returnToken;
}
})(current, previous);
Your help would be much appreciated,
Kind regards,
Pierre
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-12-2020 02:09 AM
Hi,
You have written below code when making request to zendesk, at that time only you need to remove double quote or all special characters using code I provided above.
var r = new sn_ws.RESTMessageV2('Zendesk', 'Update'); r.setStringParameterNoEscape('zendesk_domain', gs.getProperty('integrations.zendesk.domain'));
r.setStringParameter('fileToken',fileToken);
r.setStringParameterNoEscape('ticketId', current.correlation_id);
if (status == 'solved'){
r.setStringParameterNoEscape('closed_code', 'closed_in_sn'); } r.setStringParameterNoEscape('status', status);
if (current.sys_class_name == 'incident_task' && current.work_notes.changes()) { r.setStringParameter('comments', new global.JSON().encode(current.work_notes.getJournalEntry(1))); //Do not use JSON encoding
}
if ((current.sys_class_name == 'incident')&&(current.state == '6'))
{
var notes = '';
notes = 'Restoration Item: ' + current.u_closure_item;
notes += '\n Restoration Code: ' + current.close_code;
notes += '\n Restoration Notes: ' + current.close_notes; comm=current.work_notes.getJournalEntry(1).toString();
notes += '\n Work Notes: ' + comm;
r.setStringParameter('comments', new global.JSON().encode(notes)); //Do not use JSON encoding
comm=current.comments.getJournalEntry(1).toString();
notes += '\n Additional Comments: ' + comm;
r.setStringParameter('comments', new global.JSON().encode(notes)); } //Do not use JSON encoding
Thanks.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-12-2020 01:45 AM

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-12-2020 01:53 AM
I also have this code block...
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
gs.info("httpStatus:: "+httpStatus);
gs.info("responseBody:: "+responseBody);
if (httpStatus == '200') {
var stringiify=JSON.stringify(responseBody);
var replaceis=stringiify.replace(/"/g,'"'); //replaces " with \" to make the escape " character work
var parser = new JSONParser();
var parsed = parser.parse(replaceis);
var ticketId = parsed.ticket.id;
gs.addInfoMessage("Zendesk incident "+ ticketId.toString() + " updated successfully");
} else {
gs.addErrorMessage("Error while updating zendesk incident " + responseBody);
}

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-12-2020 02:05 AM
I don't know if this is relevant or if it helps, but this code is for creating the initial ticket
(function executeRule(current, previous /*null when async*/) {
if (gs.getProperty('integrations.zendesk.enable') == 'true') {
var priority = 'priority_low';
var severity = 'severity_low_sn';
var status = 'new';
var location_value = 'Other';
var fileToken = '';
//Priority Mapping
if (current.priority == '1') {
priority = 'priority_urgent';
} else if (current.priority == '2' ) {
priority = 'priority_high';
} else if (current.priority == '3') {
priority = 'priority_normal';
} else if (current.priority == '4'){
priority = 'priority_low';
}
//Severity Mapping
if (current.severity == '1') {
severity = 'severity_critical_sn';
} else if (current.severity == '2') {
severity = 'severity_high_sn';
} else if (current.severity == '3'){
severity = 'severity_normal_sn';
} else if (current.severity == '4'){
severity = 'severity_low_sn';
}
//State Mapping
if (current.sys_class_name == 'incident'){
if (current.state == '1' ) {
status = 'new';
} else if (current.state == '2') {
status = 'open';
} else if (current.state == '3') {
status = 'hold';
} else if (current.state == '6') {
status = 'solved';
} else if (current.state == '7') {
status = 'solved';
} else if (current.state == '8') {
status = 'solved';
}
} else if (current.sys_class_name == 'incident_task'){
if (current.state == '1' ) {
status = 'new';
} else if (current.state == '2') {
status = 'open';
} else if (current.state == '-5') {
status = 'hold';
} else if (current.state == '3') {
status = 'solved';
} else if (current.state == '4') {
status = 'solved';
} else if (current.state == '7') {
status = 'solved';
}
}
if(current.hasAttachments()){
var max_size = 5000000; //5 MB
var count = 1;
var cgiAttch = new GlideRecord('sys_attachment');
cgiAttch.addQuery('table_sys_id',current.sys_id);
cgiAttch.addQuery("sys_created_on", '>=', 'javascript:gs.minutesAgo(30)'); //Created in last 30 mins
cgiAttch.query();
while(cgiAttch.next()){
var sa = new GlideSysAttachment();
var binData = sa.getBytes(cgiAttch);
var size = parseInt(cgiAttch.size_bytes);
if(size > max_size) {
//gs.addInfoMessage("Ignoring sending of attachment to remedy, size exceeds 2MB");
gs.log('Ignoring sending of attachment to remedy, size exceeds 2MB','Zendesk Integration');
//current.setAbortAction(true);
} else {
if (count == '1' || gs.nil(fileToken)) {
fileToken = getAttachmentToken(cgiAttch.file_name,GlideStringUtil.base64Encode(binData),'');
count = count + 1;
} else {
getAttachmentToken(cgiAttch.file_name,GlideStringUtil.base64Encode(binData),fileToken);
}
}
}
}
if ((current.incident.location.name == "Alderney")||(current.incident.location.city == "Alderney")){
location_value = 'island_ald';
} else if ((current.incident.location.name == "Sark")||(current.incident.location.city == "Sark")){
location_value = 'island_sark';
} else if ((current.incident.location.name == "Herm")||(current.incident.location.city == "Herm")){
location_value = 'island_herm';
} else if ((current.incident.location.name == "Guernsey")||(current.incident.location.country == "Guernsey")){
location_value = 'island_gsy';
} else if ((current.incident.location.name == "Isle of Man")||(current.incident.location.country == "Isle of Man")){
location_value = 'island_iom';
} else if ((current.incident.location.name == "Jersey")||(current.incident.location.country == "Jersey")){
location_value = 'island_jsy';
} else {
location_value = 'island_other';
}
var r = new sn_ws.RESTMessageV2('Zendesk', 'Create');
r.setStringParameterNoEscape('zendesk_domain', gs.getProperty('integrations.zendesk.domain'));
r.setStringParameter('fileToken',fileToken);
r.setStringParameterNoEscape('short_description', current.short_description);
r.setStringParameterNoEscape('subject', current.short_description);
r.setStringParameterNoEscape('type', 'incident');
r.setStringParameterNoEscape('assignee', current.assigned_to.name);
r.setStringParameterNoEscape('group_id', current.assignment_group.u_zendesk_group_id);
/*WhiteBrick STRY 1.1*/
r.setStringParameterNoEscape('task_number', current.number);
r.setStringParameterNoEscape('incident_number', current.incident.number);
r.setStringParameterNoEscape('ticket_type', current.incident.u_tracking_ticket_type_ttt.getDisplayValue());
r.setStringParameterNoEscape('business_service', current.incident.business_service.getDisplayValue());
/* Closure WhiteBrick STRY 1.1*/
//r.setStringParameterNoEscape('group_id', "TEST ServiceNow");
//r.setStringParameterNoEscape('comments_body', current.description);
//NEW code to allow line breaks for comments_body
// var commbody= current.comments_body.getJournalEntry(-1).toString();
// commbody=current.description.replace(/["']/g, "");
// commbody=current.description.replace(/[\n*]/g, "");
// commbody=current.description.replace(/\r\n|\r|\n/g, '\\n');
//r.setStringParameterNoEscape('comments_body', commbody);
// var commbody = current.comments.getJournalEntry(-1).replace("\"", "\\\"");
// r.setStringParameter('comments_body', new global.JSON().encode(commbody));
//r.setStringParameterNoEscape('requester_name', current.incident.caller_id.name);
//r.setStringParameterNoEscape('requester_email', current.incident.caller_id.email);
//r.setStringParameterNoEscape('requester_number', current.incident.caller_id.phone);
r.setStringParameterNoEscape('requester_name', "Sure SOC");
r.setStringParameterNoEscape('requester_email', "defaultrequester@sure.com");
r.setStringParameterNoEscape('requester_number', "01534752310");
r.setStringParameterNoEscape('severity', severity);
r.setStringParameterNoEscape('priority', priority);
if (JSUtil.nil(current.incident.caller_id.name)) {
r.setStringParameterNoEscape('contact_name', 'None provided');
} else {
r.setStringParameterNoEscape('contact_name', current.incident.caller_id.name);
}
if (JSUtil.nil(current.incident.caller_id.phone)) {
r.setStringParameterNoEscape('contact_number', 'None provided');
} else {
r.setStringParameterNoEscape('contact_number', current.incident.caller_id.phone);
}
if (JSUtil.nil(current.incident.u_service_instance.name)) {
r.setStringParameterNoEscape('service_affected', 'None provided');
} else {
r.setStringParameterNoEscape('service_affected', current.incident.u_service_instance.name);
}
r.setStringParameterNoEscape('fault_type', 'managed_services');
r.setStringParameterNoEscape('location', location_value);
if (status == 'solved'){
r.setStringParameterNoEscape('closed_code', 'closed_in_sn');
}
r.setStringParameterNoEscape('status', status);
// var comm= current.work_notes.getJournalEntry(-1).toString();
// comm=comm.replace(/["']/g, "");
// comm=comm.replace(/[\n*]/g, "");
// comm=comm.replace(/\r\n|\r|\n/g, '\\n');
// r.setStringParameterNoEscape('comments', comm);
//var comm = current.work_notes.getJournalEntry(-1).replace("\"", "\\\"");
//var comm = 'Work Note: ' +jsonEncode(current.work_notes.getJournalEntry(-1));
var comm = current.work_notes.getJournalEntry(-1);
comm = comm.split('"').join('');
comm = comm.split("'").join('');
//var com = workNoteData.replace( /[\r\n]+/g, '' );
/*
White-Brick STRY 1.1
adding Task ID, Incident ID, Ticket Type, Business Service, Company
into work notes.
*/
comm += '\n Task ID: ' + current.number;
comm += '\n Incident ID: ' + current.incident.number;
comm += '\n Ticket Type: ' + current.incident.u_tracking_ticket_type_ttt.getDisplayValue();
comm += '\n Business Service: ' + current.incident.business_service.getDisplayValue();
comm += '\n Service Number: ' + current.incident.u_service_instance.getDisplayValue();
comm += '\n Company: ' + current.incident.company.getDisplayValue();
if ( "Customer" != current.incident.caller_id.getDisplayValue() ) {
comm += '\n Caller: ' + current.incident.caller_id.getDisplayValue();
comm += '\n Business Phone: ' + current.incident.caller_id.phone;
comm += '\n Mobile Phone: ' + current.incident.caller_id.mobile_phone;
comm += '\n Email: ' + current.incident.caller_id.email;
}
comm = JSON.stringify(comm);
comm = comm.substr( 1, comm.length -2 );
//r.setStringParameter('comments_body', new global.JSON().encode(current.work_notes.getJournalEntry(1)));
//var commentData = comm.replace( /[\r\n]+/g, "\t" );
r.setStringParameter('comments_body', comm );
if ((current.sys_class_name == 'incident')&&(status == 'solved')) {
var notes = '';
notes = 'Restoration Item: ' + current.u_closure_item;
notes += '\n Restoration Code: ' + current.close_code;
notes += '\n Restoration Notes: ' + current.close_notes;
notes += current.work_notes.getJournalEntry(-1) + '\n Restoration Notes: ';
var notesData = notes.replace( /[\r\n]+/g, "" );
r.setStringParameter( 'comments', notesData );
//r.setStringParameter('comments', new global.JSON().encode(notes));
//r.setStringParameterNoEscape('comments', notes);
}
r.setStringParameterNoEscape('snow_sys_id', current.sys_id);
r.setStringParameterNoEscape('snow_task_type', current.sys_class_name);
//r.setStringParameter('public', false);
var response = r.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();
if (httpStatus == '201') {
var parser = new JSONParser();
var parsed = parser.parse(response.getBody());
var ticketId = parsed.ticket.id;
current.correlation_display = 'Zendesk';
current.correlation_id = ticketId.toString();
gs.addInfoMessage("Zendesk incident "+ ticketId.toString() + " created successfully");
current.setWorkflow(false);
current.update();
} else {
gs.addErrorMessage("Error while creating zendesk incident " + responseBody);
}
gs.log("Zendesk Response " + responseBody);
gs.log("Zendesk Status " + httpStatus);
}
function getAttachmentToken(fileName, fileData, tokenData) {
var returnToken = '';
var attachmentRequest = new sn_ws.RESTMessageV2('Zendesk','CreateAttachment');
attachmentRequest.setStringParameter('zendesk_domain', gs.getProperty('integrations.zendesk.domain'));
attachmentRequest.setStringParameter('file_name', fileName);
attachmentRequest.setStringParameter('file_data', fileData);
if (!gs.nil(tokenData)){
attachmentRequest.setStringParameter('file_token', tokenData);
}
var responseResponse = attachmentRequest.execute();
var attachmentHttpStatus = responseResponse.getStatusCode();
if (attachmentHttpStatus == '201') {
var parsedAttachment = new global.JSON().decode(responseResponse.getBody());
returnToken = parsedAttachment.upload.token;
return returnToken;
} else {
gs.addErrorMessage("Error while sending attachment to zendesk " + fileName);
}
return returnToken;
}
function jsonEncode(str) {
str = new global.JSON().encode(str.replace(/["']/g, ""));
return str.substring(1, str.length - 1);
//return ;
}
})(current, previous);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
06-12-2020 04:03 AM
Hi,
please use the same for update as well and check once
use the same method
function jsonEncode(str) {
str = new global.JSON().encode(str.replace(/["']/g, ""));
return str.substring(1, str.length - 1);
//return ;
}
Regards
Ankur
Ankur
✨ Certified Technical Architect || ✨ 9x ServiceNow MVP || ✨ ServiceNow Community Leader