Strip or replace quotes " from Work notes

Pierre5
Kilo Expert

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.

find_real_file.png

The only issue we have is; IF the Work notes contain Double Quotes (") the Zendesk ticket is not updated.

find_real_file.png

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.

find_real_file.png

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

57 REPLIES 57

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.

Pierre5
Kilo Expert

When a note is added from a TASK, without the Quotes, it works, however! as you can see, something adds quotes to the message, within the internal notes in Zendesk. Maybe there's another function that won't allow stripping or replacement... just a thought.

 

find_real_file.png

Pierre5
Kilo Expert

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);
		}

Pierre5
Kilo Expert

I don't know if this is relevant or if it helps, but this code is for creating the initial ticket

find_real_file.png

(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);

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

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader