Google Apps Script周日期范围问题求助:周一匹配失效+周日计算异常
问题分析与代码修复
你的代码核心问题出在日期计算函数getRelativeDayInWeek2的逻辑上,导致两个问题:周日时所有日期计算错误,以及周一日期无法匹配。以下是具体修复方案:
关键问题拆解
- 周日逻辑失效:原函数中当
day == 0(周日)时,强制将偏移量替换为-6,完全忽略传入的相对天数参数,导致无论请求哪周的日期,都返回上周周一。 - 周一匹配失败:原函数未正确以周一作为周起始点计算,且未统一重置日期的时间部分,表格中的日期可能带有时段(如上午9点),与计算出的0点日期比较时出现偏差。
修复后的完整代码
function weekDatesRange() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName('📅 Todos los eventos'); // 获取当前日期并重置时间为0点,避免时段干扰 var hoy = new Date(); hoy.setHours(0, 0, 0, 0); Logger.log('当前日期(0点): ' + hoy); // 计算指定偏移周的指定星期几(1=周一,7=周日) // offsetWeeks: 0=本周, -1=上周, 1=下周 function getWeekDay(date, offsetWeeks, dayOfWeek) { const d = new Date(date); const currentWeekDay = d.getDay() || 7; // 将周日(0)转为7,统一周一到周日为1-7 // 计算到目标星期几的天数偏移 const dayOffset = dayOfWeek - currentWeekDay; // 加上周偏移的天数 d.setDate(d.getDate() + dayOffset + offsetWeeks * 7); return d; } // 计算各周的起止日期 var lunesPasado = getWeekDay(hoy, -1, 1); // 上周周一 var domingoPasado = getWeekDay(hoy, -1, 7); // 上周周日 var lunes = getWeekDay(hoy, 0, 1); // 本周周一 var domingo = getWeekDay(hoy, 0, 7); // 本周周日 var proximoLunes = getWeekDay(hoy, 1, 1); // 下周周一 var proximoDomingo = getWeekDay(hoy, 1, 7); // 下周周日 Logger.log('LAST MONDAY: ' + lunesPasado); Logger.log('LAST SUNDAY: ' + domingoPasado); Logger.log('MONDAY: ' + lunes); Logger.log('SUNDAY: ' + domingo); Logger.log('NEXT MONDAY: ' + proximoLunes); Logger.log('NEXT SUNDAY: ' + proximoDomingo); // 获取任务数据并筛选 const lastRow = sheet.getLastRow(); if (lastRow < 2) return; // 无数据时直接返回,避免报错 const rango = sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()); var values = rango.getValues(); values.forEach((fila) => { // 将表格中的日期重置为0点,统一比较基准 const taskDate = new Date(fila[0]); taskDate.setHours(0, 0, 0, 0); if (taskDate >= lunesPasado && taskDate <= domingoPasado) { Logger.log(fila[0].toDateString() + ' ---> ' + 'Esta tarea fué la semana PASADA - Last Week'); } else if (taskDate >= lunes && taskDate <= domingo) { Logger.log(fila[0].toDateString() + ' ---> ' + 'Esta tarea será ESTA semana - This Week'); } else if (taskDate >= proximoLunes && taskDate <= proximoDomingo) { Logger.log(fila[0].toDateString() + ' ---> ' + 'Esta tarea será la PROXIMA semana - Next Week'); } }) }
修复说明
- 统一周起始逻辑:将
getDay()返回的周日(0)转换为7,让周一到周日对应1-7,完全符合西班牙周起始规则。 - 修复周日计算错误:不再强制替换偏移参数,而是根据目标星期几与当前星期几的差值计算偏移,无论当前是周几都能正确返回对应日期。
- 重置时间为0点:当前日期和任务日期都重置为当天0点,消除时段差异导致的比较错误,解决周一无法匹配的问题。
- 增加边界判断:当表格只有表头时直接返回,避免空数据报错。
内容的提问来源于stack exchange,提问作者Nerea
相关产品推荐
相关产品推荐

