{"id":2516,"date":"2020-10-27T08:39:48","date_gmt":"2020-10-27T07:39:48","guid":{"rendered":"https:\/\/www.actonic.de\/?p=2516"},"modified":"2023-03-31T10:47:14","modified_gmt":"2023-03-31T08:47:14","slug":"custom-scripts-with-report-builder-part-one","status":"publish","type":"post","link":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/","title":{"rendered":"Jira custom reports: custom Jira Scripts with Report Builder | part 1"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><p>[vc_row][vc_column][heading title=&#8221;Report Builder: What it is &amp; what it does&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602830448735-8502bece-3f3f&#8221;][vc_column_text]<a href=\"https:\/\/actonic.de\/en\/products\/report-builder-timesheets-and-data-analysis\/\"><strong>Report Builder<\/strong><\/a> helps organizations with any type of Jira reporting need. The app has built-in personal and time reports templates, which cover most reporting needs. In the section Scripted Reports you will also be able to <strong>build reports from scratch,<\/strong> by implementing any type of calculation algorithm, parameter and visualization library. Build your own report with <strong>HTML and JavaScript basics.<\/strong>[\/vc_column_text][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Reporting essentials in Report Builder&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602830472010-25a9eca5-6b2f&#8221;][vc_column_text]<\/p>\n<ol>\n<li>You fill in some report parameters, like scope, dates, etc.<\/li>\n<li>You get raw data based on input parameters: projects, tickets, work logs, etc.<\/li>\n<li>You apply an algorithm to\u00a0calculate\u00a0your report based on raw data and input parameters<\/li>\n<li>You format your results to get the\u00a0report in table, chart or any other format<\/li>\n<\/ol>\n<p>[\/vc_column_text][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Let&#8217;s build a report&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602830495345-0c6e7018-9f6d&#8221;][vc_column_text el_class=&#8221;subhead&#8221;]<\/p>\n<p id=\"ScriptedReports:QuickStartGuideOnHowToBuildAReport-Ourexample:Actualtimevs.estimation\">Our example: Actual time vs. estimation<\/p>\n<p>[\/vc_column_text][vc_column_text]The process of report creation with Scripted Report is split into three tabs:<\/p>\n<ol>\n<li><strong>General<\/strong><\/li>\n<li><strong>Template<\/strong><\/li>\n<li><strong>Script<\/strong><\/li>\n<\/ol>\n<p>One more tab called Permissions will be useful if you want to share the report with someone, but we&#8217;ll cover this part at the end of this guide.<\/p>\n<p>Let&#8217;s try to solve the task of getting a time tracking report from Jira based on JQL query and get an understanding of each tab.[\/vc_column_text][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Tab 1: General&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602830533968-d57ba618-2a74&#8243;][vc_column_text]The tab provides the ability to add input fields and define the category of your report. At the moment there are more than 10 predefined input field types. You can choose any category from the list or skip this step.<\/p>\n<p>In our case, we will choose the category &#8220;Table&#8221;, because it would be a great way to see the estimated time over the spent time in table format.<\/p>\n<p><u>We create two input fields:<\/u><\/p>\n<ul>\n<li>JQL: to work with JQL query and get syntax check<\/li>\n<li>Fields Picker: to select the worklog fields of the Jira issue<\/li>\n<\/ul>\n<p><u>We set up those two fields the following way:<\/u><\/p>\n<ul>\n<li>Field Name: We choose a field name that will be part of the &#8220;name&#8221; HTML tag and will be used for script logic.<\/li>\n<li>Title: We choose a title that will be shown at the top of the field.<\/li>\n<li>Type: We choose a type that will predefine the behaviors of the field (syntax check or Jira object select).<\/li>\n<\/ul>\n<p>[\/vc_column_text][vc_single_image image=&#8221;2518&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Tab 2: Template&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602830620405-e86ed61d-7748&#8243;][vc_column_text]To control the final data view, the Template tab provides a Handlebars template editor. If you&#8217;re not aware with\u00a0<a class=\"external-link\" href=\"https:\/\/handlebarsjs.com\/\" rel=\"nofollow\">Handlebars<\/a>, we&#8217;re suggesting to check out the official site of the template engine.<\/p>\n<p>As mentioned before, we decided to use the table format to represent the data. We assume that it will be an array of issue objects which come from Jira API, so we need to create a table row for each of these objects.[\/vc_column_text][vc_single_image image=&#8221;2520&#8243; img_size=&#8221;375&#215;375&#8243; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Tab 3: Script&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602830712637-07c57220-500e&#8221;][vc_column_text]<\/p>\n<p data-renderer-start-pos=\"3433\">To manage the data provided, you can use JavaScript in the General tab. The code will run in the top-level await scope with the defined SR object. This object is constructed to help with tasks like interacting with Jira API, easily getting data from the input fields of the General Tab and passing the final data to the template.<\/p>\n<p data-renderer-start-pos=\"3764\">Let&#8217;s go over some of these methods:<\/p>\n<ul class=\"ak-ul\" data-indent-level=\"1\">\n<li>\n<p data-renderer-start-pos=\"3804\">SR.getValueByFieldName(fieldName:String)\u00a0 \u2013 returns the input field value based on <em data-renderer-mark=\"true\">fieldName<\/em> string parameter<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"3917\">SR.getIssuesByJQL(jql:String, &lt;fields:String&gt;)\u00a0\u2013 returns an array of Jira issues based on JQL query and the list of comma-separated fields. If the fields parameter is not set, then <a class=\"sc-cZBZkQ bgJBvG\" title=\"https:\/\/confluence.atlassian.com\/jirakb\/navigable-vs-orderable-field-838538013.html\" href=\"https:\/\/confluence.atlassian.com\/jirakb\/navigable-vs-orderable-field-838538013.html\" data-renderer-mark=\"true\">Jira Navigable<\/a> fields will be returned<\/p>\n<\/li>\n<li>\n<p data-renderer-start-pos=\"4140\">SR.render(templateValues:Object, &lt;callback:Function&gt;)\u00a0\u2013 passes the values from the JavaScript to the template defined in the Template tab. It is possible to set some after rendering logic with the callback parameter<\/p>\n<\/li>\n<\/ul>\n<p data-renderer-start-pos=\"4359\">You fill in the fields JQL and Fields Picker. The first thing you need to do is getting the values in the script.<\/p>\n<p>[\/vc_column_text][vc_single_image image=&#8221;2522&#8243; img_size=&#8221;300&#215;350&#8243; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]To get the data from the input fields with the help of\u00a0<em>SR.getValueByFieldName()\u00a0<\/em>you need to pass the field name value that was set in the General tab. Please note that the Fields Picker is a multi-select field which returns an array of values.[\/vc_column_text][vc_single_image image=&#8221;2524&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]As the\u00a0<em>SR.getIssuesByJQL()<\/em>\u00a0uses the string type for both parameters, you convert the selected fields to the comma-separated string. As the request to the Jira API is an asynchronous operation, you should be using top-level await to wait for a response.[\/vc_column_text][vc_single_image image=&#8221;2526&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]Now, fetch the Jira issues and control the final data object. This is possible with the\u00a0<em>JavaScript map()<\/em>\u00a0method:[\/vc_column_text][vc_single_image image=&#8221;2528&#8243; img_size=&#8221;400&#215;372&#8243; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]The issue in the last code shows the time that comes from Jira and is presented in milliseconds. So you need to define the helper function that will convert incoming values into hours.[\/vc_column_text][vc_single_image image=&#8221;2530&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]You now need to apply this conversion to the map callback function.[\/vc_column_text][vc_single_image image=&#8221;2532&#8243; img_size=&#8221;450&#215;380&#8243; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]Finally, you&#8217;re passing the value of the issues as part of the rendering object inside the\u00a0<em>SR.render()<\/em>\u00a0method. If you want to pass more values, you need to add another property to the rendering object.[\/vc_column_text][vc_single_image image=&#8221;2534&#8243; img_size=&#8221;medium&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]All you are now left with is clicking on the &#8220;Get Report&#8221; button at the top-right and view the results.[\/vc_column_text][vc_single_image image=&#8221;2536&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]Here you can see the complete code for the Script tab:[\/vc_column_text][vc_single_image image=&#8221;2538&#8243; img_size=&#8221;1392&#215;1568&#8243; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Permission tab&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602831066893-20ddd577-f6ea&#8221;][vc_column_text]To regulate the group of users that could view, edit and admin your report, you can configure the Permissions tab. The selected users will see the shared report in the &#8220;Shared&#8221; tab in the Scripted Report dashboard.<\/p>\n<p>Currently, there are three roles of report users available:<\/p>\n<p>1.\u00a0<strong>View access<\/strong>\u00a0\u2013 the user has the ability to only view the report. The user cannot save the input parameter values or edit the report configuration tab.<br \/>\n2.\u00a0<strong>Edit access<\/strong>\u00a0\u2013 the user has the ability to view the report and save the input parameter values. The user cannot edit the report configuration tab.<br \/>\n3.\u00a0<strong>Admin access<\/strong>\u00a0\u2013 the user has the ability to view the report, save the input parameter values and edit the report configuration tab.<\/p>\n<p>The creator of the report always has admin access rights! Creator rights cannot be changed.<\/p>\n<p>The Permissions tab allows sharing the direct link to the report. Please note that the respective user should have permission to at least view the shared report (role 1).[\/vc_column_text][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Saving your report&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602831089808-d164ff8f-470a&#8221;][vc_column_text]When the report set up suits your goals, save your report and choose a self-descriptive\u00a0name. You will find all your report in the Scripted Report dashboard in the tab &#8220;My reports&#8221;[\/vc_column_text][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Report improvements: Changing the script&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602831104323-1404644c-07aa&#8221;][vc_column_text]You already know how to get the spent time in comparison to the estimated time for issues. But what if you want to get a report that will calculate the work time for a whole project, so multiple issues from multiple users?\u00a0This can be achieved with minor changes in the report script.<\/p>\n<p>First, you need to define the object that will store each project worklog as a key-value pair.[\/vc_column_text][vc_single_image image=&#8221;2540&#8243; img_size=&#8221;medium&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]Next, pick the project field in the Fields Picker to be returned from the Jira API. Define the calculation logic inside the<em>\u00a0foundIssues.map()<\/em>\u00a0callback:[\/vc_column_text][vc_single_image image=&#8221;2542&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]Finally, pass the &#8220;projects&#8221; object as part of the rendering object and update the Template tab to show the data.[\/vc_column_text][vc_single_image image=&#8221;2546&#8243; img_size=&#8221;420&#215;130&#8243; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_single_image image=&#8221;2544&#8243; img_size=&#8221;large&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]These operations will show you the report with extended data.[\/vc_column_text][vc_single_image image=&#8221;2548&#8243; img_size=&#8221;420&#215;510&#8243; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][vc_column_text]Please note that you didn&#8217;t lose the previous report, but calculated project logs in addition to it. This shows the flexibility of Scripted Reports, to fetch and use the Jira data in multiple ways.[\/vc_column_text][vc_tta_accordion style=&#8221;flat&#8221; active_section=&#8221;1&#8243; no_fill=&#8221;true&#8221; collapsible_all=&#8221;true&#8221;][vc_tta_section title=&#8221;Example of the Code&#8221; tab_id=&#8221;1602831285723-adeabf54-3d07&#8243;][vc_column_text]<strong>Template:<\/strong><\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<div>\n<div id=\"highlighter_991149\" class=\"syntaxhighlighter sh-confluence nogutter js\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"js plain\">&lt;div class=<\/code><code class=\"js string\">\"issues-container\"<\/code><code class=\"js plain\">&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;h2&gt;Issues work vs original estimate&lt;\/h2&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;table&gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;tr&gt;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Ticket&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Actual work&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Original estimate&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Remaining estimate&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;\/tr&gt;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">{{<\/code><code class=\"js preprocessor\">#each issues}}<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;tr&gt;<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.key}}&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.timespent}} h&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.timeestimate}} h&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.remaining}} h&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;\/tr&gt;<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">{{\/each}}<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;\/table&gt;<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"js plain\">&lt;\/div&gt;<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"js plain\">&lt;div class=<\/code><code class=\"js string\">\"projects-container\"<\/code><code class=\"js plain\">&gt;<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;h2&gt;Projects work vs original estimate&lt;\/h2&gt;<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;table&gt;<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;tr&gt;<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Project Key&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Actual work&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Original estimate&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;th&gt;Remaining estimate&lt;\/th&gt;<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;\/tr&gt;<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">{{<\/code><code class=\"js preprocessor\">#each projects}}<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;tr&gt;<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.key}}&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.timespentHours}} h&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.timeestimateHours}} h&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;td&gt;{{<\/code><code class=\"js keyword\">this<\/code><code class=\"js plain\">.remainingHours}} h&lt;\/td&gt;<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;\/tr&gt;<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">{{\/each}}<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">&lt;\/table&gt;<\/code><\/div>\n<div class=\"line number39 index38 alt2\"><code class=\"js plain\">&lt;\/div&gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"auto-cursor-target\"><strong>Script:<\/strong><\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<div>\n<div id=\"highlighter_540376\" class=\"syntaxhighlighter sh-confluence nogutter js\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"js comments\">\/* 1. Define constants *\/<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"js plain\">const projects = {};<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"js comments\">\/* 2. Define helper functions *\/<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"js plain\">const millisecondsToHours = (milliseconds) =&gt; {<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js keyword\">if<\/code>\u00a0<code class=\"js plain\">(isNaN(milliseconds)) {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js keyword\">return<\/code>\u00a0<code class=\"js plain\">0;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">}<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js keyword\">return<\/code>\u00a0<code class=\"js plain\">(Math.round(((milliseconds \/ 3600) + Number.EPSILON) * 100) \/ 100);<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"js plain\">};<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"js comments\">\/* 3. Getting parameters for the JQL request *\/<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"js plain\">const jqlValue = SR.getValueByFieldName(<\/code><code class=\"js string\">'jql-field'<\/code><code class=\"js plain\">);<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"js plain\">const selectedFields = SR.getValueByFieldName(<\/code><code class=\"js string\">'fields-picker-field'<\/code><code class=\"js plain\">).join(<\/code><code class=\"js string\">','<\/code><code class=\"js plain\">);<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"js comments\">\/* 4. Requesting issues by JQL string and fields list *\/<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"js plain\">const foundIssues = await SR.getIssuesByJQL(jqlValue, selectedFields);<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"js plain\">console.log(<\/code><code class=\"js string\">'foundIssues'<\/code><code class=\"js plain\">, foundIssues)<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"js comments\">\/* 5. Parsing data from the response and creating the final object *\/<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"js plain\">const issues = foundIssues.map(({ key, fields }) =&gt; {<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">\/* 5.1 Get properties:<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">key - issue key<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">projectKey - project key<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">timespent - Time Spent<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">timeoriginalestimate - Original estimate<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">timeestimate - Remaining<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">*\/<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">const {<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">project: {<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">key: projectKey,<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">},<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timeestimate,<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timeoriginalestimate,<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timespent,<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">} = fields;<\/code><\/div>\n<div class=\"line number39 index38 alt2\"><\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">\/* 5.2 Projects work time vs original estimate logic\u00a0 *\/<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js keyword\">if<\/code>\u00a0<code class=\"js plain\">(projects[projectKey]) {<\/code><\/div>\n<div class=\"line number42 index41 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">\/* 5.3\u00a0 If project key is already exist then recalculate time *\/<\/code><\/div>\n<div class=\"line number43 index42 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">projects[projectKey].timeestimate += timeoriginalestimate;<\/code><\/div>\n<div class=\"line number44 index43 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">projects[projectKey].timespent += timespent;<\/code><\/div>\n<div class=\"line number45 index44 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">projects[projectKey].remaining += timeestimate;<\/code><\/div>\n<div class=\"line number46 index45 alt1\"><\/div>\n<div class=\"line number47 index46 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">projects[projectKey].timeestimateHours = millisecondsToHours(projects[projectKey].timeestimate);<\/code><\/div>\n<div class=\"line number48 index47 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">projects[projectKey].timespentHours = millisecondsToHours(projects[projectKey].timespent);<\/code><\/div>\n<div class=\"line number49 index48 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">projects[projectKey].remainingHours = millisecondsToHours(projects[projectKey].remaining);<\/code><\/div>\n<div class=\"line number50 index49 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">}\u00a0<\/code><code class=\"js keyword\">else<\/code>\u00a0<code class=\"js plain\">{<\/code><\/div>\n<div class=\"line number51 index50 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">\/* 5.4\u00a0 If project key is not exist then create object with initial time\u00a0 *\/<\/code><\/div>\n<div class=\"line number52 index51 alt1\"><\/div>\n<div class=\"line number53 index52 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">projects[projectKey] = {<\/code><\/div>\n<div class=\"line number54 index53 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">key: projectKey,<\/code><\/div>\n<div class=\"line number55 index54 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timespent,<\/code><\/div>\n<div class=\"line number56 index55 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timeestimate: timeoriginalestimate,<\/code><\/div>\n<div class=\"line number57 index56 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">remaining: timeestimate,<\/code><\/div>\n<div class=\"line number58 index57 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timeestimateHours: millisecondsToHours(timeoriginalestimate),<\/code><\/div>\n<div class=\"line number59 index58 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timespentHours: millisecondsToHours(timespent),<\/code><\/div>\n<div class=\"line number60 index59 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">remainingHours: millisecondsToHours(timeestimate),<\/code><\/div>\n<div class=\"line number61 index60 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">};<\/code><\/div>\n<div class=\"line number62 index61 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">}<\/code><\/div>\n<div class=\"line number63 index62 alt2\"><\/div>\n<div class=\"line number64 index63 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js comments\">\/* 5.5 Issue work time vs original estimate logic\u00a0 *\/<\/code><\/div>\n<div class=\"line number65 index64 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js keyword\">return<\/code>\u00a0<code class=\"js plain\">{<\/code><\/div>\n<div class=\"line number66 index65 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">key,<\/code><\/div>\n<div class=\"line number67 index66 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timespent: millisecondsToHours(timespent),<\/code><\/div>\n<div class=\"line number68 index67 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">timeestimate: millisecondsToHours(timeoriginalestimate),<\/code><\/div>\n<div class=\"line number69 index68 alt2\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">remaining: millisecondsToHours(timeestimate),<\/code><\/div>\n<div class=\"line number70 index69 alt1\"><code class=\"js spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"js plain\">};<\/code><\/div>\n<div class=\"line number71 index70 alt2\"><code class=\"js plain\">});<\/code><\/div>\n<div class=\"line number72 index71 alt1\"><\/div>\n<div class=\"line number73 index72 alt2\"><code class=\"js comments\">\/* 6. Passing values to the handlebars template engine *\/<\/code><\/div>\n<div class=\"line number74 index73 alt1\"><code class=\"js plain\">SR.render({ issues, projects });<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>[\/vc_column_text][\/vc_tta_section][\/vc_tta_accordion][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Using the report gallery&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602831346704-3f7a9e12-1bd5&#8243;][vc_column_text]The integrated report gallery is a list of predefined reports. The predefined gallery reports cannot be edited, but you can copy them into your private report list for editing.<\/p>\n<p>To copy the report, please click the button &#8220;Copy&#8221; at the top-right of the report viewing page. Right after the click your report will be created automatically in your &#8220;My Reports&#8221; tab of the Scripted Report dashboard.[\/vc_column_text][vc_single_image image=&#8221;2550&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221;][\/vc_column][\/vc_row][vc_row][vc_column][heading title=&#8221;Report Building Service&#8221; heading=&#8221;h2&#8243; font_weight=&#8221;&#8221; el_id=&#8221;1602831383703-92246a4c-06cb&#8221;][vc_column_text]If you have any further reporting needs, please contact our Report Building Service team, which will provide any report for you. Read more about our service\u00a0<a class=\"external-link\" href=\"https:\/\/www.actonic.de\/en\/report-building-service\/\" rel=\"nofollow\">here<\/a>.[\/vc_column_text][\/vc_column][\/vc_row][vc_row][vc_column][vc_empty_space height=&#8221;50px&#8221;][vc_column_text el_class=&#8221;subhead&#8221;]<\/p>\n<p style=\"text-align: center;\">Get your customized report template<\/p>\n<p>[\/vc_column_text][button title=&#8221;Report Building Service&#8221; link=&#8221;https:\/\/www.actonic.de\/en\/report-building-service\/&#8221; button_align=&#8221;center&#8221; button_size=&#8221;btn-lg&#8221; el_id=&#8221;1602838978246-957379bb-5e88&#8243;][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Report Builder: What it is &#038; what it does \u2013 All organizations have some reporting needs. With different reports you can improve project management, team performance, forecasting and progress tracking based on real-time, visual data. Read our quick start guide for customized report creation.<\/p>\n","protected":false},"author":11,"featured_media":2659,"comment_status":"open","ping_status":"open","sticky":false,"template":"single_cta.php","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[240],"tags":[280,324,291],"class_list":["post-2516","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articles-time-resource-management","tag-jira-en","tag-jira-reporting-en","tag-report-builder-en"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.4 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Jira custom reports: custom Jira Scripts with Report Builder | part 1 - Actonic \u2013 Unfolding your potential<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jira custom reports: custom Jira Scripts with Report Builder | part 1\" \/>\n<meta property=\"og:description\" content=\"Report Builder: What it is &amp; what it does \u2013 All organizations have some reporting needs. With different reports you can improve project management, team performance, forecasting and progress tracking based on real-time, visual data. Read our quick start guide for customized report creation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/\" \/>\n<meta property=\"og:site_name\" content=\"Actonic \u2013 Unfolding your potential\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-27T07:39:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-03-31T08:47:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/actonic.de\/wp-content\/uploads\/2020\/10\/Scripted-Reports-1-EN.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"585\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Viktoria Kvindt\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Viktoria Kvindt\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/\"},\"author\":{\"name\":\"Viktoria Kvindt\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#\\\/schema\\\/person\\\/91149a0b48ddec8e95d5b9a6ae4b68f0\"},\"headline\":\"Jira custom reports: custom Jira Scripts with Report Builder | part 1\",\"datePublished\":\"2020-10-27T07:39:48+00:00\",\"dateModified\":\"2023-03-31T08:47:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/\"},\"wordCount\":1986,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Scripted-Reports-1-EN.jpg\",\"keywords\":[\"Jira\",\"Jira reporting\",\"Report Builder\"],\"articleSection\":[\"Time- &amp; Resource Management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/\",\"url\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/\",\"name\":\"Jira custom reports: custom Jira Scripts with Report Builder | part 1 - Actonic \u2013 Unfolding your potential\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Scripted-Reports-1-EN.jpg\",\"datePublished\":\"2020-10-27T07:39:48+00:00\",\"dateModified\":\"2023-03-31T08:47:14+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#\\\/schema\\\/person\\\/91149a0b48ddec8e95d5b9a6ae4b68f0\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#primaryimage\",\"url\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Scripted-Reports-1-EN.jpg\",\"contentUrl\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Scripted-Reports-1-EN.jpg\",\"width\":1200,\"height\":585},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/custom-scripts-with-report-builder-part-one\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/actonic.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jira custom reports: custom Jira Scripts with Report Builder | part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/actonic.de\\\/en\\\/\",\"name\":\"Actonic \u2013 Unfolding your potential\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/actonic.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#\\\/schema\\\/person\\\/91149a0b48ddec8e95d5b9a6ae4b68f0\",\"name\":\"Viktoria Kvindt\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c46b8a812df855d9f6d75d7a83d78b7325163285f00b181bdb95b75be561b484?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c46b8a812df855d9f6d75d7a83d78b7325163285f00b181bdb95b75be561b484?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c46b8a812df855d9f6d75d7a83d78b7325163285f00b181bdb95b75be561b484?s=96&d=mm&r=g\",\"caption\":\"Viktoria Kvindt\"},\"url\":\"https:\\\/\\\/actonic.de\\\/en\\\/author\\\/viktoria-kiefel\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Jira custom reports: custom Jira Scripts with Report Builder | part 1 - Actonic \u2013 Unfolding your potential","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/","og_locale":"en_US","og_type":"article","og_title":"Jira custom reports: custom Jira Scripts with Report Builder | part 1","og_description":"Report Builder: What it is & what it does \u2013 All organizations have some reporting needs. With different reports you can improve project management, team performance, forecasting and progress tracking based on real-time, visual data. Read our quick start guide for customized report creation.","og_url":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/","og_site_name":"Actonic \u2013 Unfolding your potential","article_published_time":"2020-10-27T07:39:48+00:00","article_modified_time":"2023-03-31T08:47:14+00:00","og_image":[{"width":1200,"height":585,"url":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/10\/Scripted-Reports-1-EN.jpg","type":"image\/jpeg"}],"author":"Viktoria Kvindt","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Viktoria Kvindt","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#article","isPartOf":{"@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/"},"author":{"name":"Viktoria Kvindt","@id":"https:\/\/actonic.de\/en\/#\/schema\/person\/91149a0b48ddec8e95d5b9a6ae4b68f0"},"headline":"Jira custom reports: custom Jira Scripts with Report Builder | part 1","datePublished":"2020-10-27T07:39:48+00:00","dateModified":"2023-03-31T08:47:14+00:00","mainEntityOfPage":{"@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/"},"wordCount":1986,"commentCount":0,"image":{"@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#primaryimage"},"thumbnailUrl":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/10\/Scripted-Reports-1-EN.jpg","keywords":["Jira","Jira reporting","Report Builder"],"articleSection":["Time- &amp; Resource Management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/","url":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/","name":"Jira custom reports: custom Jira Scripts with Report Builder | part 1 - Actonic \u2013 Unfolding your potential","isPartOf":{"@id":"https:\/\/actonic.de\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#primaryimage"},"image":{"@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#primaryimage"},"thumbnailUrl":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/10\/Scripted-Reports-1-EN.jpg","datePublished":"2020-10-27T07:39:48+00:00","dateModified":"2023-03-31T08:47:14+00:00","author":{"@id":"https:\/\/actonic.de\/en\/#\/schema\/person\/91149a0b48ddec8e95d5b9a6ae4b68f0"},"breadcrumb":{"@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#primaryimage","url":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/10\/Scripted-Reports-1-EN.jpg","contentUrl":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/10\/Scripted-Reports-1-EN.jpg","width":1200,"height":585},{"@type":"BreadcrumbList","@id":"https:\/\/actonic.de\/en\/custom-scripts-with-report-builder-part-one\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/actonic.de\/en\/"},{"@type":"ListItem","position":2,"name":"Jira custom reports: custom Jira Scripts with Report Builder | part 1"}]},{"@type":"WebSite","@id":"https:\/\/actonic.de\/en\/#website","url":"https:\/\/actonic.de\/en\/","name":"Actonic \u2013 Unfolding your potential","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/actonic.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/actonic.de\/en\/#\/schema\/person\/91149a0b48ddec8e95d5b9a6ae4b68f0","name":"Viktoria Kvindt","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c46b8a812df855d9f6d75d7a83d78b7325163285f00b181bdb95b75be561b484?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c46b8a812df855d9f6d75d7a83d78b7325163285f00b181bdb95b75be561b484?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c46b8a812df855d9f6d75d7a83d78b7325163285f00b181bdb95b75be561b484?s=96&d=mm&r=g","caption":"Viktoria Kvindt"},"url":"https:\/\/actonic.de\/en\/author\/viktoria-kiefel\/"}]}},"jetpack_featured_media_url":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/10\/Scripted-Reports-1-EN.jpg","_links":{"self":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/posts\/2516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/comments?post=2516"}],"version-history":[{"count":0,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/posts\/2516\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/media\/2659"}],"wp:attachment":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/media?parent=2516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/categories?post=2516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/tags?post=2516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}