Range calculator scripts

  • Release version: Yokohama
  • Updated January 30, 2025
  • 2 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Range calculator scripts

    Range calculator scripts in ServiceNow enable you to define and enforce range restrictions on timeline spans, such as sprints and releases, and to update parent records automatically when child spans are adjusted. These scripts help maintain accurate start and end date boundaries within timeline pages, supporting better planning and schedule management.

    Show full answer Show less

    Key Features

    • ExampleUpdateParentsRangeCalculator: Updates parent records (e.g., releases) when a child record’s span (e.g., sprint) is moved or resized. It adjusts the parent’s start and end dates if the child's new dates extend beyond current boundaries.
    • ExampleMinRangeCalculator: Calculates the earliest start date and latest end date among child spans related to a parent record. Useful for determining minimum range details across related records.
    • ExampleMaxRangeCalculator: Similar to the MinRangeCalculator but focuses on fetching maximum range details for a specified span, typically validating or updating parent date boundaries based on child spans.
    • Utility functions: Each script includes helper functions getTimeMs(date) and getTimeObject(timeMS) to convert dates to millisecond timestamps and back, ensuring accurate date comparisons and updates.

    Practical Application for ServiceNow Customers

    By implementing these script includes, you can automate timeline consistency in your Agile or release planning modules. When sprints or other child timeline records are adjusted, the scripts automatically ensure that parent release records reflect accurate start and end dates without manual intervention. This streamlines project tracking, reduces errors, and keeps timeline data synchronized.

    The examples provided are templates that you can customize to your specific tables and business logic, enabling flexible control over how timeline ranges are calculated and updated in your instance.

    You can specify a script include that calculates range restrictions and processes parent updates in a timeline page.

    Range Calculator Scripts

    Following are three examples of script includes that help specify range restrictions.

    ExampleUpdateParentsRangeCalculator

    Updates parent records when a child record span is moved or resized in the timeline.
    var ExampleUpdateParentsRangeCalculator = Class.create();
    ExampleUpdateParentsRangeCalculator.prototype = {
    initialize: function() { },
    updateParents: function(id, table, startDate, endDate){
     if (table == "rm_sprint"){
       var releaseID;
       var sprint = new GlideRecord(table);
       sprint.addQuery('sys_id', id);
       sprint.query();
       if (sprint.next())
         releaseID = sprint.release + "";
       if (releaseID) {
             var now_GR = new GlideRecord("rm_release_scrum");
             gr.addQuery("sys_id", releaseID);
             gr.query();
             if (gr.next()) {
               if (startDate  && startDate < this.getTimeMs(gr.start_date))
                   gr.start_date = this.getTimeObject(startDate); 
               if (endDate && endDate > this.getTimeMs(gr.end_date))
                  gr.end_date = this.getTimeObject(endDate);
                  gr.update();
             }
        }
      }
    },  
    getMinRangeDetails: function(id, table){ return [-1, -1, "", ""]; },
    getMaxRangeDetails: function(id, table){ return [-1, -1, ""]; },
    getTimeMs: function(date){ 
      return new GlideScheduleDateTime(date).getMS(); },
    getTimeObject: function(timeMS) { 
      var gdt = new GlideDateTime(); 
      gdt.setNumericValue(timeMS); 
      return gdt; },
    logMessage: function(message){ gs.log(message); },
    type: 'ExampleUpdateParentsRangeCalculator'
    }

    In this example, the span is identified based on the id and table from function(id, table, startDate, endDate).

    ExampleMinRangeCalculator

    Defines the earliest start date and the latest end date for a specified span.
    var ExampleMinRangeCalculator = Class.create();
      ExampleMinRangeCalculator.prototype = {
          initialize: function() { },
          updateParents: function(id, table, startDate, endDate){ },
          getMinRangeDetails: function(id, table){
               var min = -1;
               var max = -1;
               var minID = "";
               var maxID = "";
               if (table == "rm_release_scrum"){
                        var now_GR = new GlideRecord("rm_sprint");
                        gr.addQuery("release", id);
                        gr.query();
                        while(gr.next()){
                             var start = this.getTimeMs(gr["start_date"]);
                             var end = this.getTimeMs(gr["end_date"]);
                             var id = gr["sys_id"];
                             if (min == - 1 || start <= min){
                                    if (start != min)
                                         minID = "";
                             min = start;
                             minID += "," + id;
                             }
                             if (max == -1 || end >= max){
                                        if (end != max)
                                                maxID = "";
                                        max = end;
                                        maxID += "," + id;
                                }  
                         }
                }
            return [min, max, minID, maxID];
    },
    getMaxRangeDetails: function(id, table){ return [-1, -1, ""]; },
    getTimeMs: function(date){ return new GlideScheduleDateTime(date).getMS(); },
    getTimeObject: function(timeMS) { 
      var gdt = new GlideDateTime(); 
      gdt.setNumericValue(timeMS); 
      return gdt; },
    logMessage: function(message){ gs.log(message); },
    type: 'ExampleUpdateParentsRangeCalculator'
    }

    ExampleMaxRangeCalculator

    Defines the earliest start date and the latest end date for a specified span.
    var ExampleMaxRangeCalculator = Class.create();
    ExampleMaxRangeCalculator.prototype = {
       initialize: function() { },
       updateParents: function(id, table, startDate, endDate){ },
       getMinRangeDetails: function(id, table){ return [-1, -1, "", ""]; },
       getMaxRangeDetails: function(id, table){
          if (table == "rm_sprint"){
             var sprint = new GlideRecord(table);
             sprint.addQuery('sys_id', id);
             sprint.query();
             if (sprint.next())
                releaseID = sprint.release + "";
             if (releaseID) {
                var now_GR = new GlideRecord("rm_release_scrum");
                gr.addQuery("sys_id", releaseID);
                gr.query();
                if (gr.next())
                   return [this.getTimeMs(gr.start_date),
                    this.getTimeMs(gr.end_date), gr.sys_id];
             }
          }
          return [-1, -1, ""];
       },
       getTimeMs: function(date){ return new ScheduleDateTime(date).getMS(); },
       getTimeObject: function(timeMS) { 
         var gdt = new GlideDateTime();
         gdt.setNumericValue(timeMS); 
         return gdt; },
       logMessage: function(message){ gs.log(message); },
       type: 'ExampleUpdateParentsRangeCalculator'
    }
    Use the following two functions to obtain the correct start and end dates in the three example script includes provided for reference.
    getTimeMs: function(date){
            return new ScheduleDateTime(date).getMS();
        }
    getTimeObject: function(timeMS) {
            var gdt = new GlideDateTime();
            gdt.setNumericValue(timeMS);
            return gdt;
        }