前言

💡小提醒:每個人編寫公式時都有不同的思路與習慣,根據自己的風格來編寫即可,只要能達到預期結果,並沒有絕對的標準答案。

在上篇文章中,我們複習了日期相關的函數,並使用新的函數編輯公式,還做了點練習。這次,我們不僅會解答上篇的練習題,還會提供更多範例,讓大家可以將它們應用到自己的模板中。

練習題_自動倒數進度條

參與練習的朋友可能會發現,編寫「周」、「日」的倒數進度公式相對簡單,但遇到「年」和「月」時,難度開始上升。稍微想下,「年」的倒數進度,可以使用 month() 來解決,繞過部分困難。可是,針對「月」的倒數進度,無法直接使用既有的函數編寫,那要怎麼做呢? 破解「月」的倒數進度的重點在於如何找到「本月的最後一天」。這一部分稍微複雜,需要繞道的方式來編寫公式。

如果你希望在「年」的倒數進度中使用「天date()」進行計算,可以參考「月」的倒數進度的處理方式,雖然稍微繁瑣,但數字方面能提高精確度😁。

/* 年進度條 */
lets(
    進度_年, floor((month(now()) / 12) *100) / 100,
    進度條_完成_年, substring("◼◼◼◼◼◼◼◼◼◼", 0, floor(進度_年 * 10)),
    進度條_未完_年, substring("◻◻◻◻◻◻◻◻◻◻", 0, 10 - floor(進度_年 * 10)),
    進度條_完成_年 + 進度條_未完_年 + " Year"
)

/* 月進度條 */
lets(
    本月第幾天, date(now()),
    本月第一天, dateSubtract(now(), 本月第幾天 - 1, "days"),
    下月第一天, dateAdd(本月第一天, 1, "months"),
    本月最後一天, date(dateSubtract(下月第一天, 1, "days")),
    進度_月, floor((本月第幾天 / 本月最後一天) * 100) /100,
    進度條_完成_月, substring("◼◼◼◼◼◼◼◼◼◼", 0, floor(進度_月 * 10)),
    進度條_未完_月, substring("◻◻◻◻◻◻◻◻◻◻", 0, 10 - floor(進度_月 * 10)),
    進度條_完成_月 + 進度條_未完_月 + " Month"
)
    
/* 周進度條(周一 → 週日) */
lets(
    本周第幾天, day(now()),
    進度_周, floor((本周第幾天 / 7) * 100) /100,
    進度條_完成_周, substring("◼◼◼◼◼◼◼◼◼◼", 0, floor(進度_周 * 10)),
    進度條_未完_周, substring("◻◻◻◻◻◻◻◻◻◻", 0, 10 - floor(進度_周 * 10)),
    進度條_完成_周 + 進度條_未完_周 + " Week"
)
    
/* 日進度條 */
lets(
    今天小時, hour(now()),
    進度_天, floor((今天小時 / 24) * 100) /100,
    進度條_完成_天, substring("◼◼◼◼◼◼◼◼◼◼", 0, floor(進度_天 * 10)),
    進度條_未完_天, substring("◻◻◻◻◻◻◻◻◻◻", 0, 10 - floor(進度_天 * 10)),
    進度條_完成_天 + 進度條_未完_天 + " Day"
)

xxxx年同月同日

不知道大家還記不記得 2023 年 09 月分享過的文章〈問題日記 Question Diary〉~

當時製作這個模板時,是想到 Facebook 等社群媒體的「回顧功能」,會推播「幾年前的今天發布了什麼」。那麼,如果我們想在 Notion 中實現類似的功能,該如何寫公式呢?

當時,我設置回顧一年前和三年前對應日期的內容,這部分相對簡單,可以使用dateBetween()dateAdd()的函數編寫公式即可,只要碰到現在時間與指定時間相同時,就顯示True,再使用篩選器篩出True的項目即可。

/* 回顧去年的今天 */
if(
    dateBetween(now(), dateAdd(prop("日期時間"), 1, "years"), "days") == 0, 
    true, 
    false
)

/* 回顧三年前的今天 */
if(
    dateBetween(now(), dateAdd(prop("日期時間"), 3, "years"), "days") == 0, 
    true, 
    false
)

如果我能持續在 Notion 上記錄生活,即便寫了二十年,那個頁面最多也只會有二十筆資料,好像也沒有想像中的多😆,而且可以按時間順序排列,看到不同年份的自己。

在公式 1.0 時代,我會使用formatDate()來格式化日期進行比較。

/* 去除年分,判斷月份和日期是否與今天日期相同。*/
formatDate(prop("日期時間"), "MMDD") == formatDate(now(), "MMDD")

/* 排除今年的今天 */
not(formatDate(prop("日期時間"), "YYYYMMDD") == formatDate(now(), "YYYYMMDD"))

/* 兩個部分的公式寫在一起,可以使用 and 相連 */
formatDate(prop("日期時間"), "MMDD") == formatDate(now(), "MMDD")
and not(formatDate(prop("日期時間"), "YYYYMMDD") == formatDate(now(), "YYYYMMDD"))

現在有了新的函數及編寫方式,在編寫時可以更為簡潔易讀~

if(
	year(now()) > year(prop("日期時間"))              /* 這裡可以寫 !=,也可以寫 > */
	and month(now()) == month(prop("日期時間"))
	and date(now()) == date(prop("日期時間")), true,false
)

判斷式完成後,只要開啟Filter判別指定欄位是否為True即可。

image.png

倒數日子