如何用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 ''; }
使用说明
- 打开你的Google表格,点击「扩展程序」→「Apps脚本」
- 替换默认代码为上述函数,保存项目
- 在表格单元格中输入公式,比如
=getNextTaskDate(D2, F2, H2, E2, G2, I2)(对应D、F、H列的截止日期,E、G、I列的done布尔值)
逻辑说明
- 统一处理日期格式,避免时间部分干扰日期比较
- 优先判断全完成状态,直接返回
DELETE - 未完成任务中,优先保留未来到期的任务,再按日期从晚到早排序取第一个(满足后期任务优先级要求)
- 若所有未完成任务都已过期,仍从后往前取第一个未完成任务的日期,匹配后期任务优先规则
内容的提问来源于stack exchange,提问作者Alfie Stoppani
相关产品推荐
相关产品推荐

