💡小提醒:每個人編寫公式時都有不同的思路與習慣,根據自己的風格來編寫即可,只要能達到預期結果,並沒有絕對的標準答案。
在之前的文章中,我們複習了日期相關的函數,並使用新的函數編輯公式,還做了點練習。這次,我們不僅會解答之前的練習題,還會提供更多範例,讓大家可以將它們應用到自己的模板中。
參與練習的朋友可能會發現,編寫「周」、「日」的倒數進度公式相對簡單,但遇到「年」和「月」時,難度開始上升。稍微想下,「年」的倒數進度,可以使用 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"
不知道大家還記不記得 2023 年 09 月分享過的文章〈Notion 模板_問題日記〉~
當時製作這個模板時,是想到 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
即可。
倒數日子的計算方式,簡單理解就是兩個日期相減,計算天數差值即可。
// 計算天數
dateBetween(prop("日期時間"), now(), "days")
// 使用let()自定義函數名稱 - 倒數天數
let(
倒數天數, dateBetween(prop("日期時間"), now(), "days"),
"倒數 " + 倒數天數 + " 天"
)
// 已經成為過去的日子,就不要顯示倒數了~
let(
倒數天數, dateBetween(prop("日期時間"), now(), "days"),
if(
倒數天數 < 0, "", "倒數 " + 倒數天數 + " 天"
)
)
結合「xxxx年同月同日」與「倒數日子」的範例,我們來做個簡單的應用吧!
有些朋友會利用 Notion 來設置「個人 CRM」系統,定期提醒自己聯繫親朋好友的時間。而對於每個人來說,最特別的日子莫過於「生日」了!因此,讓我們以此作為範例,透過 Notion 來輕鬆管理與提醒親友的重要日子。
lets(
歲數, dateBetween(now(), prop("生日"), "years"),
下次生日, dateAdd(prop("生日"), 歲數 + 1, "years"),
if(month(now()) == month(prop("生日")) and date(now()) == date(prop("生日")),
"🎉生日快樂🎉",
"倒數 " + format(dateBetween(下次生日, now(), "days") + 1) + " 天"
)
)
我們日常生活中有許多例行公事,但往往覺得不需要全部記錄在行事曆中,否則日曆會變得密密麻麻,削弱了對特殊事件或單一提醒的效果。因此,我想建立一個例行公事提醒表可能是個不錯的解決方案。
這種表格尤其適合用來做課表,特別是對於課程較為鬆散的大學生和研究生來說,課表在短期內(四到五個月)會不斷重複,這種循環性安排非常適合例行表的設計。
我們的目標也很簡單,做一些簡單的標籤,分別有星期幾、特殊日子,然後當天若符合標籤,則要顯示在表中。
這個練習題也會在下篇文章中,提供我個人的解答,也歡迎大家可以嘗試練習。