
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-06-2025 07:57 AM
I've been asked to create automated tasks at the beginning of the month for the 4 or 5 Mondays in the month. I am triggering on the first of the month and I created 5 variables (firstMonday, secondMonday, etc.). I am setting the firstMonday with the following code:
var dt = new GlideDateTime();
dt.setDisplayValue(fd_data.trigger.run_start_time.getDisplayValue());
dt.setDate(1); //Start on the first of the month, in case I run it outside of schedule
// Get the first Monday in the month
while (dt.getDay() !== 1) {
dt.setDate(dt.getDate() + 1);
}
return dt.getDisplayValue();
I am doing the same thing, except I add a "dt.setDate(dt.getDate() + 7);" for each day I want to get to. The code works fine when I run it outside of SN. When I run it in SN, it just sits there and then cancels after about 5 minutes with an Internal Server Error. The error message says it needs to return something, but I am return the date. What am I missing?
Thank you, Charles
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-06-2025 08:32 AM
Please try this.
In ServiceNow, GlideDateTime.setDate() does not increment the date like you’re trying to do (e.g., dt.setDate(dt.getDate() + 1) is not valid GlideDateTime logic). Instead, you need to use addDaysLocalTime() to move the date forward.
(function getMondaysOfMonth() {
var runTime = new GlideDateTime();
runTime.setDisplayValue(fd_data.trigger.run_start_time.getDisplayValue());
// Reset to first day of the current month
var month = runTime.getLocalDate().getMonthLocalTime() + 1; // months are 0-based
var year = runTime.getLocalDate().getYearLocalTime();
var dt = new GlideDateTime(year + '-' + month + '-01 00:00:00');
// Move forward to the first Monday
while (dt.getDayOfWeekLocalTime() !== 1) { // 1 = Monday
dt.addDaysLocalTime(1);
}
// Store up to 5 Mondays
var mondays = [];
for (var i = 0; i < 5; i++) {
// Only push if the date is still in the same month
var currentMonth = dt.getLocalDate().getMonthLocalTime();
if (currentMonth === month - 1) {
mondays.push(dt.getDisplayValue());
dt.addDaysLocalTime(7);
} else {
break; // Exit loop if we move into the next month
}
}
// Log or return the values (adapt this part based on your use case)
gs.info('Mondays this month: ' + mondays.join(', '));
// Example: return the first Monday
return mondays[0];
})();
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-06-2025 08:32 AM
Please try this.
In ServiceNow, GlideDateTime.setDate() does not increment the date like you’re trying to do (e.g., dt.setDate(dt.getDate() + 1) is not valid GlideDateTime logic). Instead, you need to use addDaysLocalTime() to move the date forward.
(function getMondaysOfMonth() {
var runTime = new GlideDateTime();
runTime.setDisplayValue(fd_data.trigger.run_start_time.getDisplayValue());
// Reset to first day of the current month
var month = runTime.getLocalDate().getMonthLocalTime() + 1; // months are 0-based
var year = runTime.getLocalDate().getYearLocalTime();
var dt = new GlideDateTime(year + '-' + month + '-01 00:00:00');
// Move forward to the first Monday
while (dt.getDayOfWeekLocalTime() !== 1) { // 1 = Monday
dt.addDaysLocalTime(1);
}
// Store up to 5 Mondays
var mondays = [];
for (var i = 0; i < 5; i++) {
// Only push if the date is still in the same month
var currentMonth = dt.getLocalDate().getMonthLocalTime();
if (currentMonth === month - 1) {
mondays.push(dt.getDisplayValue());
dt.addDaysLocalTime(7);
} else {
break; // Exit loop if we move into the next month
}
}
// Log or return the values (adapt this part based on your use case)
gs.info('Mondays this month: ' + mondays.join(', '));
// Example: return the first Monday
return mondays[0];
})();

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-06-2025 08:45 AM
Thank you folusho, that seems to have done the trick.