You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script周日期范围问题求助:周一匹配失效+周日计算异常

问题分析与代码修复

你的代码核心问题出在日期计算函数getRelativeDayInWeek2的逻辑上,导致两个问题:周日时所有日期计算错误,以及周一日期无法匹配。以下是具体修复方案:

关键问题拆解

  1. 周日逻辑失效:原函数中当day == 0(周日)时,强制将偏移量替换为-6,完全忽略传入的相对天数参数,导致无论请求哪周的日期,都返回上周周一。
  2. 周一匹配失败:原函数未正确以周一作为周起始点计算,且未统一重置日期的时间部分,表格中的日期可能带有时段(如上午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');
    }
  })    
}

修复说明

  1. 统一周起始逻辑:将getDay()返回的周日(0)转换为7,让周一到周日对应1-7,完全符合西班牙周起始规则。
  2. 修复周日计算错误:不再强制替换偏移参数,而是根据目标星期几与当前星期几的差值计算偏移,无论当前是周几都能正确返回对应日期。
  3. 重置时间为0点:当前日期和任务日期都重置为当天0点,消除时段差异导致的比较错误,解决周一无法匹配的问题。
  4. 增加边界判断:当表格只有表头时直接返回,避免空数据报错。

内容的提问来源于stack exchange,提问作者Nerea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:35:19