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.

How to display variables values in Email Notification with table format

Geet Burande
Tera Contributor

Hi All,

Can any one help me regarding to email notification. I have created BR for display data table wise in status report form of 'Deliverables and Sprints' field. And it is showing correct but now I want to display same data in email notification. What I can do for this. I am showing data with variable display directly in notification but with this data it is showing untidy data. I have attached screenshot for this.

Thanks in advance!

Screenshot_Email_notification.png

 

Regards,

Geetanjali Burande

 

4 REPLIES 4

1__AnithaHV
Kilo Sage

Hi @Geet Burande ,

 

Could you please share the code that you are using.

 

Thanks & Regards,

Anitha H V

Yes sure @1__AnithaHV 

Business Rule run on 'project_status' table

when to run: Before insert and update

 

 

(function executeRule(current, previous /*null when async*/ ) 
{
  
    //current.u_activities_planned_last_period = '';
  //var style_font = "font-family: 'trebuchet ms', geneva; font-size: 10pt;";
   //gs.log("first log"+current.project);
    //Get Status Date
    var aDate = current.u_prev_status_report_date;
    //var ActualEndDAte = current.work_end; //
    var NextStatusReportDate = current.u_next_status_report_date;

    //Get Status Date
    var bDate = current.as_on;
    //Get Project sys_id
    var statusRepPrj = current.project;
    //Add time to the dates
    var aDateTime = aDate + " 00:00:00";
    var bDateTime = bDate + " 23:59:59";

    //var queryString = "start_dateBETWEEN" + aDateTime + "@" + bDateTime;
    var queryString = "start_date" + "<=" + bDateTime;
    //current.u_activities_planned_last_period = '';

    //*****************Logic for requirements*******************


    var agileArray = [];//number
    var agileSDArray = []; //Short Description Array
    var agileStartArray = []; //Start Date Array
    var agileEndArray = []; //End Date Array
    var agilePercentArray = []; //Percent Array
    var agileStateArray = []; //State Array
    //var agileAssignedto = []; //assigned to for waterfall

	var gr = new GlideRecord('pm_project_task');
    //gr.addEncodedQuery(queryString);
    gr.addQuery("top_task", statusRepPrj).addOrCondition("parent", statusRepPrj); // fetch project
    gr.addQuery('phase_type', 'agile');

    gr.orderByDesc('state');
    gr.orderByDesc('start_date');
    gr.query();
    while (gr.next()) 
	{
        agileArray.push(gr.number.toString());
		gs.log("number in while" +gr.number);
        agileSDArray.push(gr.short_description.toString());
        agileStartArray.push(gr.start_date.getValue().split(' ')[0]);
        agileEndArray.push(gr.end_date.getValue().split(' ')[0]);
        agilePercentArray.push(gr.percent_complete.getValue());
        agileStateArray.push(gr.state.getDisplayValue());
    }
// //******ND- Sprint Table Start ********
    //var SprintTableMainAgile = '';
    var sprintTable = '';
    //var sprintRow = '';
    var style_font = "font-family: 'trebuchet ms', geneva; font-size: 10pt;";

for (var i = 0; i < agileArray.length; i++) 
{
        //sprintRow = '';

        var gr1 = new GlideRecord("rm_sprint");
        gr1.addQuery("parent.number", agileArray[i]);
        gs.log("agile array:"+agileArray[i]);
        gr1.addEncodedQuery('stateIN-6,1,2'); //open agile sprints
        //gr1.orderByDesc('end_date');
        //gs.log("end date:"+gr1.end_date.getValue());
        gr1.query();

		var grC = new GlideRecord("rm_sprint");
        grC.addQuery("parent.number", agileArray[i]);
        //gs.log("agile array:" + agileArray[i]);
        grC.addQuery('state', 3);
		grC.orderByDesc('closed_at');
        grC.setLimit(3);
        
        //gs.log("end date:" + grC.end_date.getValue());
        grC.query();

        if(gr1.hasNext()||grC.hasNext())
		 {
             //gs.log("in if blog");
	
            sprintTable += '<table id="ProjectTask" style="width:100%; ' + style_font + '"> <tbody>';
            sprintTable += '<tr><th>' + agileArray[i] + '</th>';
            sprintTable += '<th>' + agileSDArray[i] + '</th>';
            sprintTable += '<th>' + agileStartArray[i] + '</th>';
            sprintTable += '<th>' + agileEndArray[i] + '</th>';
            sprintTable += '<th>' + agilePercentArray[i] + '%'+'</th>';
            sprintTable += '<th>' + agileStateArray[i] + '</th>';
            sprintTable += '<th></th></tr>';

            sprintTable += '<tr background: #B2B9C2;><td><strong>Number</strong></td>';
            sprintTable += '<td><strong>Short Description </strong></td>';
            sprintTable += '<td><strong>Start Date </strong></td>';
            sprintTable += '<td><strong>End Date </strong></td>';
            sprintTable += '<td><strong>% Complete </strong></td>';
            sprintTable += '<td><strong>State </strong></td>';
            sprintTable += '<td><strong></strong></td></tr>';
			
		}
         while (gr1.next())
		{

                sprintTable += '<tr><td>' + gr1.number + '</td>';
                sprintTable += '<td>' + gr1.short_description + '</td>';
                sprintTable += '<td>' + gr1.start_date.getValue().split(' ')[0] + '</td>';
                sprintTable += '<td>' + gr1.end_date.getValue().split(' ')[0] + '</td>';
                sprintTable += '<td>' + gr1.percent_complete + '</td>';
                sprintTable += '<td>' + gr1.state.getDisplayValue() + '</td>';
                sprintTable += '<td></td></tr>';
        }
		while(grC.next())
		{
				sprintTable += '<tr><td>' + grC.number + ' </td>';
                sprintTable += '<td>' + grC.short_description + ' </td>';
                sprintTable += '<td>' + grC.start_date.getValue().split(' ')[0] + ' </td>';
                sprintTable += '<td>' + grC.end_date.getValue().split(' ')[0] + ' </td>';
                sprintTable += '<td>' + grC.percent_complete + ' </td>';
                sprintTable += '<td>' + grC.state.getDisplayValue() + ' </td>';
                sprintTable += '<td></td></tr>';
		}
			sprintTable += '</tbody></table><br/>';
      }
	  
	    //******Agile Sprint Tables End ********

    //***********Foe Waterfall scripting *********************/


    //non active: actual end date is between the previous status report date and the next status report date.
    //previous status report date= aDate (current.u_prev_status_report_date;) 
	//next status report date = NextStatusReportDate =( current.u_next_status_report_date;	)
	//both reports dates are available on status report list table(project_status)
	//actual end date = work_end (this is available on pm_project_task)

    var arrayobj=[];
    var parnum = current.project.number; //project task
    //gs.info("parent number"+ parnum);
    var grw = new GlideRecord('pm_project_task');
	//grw.addEncodedQuery('active=true^phase_type=waterfall');  active=true^phase_type=waterfall^end_date<=javascript&colon;gs.endOfToday()
	grw.addEncodedQuery('active=true^phase_type=waterfall^end_date<='+NextStatusReportDate + '^NQactive=false^phase_type=waterfall^work_end>'+ aDate + '^work_end<='+ NextStatusReportDate);
	//grw.addQuery("parent.number", parnum);//parent.parent=7d8752a61be56d10189acbb5464bcbc8
	grw.addQuery('sub_tree_root.number', 'CONTAINS',parnum);
	//addOrCondition('parent.parent.number', parnum)
	//grw.addQuery('parent.number','CONTAINS',parnum);
    //grw.orderByDesc('state');
	
    //grw.orderByDesc('start_date');
    grw.query();
    while (grw.next()) 
	{
     var obj = {};
		gs.log("in while:" +grw.number.getDisplayValue());
		obj.number = grw.number.getDisplayValue();
		//gs.info("in while loop of waterfall:"+obj.number);
		obj.short_description = grw.short_description.toString();
		obj.percent_complete = grw.percent_complete.getValue();
		obj.start_date = grw.start_date.getValue().split(' ')[0];
		obj.end_date = grw.end_date.getValue().split(' ')[0];
		obj.assigned_to = grw.assigned_to.getDisplayValue(); //grw.assigned_to.getValue()
		obj.state = grw.state.getDisplayValue();
		arrayobj.push(obj);
        
    }
	var sprintTable1 = '';
	sprintTable1 += '<table id="ProjectTask1" style="width:100%;' + style_font + '"> <tbody>';

            //sprintTable1 +='<tr align= "center"><strong>Waterfall project task</strong></tr>';
            sprintTable1 += '<tr><td><strong>Number</strong></td>'; //background: #B2B9C2;
            sprintTable1 += '<td><strong>Short Description </strong></td>';
			sprintTable1 += '<td><strong>% Complete </strong></td>';
            sprintTable1 += '<td><strong>Approved Start Date </strong></td>';
            sprintTable1 += '<td><strong>Planned End Date </strong></td>';
            sprintTable1 += '<td><strong>Assigned to </strong></td>';
            sprintTable1 += '<td><strong>State </strong></td>';
            sprintTable1 += '<td><strong> </strong></td></tr>';
	for (var x in arrayobj) 
	{
            //gs.info("Array object"+arrayobj[x].number + arrayobj[x].short_description);
		
              
                 sprintTable1 += '<tr><td>' + arrayobj[x].number + '</td>';
                 sprintTable1 += '<td>' + arrayobj[x].short_description + '</td>';
				 sprintTable1 += '<td>' + arrayobj[x].percent_complete + '</td>';
                 sprintTable1 += '<td>' + arrayobj[x].start_date + '</td>'; //start_date.getValue().split('')[0] + 
                 sprintTable1 += '<td>' + arrayobj[x].end_date + '</td>';
                 sprintTable1 += '<td>' + arrayobj[x].assigned_to + '</td>';
                 sprintTable1 += '<td>' + arrayobj[x].state + '</td>';
                 sprintTable1 += '<td></td></tr>';
				
	}
	sprintTable1 += '</tbody></table><br/>';

    current.u_activities_planned_last_period =   sprintTable + sprintTable1;
		//current.update();

})(current, previous);

 

 

Please add the first line of the code and check if fixes your issue.

         sprintTable += '<style>table, th, td {border:1px solid black;}</style>';
          sprintTable += '<table id="ProjectTask" style="width:100%; ' + style_font + '"> <tbody>';
          sprintTable += '<tr><th>' + agileArray[i] + '</th>';
            sprintTable += '<th>' + agileSDArray[i] + '</th>';
            sprintTable += '<th>' + agileStartArray[i] + '</th>';
            sprintTable += '<th>' + agileEndArray[i] + '</th>';
            sprintTable += '<th>' + agilePercentArray[i] + '%'+'</th>';
            sprintTable += '<th>' + agileStateArray[i] + '</th>';
            sprintTable += '<th></th></tr>';

 

Geet Burande
Tera Contributor

Thank you!