這個問題來自 Notion 系統課程讀者的提問,經整理後分享於此。如果你在使用 Notion 的過程中遇到了類似問題,歡迎留言交流。
簡介
這個 Notion 函數可以幫助你自動判斷任務的狀態、截止日期和完成情況,並以不同顏色和圖標直觀顯示。它能夠顯示任務是否按時完成、提前完成、逾期完成,或者對於未完成的任務,顯示剩餘時間或已逾期時間。


設置方法
1. 建立必要的欄位
確保你的 Notion 資料庫中有以下屬性,名稱必須完全一致:
- 排期(類型:日期)
- 狀態(類型:狀態)
- 完成日期(類型:日期)
2. 設置狀態欄位
在狀態屬性中,添加以下選項:
- 收集
- 擱置
- 待辦
- 執行中
- 完成
- 放棄

可以根據個人喜好為這些狀態設置不同的顏色。
3. 建立公式欄位
- 添加一個公式欄位
- 將屬性命名為「逾期提醒」(或你喜歡的任何名稱)
- 選擇屬性類型為「公式」
- 在公式編輯框中貼上以下程式碼
參考模板
- 模板連結:https://leon21.notion.site/1e80e68aa04680cd8793cd68562247c5?pvs=4
- 本頁面中的參考程式碼不是最新的,請以上面的模板連結為準
公式程式碼
/* ================================================== */
/* 任务状态与逾期判断 v21.1 @二一的笔记 */
/* ================================================== */
/* 依赖属性: */
/* - 排期 (Date) */
/* - 状态 (Select/Status) */
/* - 完成日期 (Date) */
/* ================================================== */
let(
/* --- 基本变量 --- */
schedule, prop("排期"),
status, prop("状态"),
completionDate, prop("完成日期"),
nowDate, now(),
isScheduleEmpty, empty(schedule),
isCompletionDateEmpty, empty(completionDate),
/* --- 日期范围相关 (如果排期不为空) --- */
startDate, if(isScheduleEmpty, "", dateStart(schedule)), /* 范围开始日期 */
endDate, if(isScheduleEmpty, "", dateEnd(schedule)), /* 范围结束日期 (截止日期) */
/* --- 检查是否有具体时间 (不是00:00) --- */
hasEndTime, not isScheduleEmpty and formatDate(endDate, "HH:mm") != "00:00", /* 检查结束日期是否有时间 */
hasStartTime, not isScheduleEmpty and formatDate(startDate, "HH:mm") != "00:00", /* 检查开始日期是否有时间 */
hasCompletionTime, not isCompletionDateEmpty and formatDate(completionDate, "HH:mm") != "00:00",
shouldShowDetailedTime, hasEndTime or hasCompletionTime or hasStartTime, /* 只要任一有时间,就可能需要详细显示 */
/* --- 主逻辑判断 (基于状态) --- */
ifs(
/* --- 状态: 放弃 --- */
status == "放弃",
if(not isCompletionDateEmpty,
style("✅ 已完成 · 请修改任务状态", "green,b,green_background,c"),
style("🚫 已放弃", "gray,b,gray_background,c")
),
/* --- 状态: 完成 --- */
status == "完成",
let(
deadline, endDate, /* 完成状态主要看截止日期 */
ifs(
isScheduleEmpty and isCompletionDateEmpty,
style("✅ 已完成", "green,b,green_background,c"),
isCompletionDateEmpty, /* 有排期,无完成日期 */
style("✅ 按时完成", "green,b,green_background,c"),
isScheduleEmpty, /* 无排期,有完成日期 */
style("✅ 已完成", "green,b,green_background,c"),
/* --- 有排期和完成日期的情况 --- */
ifs(
completionDate > deadline,
let( diff_minutes, dateBetween(completionDate, deadline, "minutes"), let( days, floor(diff_minutes / 1440), let( hours, floor(mod(diff_minutes, 1440) / 60), let( minutes, mod(diff_minutes, 60),
style( "✅ 完成 · 逾期" + if(days > 0, days + "天", "") + if(hours > 0, hours + "小时", "") + if(minutes > 0, minutes + "分钟", "") + if(days == 0 and hours == 0 and minutes == 0, "片刻", ""), "orange,b,orange_background,c" ) )))),
completionDate == deadline,
style("✅ 按时完成", "green,b,green_background,c"),
let( diff_minutes, dateBetween(deadline, completionDate, "minutes"), let( days, floor(diff_minutes / 1440), let( hours, floor(mod(diff_minutes, 1440) / 60), let( minutes, mod(diff_minutes, 60),
style( "🎉 提前" + if(days > 0, days + "天", "") + if(hours > 0, hours + "小时", "") + if(minutes > 0, minutes + "分钟", "") + if(days == 0 and hours == 0 and minutes == 0, "片刻", "") + "达成", "pink,b,pink_background,c" ) ))))
)
)
),
/* --- 状态: 其他活动状态 (收集, 搁置, 待办, 执行中) --- */
if(isScheduleEmpty,
style("⚪ 未设置排期", "gray"),
let(
deadline, endDate, /* 活动状态关注截止日期 */
if(not isCompletionDateEmpty,
if(completionDate <= deadline,
style("✅ 已完成 · 请修改任务状态", "green,b,green_background,c"),
style("❗ 已逾期完成 · 请修改任务状态", "red,b,red_background,c")
),
/* --- 完成日期未填,按正常活动状态判断 --- */
ifs(
/* 1. 今天截止? (精确判断) */
formatDate(nowDate, "YYYY-MM-DD") == formatDate(deadline, "YYYY-MM-DD"),
if(hasEndTime, /* 检查结束日期是否有时间 */
if(nowDate > deadline, /* 如果当前时间已超过截止时间 */
let( diff_minutes, dateBetween(nowDate, deadline, "minutes"), let( hours, floor(diff_minutes / 60), let( minutes, mod(diff_minutes, 60),
style( "⏰ 已超期" + if(hours > 0, hours + "小时", "") + if(minutes > 0, minutes + "分钟", "") + if(hours == 0 and minutes == 0, "片刻", ""), "red,b,red_background,c" ) ))),
/* 如果当前时间未超过截止时间 */
style("⚠️ 今天 " + formatDate(deadline, "HH:mm") + " 截止", "yellow,b,yellow_background,c")
),
/* 如果没有具体截止时间 */
style("⚠️ 今天截止", "yellow,b,yellow_background,c")
),
/* 2. 明天开始? (针对有开始时间的范围) */
hasStartTime and formatDate(nowDate, "YYYY-MM-DD") == formatDate(dateAdd(startDate, -1, "days"), "YYYY-MM-DD"),
let( remainingHours, dateBetween(startDate, nowDate, "hours"),
style("🚀 明天 " + formatDate(startDate, "HH:mm") + " 开始,还剩" + remainingHours + "小时", "blue,b,blue_background,c")
),
/* 3. 明天截止? */
formatDate(nowDate, "YYYY-MM-DD") == formatDate(dateAdd(deadline, -1, "days"), "YYYY-MM-DD"),
if(hasEndTime, /* 检查是否有具体结束时间 */
style("🔔 明天 " + formatDate(deadline, "HH:mm") + " 截止", "orange,b,orange_background,c"),
style("🔔 明天截止", "orange,b,orange_background,c")
),
/* 4. 后天开始? (检查开始日期是后天且有时间) */
hasStartTime and formatDate(nowDate, "YYYY-MM-DD") == formatDate(dateAdd(startDate, -2, "days"), "YYYY-MM-DD"),
let(
diff_minutes, dateBetween(startDate, nowDate, "minutes"),
let(
total_hours, floor(diff_minutes / 60), /* 计算总剩余小时 */
let(
days, floor(total_hours / 24), /* 换算成天 */
let(
hours, mod(total_hours, 24), /* 剩余小时 */
style(
"🗓️ 后天 " + formatDate(startDate, "HH:mm") + " 开始,还剩" +
if(days > 0, days + "天", "") +
if(hours > 0, hours + "小时", "") +
if(days == 0 and hours == 0 and diff_minutes > 0, "不到1小时", "") + /* 如果不足一小时 */
if(days == 0 and hours == 0 and diff_minutes <= 0, "片刻", ""), /* 精确到开始时间 */
"purple,b,purple_background,c"
)
)
)
)
),
/* 5. 已逾期? (当前时间已晚于截止日期) */
nowDate > deadline,
if(shouldShowDetailedTime,
let( diff_minutes, dateBetween(nowDate, deadline, "minutes"), let( days, floor(diff_minutes / 1440), let( hours, floor(mod(diff_minutes, 1440) / 60), let( minutes, mod(diff_minutes, 60),
style( "⏰ 已超期" + if(days > 0, days + "天", "") + if(hours > 0, hours + "小时", "") + if(minutes > 0, minutes + "分钟", "") + if(days == 0 and hours == 0 and minutes == 0, "片刻", ""), "red,b,red_background,c" ) )))),
let( overdueDays, dateBetween(dateStart(nowDate), dateStart(deadline), "days"),
style("⏰ 已超期" + if(overdueDays == 0, 1, overdueDays) + "天", "red,b,red_background,c")
)
),
/* 6. 即将到来 (默认情况),计算距离截止时间 --- */
if(shouldShowDetailedTime,
let( diff_minutes, dateBetween(deadline, nowDate, "minutes"), let( days, floor(diff_minutes / 1440), let( hours, floor(mod(diff_minutes, 1440) / 60), let( minutes, mod(diff_minutes, 60),
if(days == 0 and hours < 24, style( "⌛ 剩余" + if(hours > 0, hours + "小时", "") + if(minutes > 0, minutes + "分钟", "") + if(hours == 0 and minutes == 0, "片刻", ""), "purple,b,purple_background,c" ),
style( "⏳ 剩余" + if(days > 0, days + "天", "") + if(hours > 0, hours + "小时", "") + if(minutes > 0, minutes + "分钟", ""), "purple,b,purple_background,c" )
) )))),
/* 否则使用天数计算 (只显示距离截止日期的天数) */
let( remainingDays, dateBetween( parseDate(formatDate(deadline, "YYYY-MM-DD")), parseDate(formatDate(nowDate, "YYYY-MM-DD")), "days" ),
/* 后天截止(无时间) 或 更远日期 */
if(remainingDays == 2,
style("🗓️ 后天到期", "purple,b,purple_background,c"), /* 截止日是后天,但无时间 */
style("⏳ 剩余" + remainingDays + "天", "purple,b,purple_background,c") /* 超过后天 */
)
)
)
)
)
)
)
)
)設置完成後,公式會根據任務的狀態、排期和完成日期自動顯示不同的提示。
如有更多疑問,請郵件溝通 eryidebiji@gmail.com
20250819 更新
這個任務提示函數現在已經整合在了 Notion 大型全能模板「FLO.W 思流」中,歡迎了解詳情。
📘 FLO.W 思流 — Notion 個人管理系統
FLO.W 是一套基於 Notion 搭建的個人管理模板,整合了任務、筆記、項目、習慣等模組,並配有完整的圖文影片教程。
開箱即用的 Notion 模板系統
配套圖文影片教程,新手友好
持續更新,長期維護
了解 FLO.W 思流模板✨ 已有 1237+ 位用戶選擇 FLO.W

