Hi,
I’ve made this script with the help of Google Gemini to calculate the actual date/time of my Garmin recovery time. There is only one problem; I have to re-analyze the activity to get it to populate correctly.
Does anyone have a solution for this? So that I don’t have to re-analyze every time I upload a new activity?
try {
// --- PRE-CALCULATION FOR LOGGING ---
var totalSecondsForLog = activity.elapsed_time;
var hoursForLog = Math.floor(totalSecondsForLog / 3600);
var minutesForLog = Math.floor((totalSecondsForLog % 3600) / 60);
var secondsForLog = totalSecondsForLog % 60;
var elapsedTimeFormatted = String(hoursForLog).padStart(2, '0') + ":" +
String(minutesForLog).padStart(2, '0') + ":" +
String(secondsForLog).padStart(2, '0');
// --- STEP 1: CALCULATE WORKOUT END TIME ---
var workoutStartDate = new Date(activity.start_date);
var workoutEndDate = new Date(workoutStartDate.getTime());
workoutEndDate.setSeconds(workoutEndDate.getSeconds() + activity.elapsed_time);
// --- STEP 2: CALCULATE RECOVERY DURATION ---
var durationInHours = activity.isNew ? activity.RecoveryTime / 60 : activity.RecoveryTime;
var recoveryDurationInSeconds = Math.round(durationInHours * 3600);
// --- STEP 3: CALCULATE FINAL TARGET DATE ---
var finalTargetDateUtc = new Date(workoutEndDate.getTime());
finalTargetDateUtc.setSeconds(finalTargetDateUtc.getSeconds() + recoveryDurationInSeconds);
// --- STEP 4: FORMATTING FOR DISPLAY AND LOGGING ---
var timezoneOffsetHours = 2;
// Format the Workout End Time for logging
var workoutEndDay = String(workoutEndDate.getUTCDate()).padStart(2, '0');
var workoutEndMonth = String(workoutEndDate.getUTCMonth() + 1).padStart(2, '0');
var workoutEndYear = workoutEndDate.getUTCFullYear();
var workoutEndHours = workoutEndDate.getUTCHours() + timezoneOffsetHours;
if (workoutEndHours >= 24) { workoutEndHours -= 24; }
var workoutEndHoursPadded = String(workoutEndHours).padStart(2, '0');
var workoutEndMinutes = String(workoutEndDate.getUTCMinutes()).padStart(2, '0');
var workoutEndSeconds = String(workoutEndDate.getUTCSeconds()).padStart(2, '0');
var workoutEndDateFormatted = workoutEndDay + "-" + workoutEndMonth + "-" + workoutEndYear + " " +
workoutEndHoursPadded + ":" + workoutEndMinutes + ":" + workoutEndSeconds;
// Format the Final Recovery Date for display
var finalDay = String(finalTargetDateUtc.getUTCDate()).padStart(2, '0');
var finalMonth = String(finalTargetDateUtc.getUTCMonth() + 1).padStart(2, '0');
var finalYear = finalTargetDateUtc.getUTCFullYear();
var finalHours = finalTargetDateUtc.getUTCHours() + timezoneOffsetHours;
if (finalHours >= 24) { finalHours -= 24; }
var finalHoursPadded = String(finalHours).padStart(2, '0');
var finalMinutes = String(finalTargetDateUtc.getUTCMinutes()).padStart(2, '0');
var finalSeconds = String(finalTargetDateUtc.getUTCSeconds()).padStart(2, '0');
var finalDisplayString = finalDay + "-" + finalMonth + "-" + finalYear + " " +
finalHoursPadded + ":" + finalMinutes + ":" + finalSeconds;
// --- FINAL LOG OUTPUT ---
console.log("--- RECOVERY CALCULATION BASIS ---");
console.log("Input RecoveryTime (hours):", activity.RecoveryTime);
console.log("Input Elapsed Time (hh:mm:ss):", elapsedTimeFormatted);
console.log("Workout End Time (Local):", workoutEndDateFormatted);
console.log("Final Calculated Result:", finalDisplayString);
console.log("------------------------------------");
finalDisplayString;
} catch (e) {
"Error in script. Check logs.";
}