我喜歡的大神 Red Gregory(以下稱紅姊)發表過一篇文章〈4 Advanced Date Formulas In Notion To Copy〉,那時 Notion 的公式還是 1.0 版本,現在我們來練習將有需要的公式轉換成 2.0 格式。
我自己經常使用其中的幾個公式,所以將練習過程和結果記錄下來,方便日後查找和參考。
我自己常用的日記模板中,是使用「日期」作為 Name 欄位的資料,輸入格式為「西元年份 + 月份 + 日期」。平時,我會先在 Excel 等工具中大批量生成這種數字字串,然後將格式如 2024.10.01 的日期拉出 31 行,並複製到 Notion 中。透過紅姊的公式,就可以匹配 Name 欄位的日期(字串型態),轉變成對應的日期。
以下是紅姊原本的公式(月-日-年):
dateAdd(dateAdd(dateAdd(dateSubtract(dateSubtract(dateSubtract(dateSubtract(dateSubtract(now(), year(now()), "years"), month(now()), "months"), date(now()) - 1, "days"), hour(now()), "hours"), minute(now()), "minutes"), toNumber(slice(prop("Name"), 6, 10)), "years"), toNumber(slice(prop("Name"), 0, 2)) - 1, "months"), toNumber(slice(prop("Name"), 3, 5)) - 1, "days")
依照紅姊的公式邏輯,以前我改過的公式如下(年-月-日):
dateAdd(dateAdd(dateAdd(fromTimestamp(0), toNumber(substring(replaceAll(replaceAll(replaceAll(prop("Name"), "/", ""), "-", ""), " ", ""), 0, 4)) - 1970, "years"),
toNumber(substring(replaceAll(replaceAll(replaceAll(prop("Name"), "/", ""), "-", ""), " ", ""), 5, 7)) - 1, "months"), toNumber(substring(replaceAll(replaceAll(replaceAll(prop("Name"), "/", ""), "-", ""), " ", ""), 8, 10)) - 1, "days")
由於紅姊的方式考慮到大多數人習慣使用「/」、「-」、「.」來分隔年、月、日,單純用幾個replace()
就可以滿足大部分需求。不過,既然我已經規範了日期格式為「年-月-日」,而且想多練習一些技巧,那麼我們可以引入正則表達式(regex)的概念。
在這裡使用 regex 其實相當簡單,只需要保留數字部分即可,用「\D
」來去除所有非數字的字符,效果如下圖。
lets(
日期字串, replaceAll(prop("Name"), "\\D", ""), /* 將欄位的日期字串保留數字部分*/
年份, toNumber(substring(日期字串, 0, 4)),
月份, toNumber(substring(日期字串, 4, 6)),
日期, toNumber(substring(日期字串, 6, 8)),
fromTimestamp(0)
.dateAdd(年份 - 1970, "years")
.dateAdd(月份 - 1, "months")
.dateAdd(日期 - 1, "days")
)
※注意:在輸入日期格式時,月份跟日期都要補足兩位數,例如三月就要輸入03。
這題比較難的是,我們需要將指定欄位的字串資料,轉變成數字,再轉變成日期。
這是之前有同好提出過的問題,其實這題不難,只是需要一些步驟。
最直接的方法是使用dateBetween()
函數計算開始和結束時間之間的差值,並以分鐘作為單位,接著再將分鐘轉換為其他時間單位。
通過這些基本換算,我們就能輕鬆完成時間區間的換算。
lets(
結束時間,prop("日期區間").dateEnd(),
開始時間, prop("日期區間").dateStart(),
分鐘差, dateBetween(結束時間, 開始時間, "minutes"),
天, floor(分鐘差 / 1440),
時, floor((分鐘差 - 天 * 1440) / 60),
分, floor((分鐘差 - 天 * 1440 - 時 * 60)),
天 + " 天 " + 時 + " 小時 " + 分 + " 分鐘"
)
最後一個練習也是之前很多同好有碰到的需求。
在專案或任務管理中,某些項目會顯示為一段時間的範圍,而待辦清單需要篩選「當天」且「尚未完成的項目」的條件。
當只有一個日期時,我們可以簡單地使用 today()
來判斷是否為當天,但若涉及時間區間,就需要比較開始時間與結束時間,才能準確篩選出符合條件的項目。
lets(
結束時間,prop("日期區間").dateEnd(),
開始時間, prop("日期區間").dateStart(),
if(today() >= 開始時間 and today() <= 結束時間, true, false)
)
目前日期相關的公式,我就先更新到這裡 🎉,我還有找到很多有趣的運用,會再慢慢地分享的。
這個系列真的是比較花時間與心力,如果你覺得挺有幫助的,請幫我點讚、分想、留言,或是請我喝杯咖啡☕、奶茶🧋~萬分感謝 ❤️。