business rule doesn't update work notes

Ravish Shetty
Tera Guru

i have this below piece of code in a business rule on sc_task

find_real_file.png

 

business rule conditions are as below 

 

find_real_file.png

 

the business rule intends to copy work notes of one task into all adjacent tasks of the same request item.

the code however doesn't work and i do not get any error. when i printed different messages, it seems all the code works fine except for the part where i am trying to update the work notes. i de-activated all other business rules on task and sc_task and it still doesn't work. 

the execution reaches till line 16.

1 ACCEPTED SOLUTION

Brent Sutton
Mega Sage

Hi Ravish,

I had a similar requirement to copy customer comments from a sc_task to sc_req_item. I had to clean up the comments and compare in order to prevent an infinite loop. I've modified the code below which should work for your use case:

(function executeRule(current, previous /*null when async*/) {

	var taskSysId = current.getUniqueValue();
	//gs.info(gs.getMessage("BLS: taskSysIdk: {0}",[taskSysId]));

	var trgt = new GlideRecord("sc_task");
	trgt.addQuery("parent",current.parent);
	trgt.addQuery("sys_id","!=",taskSysId);
	trgt.addActiveQuery();
	trgt.query();

	while (trgt.next()) {
		gs.info("BLS: trgt: " + trgt.number);
		// Before we update the target task, we need to prevent an infinite loop by ensuring the work_notes that is causing this business rule to run is not the same text that was in the last work_notes on the target task.

		//return the last work_notes journal entry for the current task and extract the journal text below the line break.
		var workNotes = cleanWorkNotes(current.work_notes.getJournalEntry(1));
		//return the last work_notes journal entry for the Catalog Task and extract the journal text below the line break.
		var trgtWorkNotes = cleanWorkNotes(trgt.work_notes.getJournalEntry(1));

		gs.info(gs.getMessage("BLS: Current Task: {0} >>> Current Task Work Notes: {1} - Target Task: {2} >>> trgtWorkNotes: {3} indexOf: {4}",[current.number,workNotes,trgt.number, trgtWorkNotes,trgtWorkNotes.indexOf(workNotes)]));

		/***** NOTE: If the same work_notes are entered twice, the second journal entry will not be copied to the target task as it will match the first work_notes *****/
		if (trgtWorkNotes.indexOf(workNotes) < 0) {
			// OnAfter business rules cannot process comments so we need to pull from the journal
			trgt.work_notes = workNotes;
			trgt.update();
		}
	}

	/**
	* Description: Cleans up the journal entry to remove timestamp, audit information and trim any white space.
	* Parameters:
	* @PARM1 - journalEntry (String) - Journal entry by index number i.e. current.work_notes.getJournalEntry(1)
	* Returns: note (String) - cleaned up journal entry with just the work_notes information.
	*/
	function cleanWorkNotes(journalEntry){
		var note = "";
		if (journalEntry) {
			//We need to clean-up the journal entry
			//return all text after the first line break in the journal entry (first line contains timestamp and audit information).
			note = journalEntry.substr(journalEntry.indexOf('\n')+1);
			note = note.trim(note); //remove any whitespace before and after string
		}

		return note;
	}

})(current, previous);

Let me know if it worked for you.

Brent

P.S. If my suggestion helped then please mark as helpful and/or correct so other community members can benefit from this information.

View solution in original post

31 REPLIES 31

Brent Sutton
Mega Sage

Hi Ravish,

I had a similar requirement to copy customer comments from a sc_task to sc_req_item. I had to clean up the comments and compare in order to prevent an infinite loop. I've modified the code below which should work for your use case:

(function executeRule(current, previous /*null when async*/) {

	var taskSysId = current.getUniqueValue();
	//gs.info(gs.getMessage("BLS: taskSysIdk: {0}",[taskSysId]));

	var trgt = new GlideRecord("sc_task");
	trgt.addQuery("parent",current.parent);
	trgt.addQuery("sys_id","!=",taskSysId);
	trgt.addActiveQuery();
	trgt.query();

	while (trgt.next()) {
		gs.info("BLS: trgt: " + trgt.number);
		// Before we update the target task, we need to prevent an infinite loop by ensuring the work_notes that is causing this business rule to run is not the same text that was in the last work_notes on the target task.

		//return the last work_notes journal entry for the current task and extract the journal text below the line break.
		var workNotes = cleanWorkNotes(current.work_notes.getJournalEntry(1));
		//return the last work_notes journal entry for the Catalog Task and extract the journal text below the line break.
		var trgtWorkNotes = cleanWorkNotes(trgt.work_notes.getJournalEntry(1));

		gs.info(gs.getMessage("BLS: Current Task: {0} >>> Current Task Work Notes: {1} - Target Task: {2} >>> trgtWorkNotes: {3} indexOf: {4}",[current.number,workNotes,trgt.number, trgtWorkNotes,trgtWorkNotes.indexOf(workNotes)]));

		/***** NOTE: If the same work_notes are entered twice, the second journal entry will not be copied to the target task as it will match the first work_notes *****/
		if (trgtWorkNotes.indexOf(workNotes) < 0) {
			// OnAfter business rules cannot process comments so we need to pull from the journal
			trgt.work_notes = workNotes;
			trgt.update();
		}
	}

	/**
	* Description: Cleans up the journal entry to remove timestamp, audit information and trim any white space.
	* Parameters:
	* @PARM1 - journalEntry (String) - Journal entry by index number i.e. current.work_notes.getJournalEntry(1)
	* Returns: note (String) - cleaned up journal entry with just the work_notes information.
	*/
	function cleanWorkNotes(journalEntry){
		var note = "";
		if (journalEntry) {
			//We need to clean-up the journal entry
			//return all text after the first line break in the journal entry (first line contains timestamp and audit information).
			note = journalEntry.substr(journalEntry.indexOf('\n')+1);
			note = note.trim(note); //remove any whitespace before and after string
		}

		return note;
	}

})(current, previous);

Let me know if it worked for you.

Brent

P.S. If my suggestion helped then please mark as helpful and/or correct so other community members can benefit from this information.

tried but its not working. 

i have used the function 'onafter' because ServiceNow doesnt let me save the code when i use 'onexecute' and throws an error

find_real_file.png

find_real_file.png

You need to tick, "Update" on your business rule when to run conditions. You also shouldn't have needed to change the IIFE name from executeRule to onAfter.

I just retested the code on my developer instance and it is working perfectly. My script is just designed to copy the last work_notes journal entry to all active sc_tasks related to the same parent. Make sure your test data works within those constructs.

If it doesn't work after ticking "Update" on the "When to run" conditions for your business rule then please post the log statements so we can dig into it a bit more.

Brent

P.S. If my suggestion helped then please mark as helpful and/or correct so other community members can benefit from this information. 

my bad. it works!

thanks for sharing the script Brent.

No worries Ravish, glad we got there in the end 🙂