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 AI 神助攻:輕鬆搞定上千行資料分類難題
#Notion 技巧

Notion AI 神助攻:輕鬆搞定上千行資料分類難題

用 Notion AI 的自動填充功能,一鍵完成上千條食物資料的分類,無需編寫程式碼,操作簡單直觀,分類準確度高。

2025/01/09
Notion AI 簡評:有必要訂閱嗎,和 ChatGPT 的區別是什麼
#Notion 技巧

Notion AI 簡評:有必要訂閱嗎,和 ChatGPT 的區別是什麼

Notion AI 和 ChatGPT 到底該選哪個?本文從定位、用法、適用人群三個角度簡評 Notion AI 的真正價值,幫你判斷是否值得訂閱。

2023/05/12
免費分享 1000 張 Notion 資料庫專用封面
#Notion 技巧

免費分享 1000 張 Notion 資料庫專用封面

免費下載超過 1000 張 Notion 資料庫封面圖,涵蓋 10+ 種中文字體風格,適用於生活、學習、工作和娛樂分類場景。

2025/01/05

郵件列表

加入我們的社區

訂閱郵件列表,及時獲取最新消息和更新

LogoFLO.W 思流
TwitterX (Twitter)YouTubeYouTubeBilibiliXiaoHongShuEmail
產品
  • 功能
  • 價格
  • 常見問題
資源
  • 部落格
  • 文檔
  • Notion Custom Agent
公司
  • 關於我
  • 聯繫我們
法律
  • Cookie政策
  • 隱私政策
  • 服務條款

訂閱獲取更多 Notion 技巧與資訊

© 2026 FLO.W 思流, All rights reservedNotion 為 Notion Labs, Inc. 商標;本站為獨立第三方,與 Notion 官方無關聯或背書。
Featured on Uneed