Range calculator scripts
Summarize
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 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)andgetTimeObject(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
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
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
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'
}getTimeMs: function(date){
return new ScheduleDateTime(date).getMS();
}
getTimeObject: function(timeMS) {
var gdt = new GlideDateTime();
gdt.setNumericValue(timeMS);
return gdt;
}