LogoFLO.W 思流
  • 价格
  • 博客
  • 文档
  • 思考
  • 关于我
立即购买
  • 简介
  • 设置方法
  • 参考模板
  • 公式代码
  • 20250819 更新
Notion 技巧·
2025/05/03

Notion 任务状态提示终极版

Notion 任务状态公式,自动判断排期与完成情况,以不同颜色图标显示按时完成、提前完成、逾期、剩余时间等状态提示。

avatar for 二一
二一
Notion 任务状态提示终极版

这个问题来自 Notion 系统课程读者的提问,经整理后分享于此。如果你在使用 Notion 的过程中遇到了类似问题,欢迎留言交流。

简介

这个 Notion 函数可以帮助你自动判断任务的状态、截止日期和完成情况,并以不同颜色和图标直观显示。它能够显示任务是否按时完成、提前完成、逾期完成,或者对于未完成的任务,显示剩余时间或已逾期时间。

任务状态提示效果展示

任务状态提示效果展示 2

设置方法

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
2025/05/03
分享本文
全部文章

更多文章

Notion 10 年发展史与 2023 功能现状全面回顾
#Notion 技巧

Notion 10 年发展史与 2023 功能现状全面回顾

回顾 Notion 从创立到估值百亿美金的十年历程,涵盖产品哲学、数据库革命、社区增长飞轮与 AI 未来展望。

2023/06/20
Notion 博客公开页索引 — 二一的 Notion 公开资源合集
#Notion 技巧

Notion 博客公开页索引 — 二一的 Notion 公开资源合集

汇总二一的 Notion 公开页面资源索引,包括 Notion 汉化、笔记收集、模板、课程与 Formula 教程合集,方便快速查找。

2024/02/28
Notion AI 神助攻:轻松搞定上千行数据分类难题
#Notion 技巧

Notion AI 神助攻:轻松搞定上千行数据分类难题

用 Notion AI 的自动填充功能,一键完成上千条食物数据的分类,无需编写代码,操作简单直观,分类准确度高。

2025/01/09

邮件列表

加入我们的社区

订阅邮件列表,及时获取最新消息和更新

LogoFLO.W 思流
TwitterX (Twitter)YouTubeYouTubeBilibiliXiaoHongShuEmail
产品
  • 功能
  • 价格
  • 常见问题
资源
  • 博客
  • 文档
  • Notion Custom Agent
公司
  • 关于我
  • 联系我们
法律
  • Cookie政策
  • 隐私政策
  • 服务条款

订阅获取更多 Notion 技巧与资讯

© 2026 FLO.W 思流, All rights reservedNotion 为 Notion Labs, Inc. 商标;本站为独立第三方,与 Notion 官方无关联或背书。
Featured on Uneed