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.

amlanpal
Kilo Sage

Hello All,

 

This Blog covers a quick and hopefully a useful solution to a commonly asked requirement, i.e., how can we show all the filled in variables in the email body in a structured tabular format?

A common answer to the above scenario is via using an Email Script. Now, let's jump into the resolution here. For demonstration purpose I have created a mock-up catalog item which looks like the below image. On submission of which the approver will be expecting to get an email with all the filled details in a structured format.

find_real_file.png 

 

To achieve the same, we need to write the Email Script which will fetch all the variables and then show them with the details being fetched dynamically in a tabular format. Then all we need to do, is to call the Email Script in your Email body (in the field 'Message HTML') as ${mail_script:email_script_name}.

Below is the code snippet to be embedded in Email Script which you can always modify/tweak as per your requirement. Please note that the below script is defined to be worked in Global Scope. 

var table = current.getTableName();
var count = 0;
if (table == 'sysapproval_approver') {
	count = 1;
} else {
	for(vars in current.variable_pool){
		count++;
		break;
	}
}

if(count > 0){
	var mvalue = '';
	var list = [];
	var display = [];
	template.print('<table border="1">');
	
	//Query for the non-empty variables for this record
	//Catalog item and task variables pull from 'sc_item_option_mtom' table
	if(table == 'sc_req_item' || table == 'sc_task' || table == 'sysapproval_approver') {
		var itemVars = new GlideRecord('sc_item_option_mtom');
		
		if(table == 'sc_req_item'){
			itemVars.addQuery('request_item', current.sys_id);
			
		}
		if(table == 'sc_task'){
			itemVars.addQuery('request_item', current.request_item.sys_id);
			
		}
		if(table == 'sysapproval_approver'){
			itemVars.addQuery('request_item', current.sysapproval.sys_id);
		}
		itemVars.addNotNullQuery('sc_item_option.value');
		
		//Exclude Label and Container variables
		itemVars.addQuery('sc_item_option.item_option_new.type', '!=', 11);
		itemVars.addQuery('sc_item_option.item_option_new.type', '!=', 19);
		itemVars.addQuery('sc_item_option.item_option_new.type', '!=', 20);
		itemVars.addQuery('sc_item_option.item_option_new.type', '!=', 24);
		itemVars.orderBy('sc_item_option.order');
		
		itemVars.query();
		while(itemVars.next()){
			template.print("<tr>");
			template.print("<td>"+itemVars.sc_item_option.item_option_new.question_text+"</td>");
			mvalue = itemVars.sc_item_option.value;
			
			// Check if the value is from the reference field
			if (itemVars.sc_item_option.item_option_new.type == '8') {
				var grRefTable = new GlideRecord(itemVars.sc_item_option.item_option_new.reference);
				grRefTable.addQuery('sys_id',mvalue);
				grRefTable.query();
				if (grRefTable.next()) {
					mvalue = grRefTable.getDisplayValue();
				}
				template.print("<td>"+mvalue+"</td>");
				template.print("</tr>");
			}
			
			// Check if the type is List Collector
			if(itemVars.sc_item_option.item_option_new.type == '21') {
				list = itemVars.sc_item_option.value.split(',');				
				for(var i=0; i<list.length; i++){
					var grListTable = new GlideRecord(itemVars.sc_item_option.item_option_new.list_table);
					grListTable.addQuery('sys_id',list[i]);
					grListTable.query();
					if (grListTable.next()) {
						display.push(grListTable.getDisplayValue());						
					}
				}
				template.print("<td>"+display+"</td>");
				template.print("</tr>");
			}
			
			// Check if the type is Select Box
			if(itemVars.sc_item_option.item_option_new.type == '5') {
				var grQuestion = new GlideRecord('question_choice');
				grQuestion.addQuery('question', itemVars.sc_item_option.item_option_new);
				grQuestion.addQuery('value', itemVars.sc_item_option.value.toString());
				grQuestion.query();
				if(grQuestion.next()){
					mvalue = grQuestion.getValue('text');
				}
				template.print("<td>"+mvalue+"</td>");
				template.print("</tr>");
			}
			
			//For rest of the types
			if(itemVars.sc_item_option.item_option_new.type != '21' && itemVars.sc_item_option.item_option_new.type != '8' && itemVars.sc_item_option.item_option_new.type != '5' )
				{
				template.print("<td>"+mvalue+"</td>");
				template.print("</tr>");
			}
		}
	}
	template.print("</table>");
}

 

So, as per my demo requirement the approver will get an email notification once the item is submitted successfully. And that email should contain the filled questionnaires in a tabular format. Here is the snapshot how this will look like.

find_real_file.png

 

Any suggestions/improvement recommendations/feedback on this blog are welcomed!

 

Cheers!

Amlan

7 Comments