Debugging business rules can be achieved with resources available in the ServiceNow product.

1. Tools

The first step in the process is to identify tools which will help you figure out what's wrong.

2. Variables

The next step is to gain some insight into the behavior of your business rule. For every action except an insert, you will more than likely use a query to get your record(s).

var rec = new GlideRecord('incident');
rec.addQuery('active',true); 
rec.query();
while (rec.next()) {
 gs.print(rec.number + ' exists');
 }

To verify whether your query is actually returning records you can use gs.addInfoMessage to display information at the top of the screen.

var rec = new GlideRecord('incident');
rec.addQuery('active',true); 
rec.query();
gs.addInfoMessage("This is rec.next: " + rec.next());
while (rec.next()) {
 gs.print(rec.number + ' exists');
 }

If your query returns no records you see the following:

This is rec.next: false

Use this technique to verify every variable within your business rule contains expected values.

Tip: If necessary, break your script down into individual pieces and verify each piece works separate from the whole and then put them all back together one step at a time.

3. Locating information

The last step is to make sure you know where to find the information your rule is looking for.

In the ServiceNow application, one table can extend another table. This means when searching for information, you might need to query the parent table for the extended table's sys_id to find what you seek.

A good example is the sc_task table, which extends the task table. The script below queries the extended table (sc_task) for the current sys_id and then query the parent table (task) for records with the matching sys_id, and then prints out the work notes field.

var kids = new GlideRecord('sc_task');
kids.query();
 
gs.addInfoMessage("This is requested item number: " + current.number);
gs.print("This is the requested item number: " + current.number);
 
while (kids.next()) { 
 var parents = new GlideRecord('task');
 parents.addQuery('sys_id', '=', kids.sys_id);
 parents.query();
 
 while(parents.next()) {
  gs.addInfoMessage("This is task number: " + parents.number);
  gs.print("This is task number: " + parents.number);
  gs.addInfoMessage("These are the work notes: " + parents.work_notes);
  gs.print("These are the work notes: " + parents.work_notes);
  }
 
 }