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

如何用JavaScript解决Google Sheets任务日期判断的逻辑难题?

解决方案

核心逻辑梳理

根据需求,核心规则可总结为:

  • 三个任务全部完成时,返回 DELETE
  • 未全部完成时,优先返回最靠后的未完成任务的日期;若该任务日期已过期仍优先返回;若存在多个未完成的未来任务,取其中最晚的日期(匹配后期任务优先级更高的要求)

完整自定义函数代码

function getNextTaskDate(date1, date2, date3, done1, done2, done3) {
  const TODAY = new Date();
  // 重置今日时间为0点,避免时分秒干扰日期比较
  TODAY.setHours(0, 0, 0, 0);

  // 把任务整理为结构化数组,方便后续处理
  const tasks = [
    { date: new Date(date1), done: Boolean(done1) },
    { date: new Date(date2), done: Boolean(done2) },
    { date: new Date(date3), done: Boolean(done3) }
  ];

  // 所有任务完成时返回DELETE
  if (tasks.every(task => task.done)) {
    return 'DELETE';
  }

  // 筛选出所有未完成的任务
  const incompleteTasks = tasks.filter(task => !task.done);

  // 从这些未完成任务里,挑出日期在今天及之后的
  const futureTasks = incompleteTasks.filter(task => {
    const taskDate = new Date(task.date);
    taskDate.setHours(0, 0, 0, 0);
    return taskDate >= TODAY;
  });

  if (futureTasks.length > 0) {
    // 对未来未完成任务按日期倒序排序,取最晚的那个(符合后期任务优先级)
    futureTasks.sort((a, b) => b.date - a.date);
    return futureTasks[0].date;
  } else {
    // 所有未完成任务都已过期,从后往前找第一个未完成的任务返回其日期
    for (let i = tasks.length - 1; i >= 0; i--) {
      if (!tasks[i].done) {
        return tasks[i].date;
      }
    }
  }

  // 兜底返回,理论上不会触发
  return '';
}

使用说明

  1. 打开你的Google表格,点击「扩展程序」→「Apps脚本」
  2. 替换默认代码为上述函数,保存项目
  3. 在表格单元格中输入公式,比如 =getNextTaskDate(D2, F2, H2, E2, G2, I2)(对应D、F、H列的截止日期,E、G、I列的done布尔值)

逻辑说明

  • 统一处理日期格式,避免时间部分干扰日期比较
  • 优先判断全完成状态,直接返回DELETE
  • 未完成任务中,优先保留未来到期的任务,再按日期从晚到早排序取第一个(满足后期任务优先级要求)
  • 若所有未完成任务都已过期,仍从后往前取第一个未完成任务的日期,匹配后期任务优先规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:40:24