更新於 2024/11/24閱讀時間約 8 分鐘

Notion Formula 2.0 § 迷你月曆

前言

寫到這篇時,有點小疲累🤣,但我還是會盡力將公式逐步拆解,並用中文註解,讓理解過程更直觀。

在開始拆解公式之前,想先分享一下我在學習公式編寫時的心路歷程,還有如何加入個人需求來增強實用性。接著會帶大家一起編寫這個「迷你月曆」,不過只會說明關鍵步驟,若想獲得完整的工具公式,可以參考這裡的〈Notion 模板 § 小工具_迷你月曆〉。

編寫公式前的準備

在動手編寫公式前,先要明確理解預期結果,進行基本的邏輯推演和需求分析。若無法直接從公式看出結果,可將公式拆分並逐段放入欄位中觀察輸出,尤其是數據型態的呈現。

過程中透過不斷的試錯來調整寫法,再根據個人需求重組步驟(預期結果 → 分析 → 分段拼湊),最終便能設計出符合需求的公式。

分析需求

這次我們將利用資料庫製作小月曆。在編寫公式之前,先分析一下迷你月曆的呈現方式:

  • 頂部顯示星期標題,需以粗體字呈現,且「Week」的「W」是以橘色顯示。
  • 第一欄顯示周數,一年有 52 至 53 周,第 53 周需以隔年的資料顯示為 01。
  • 如果月曆中出現「今天」的日期,該日期背景要呈現橘色,且對應周的數字也應為橘色。

手動設置迷你月曆

設置標題欄,並更改樣式

利用 style() 方法將周數欄的「W」設置成橙色粗體,並讓星期的縮寫也保持粗體顯示。

lets(
欄位, ["W".style("b", "orange"), "M".style("b"), "T".style("b"), "W".style("b"), "T".style("b"), "F".style("b"), "S".style("b"), "S".style("b")]
.........
)

計算月份和周數

取得當前月份 (月份) 和周數 (現在在哪周) 以及該月份的起始與結束周數(月初所在周月底所在周)。

  • 使用 dateStart()dateEnd() 確認每月的首尾並格式化周數。
  • 利用 now().formatDate("W") 取得今天所在周數。
lets(
.........
月份, prop("日期").dateStart().month(),
現在在哪周, now().formatDate("W").toNumber(),
月初所在周, dateStart(prop("日期")).formatDate("W").toNumber(),
月底所在周, dateEnd(prop("日期")).formatDate("W").toNumber()
.........
)

計算本周周一的日期

確定本周的第一天的日期(周一的日期),作為接下來週計算的基準。

lets(
.........
本周周一日期, prop("日期").dateStart().dateSubtract(prop("日期").dateStart().day() - 1, "days")
.........
)

計算「月份跨越的周數」與「月份在哪幾周」

計算當前月份跨越了幾周,並確定這些周數是哪幾周。

lets(
.........
月份跨幾周, if(月底所在周 == 1 and 月份 == 12, 53, 月底所在周)
- if(月初所在周 <= 53 and 月初所在周 > 51 and 月份 == 1, 0, 月初所在周) + 1,
月份在哪幾周, "x".repeat(月份跨幾周).split("").map(dateStart(prop("日期"))
.dateAdd(index * 7, "days").formatDate("W").toNumber())

.........
)

「每周」的日期顯示

  • 設置一周內的七天對應日期,並調整樣式。
  • 本周日期:每周一日期,加上 index * 7 計算得出每周的開始日。
  • 星期.map:針對一周中的每一天進行處理,設定樣式。
    • 日期.month() 不等於目標月份則顯示空白,否則顯示日期並加上 .style() 樣式。
    • 當天日期的背景為橘色。
    • 當天對應的所在周的周數顯示為橘色數字。
lets(
...........
, 月份在哪幾周.map(
[ /* 今天所在周,特別顏色顯示 */
(if(current < 10, "0", "") + current).style(ifs(current == 現在在哪周, "orange",current < 現在在哪周, "gray","")),

/* 一周中有哪幾天 */
lets(
本周日期, 本周周一日期.dateAdd(index * 7, "days"),
星期, [1,2,3,4,5,6,7],
星期.map(
let(日期, 本周日期.dateAdd(index, "days"),
if(
日期.month() != 月份, " ",
日期.formatDate("DD").style(ifs(日期 == today(), "orange_background", 日期 < today(), "gray","")
)
)
)
)
).flat()
]
),
............
)

組合欄位和周顯示

lets(
...........
欄位.join(" ")
+ "\n"
+.map(current.first() + " " + current.last().join(" ")).join("\n")
)

這種設置適合「月回顧」等應用場景,不僅能顯示當月目標與待辦事項,也能回顧上月底對本月的期待。

若你不需要月回顧或覺得手動設置麻煩,可以考慮購買 👉 「小工具_萬年曆」,自動顯示當月月曆,省去手動設置的步驟。只需將模板複製到 Notion 中,再放置到需要的位置即可。

迷你月曆的操作流程

  1. 需要在日期欄位中輸入月份區間,Name欄位可輸入也可空白。
  2. 切換到 Gallery View,預設顯示本月的月曆。
  3. 將月曆放置在您想要呈現的筆記頁面位置即可。

注意事項

記得選用「Mono」字體,這樣排版才會整齊。

範例頁面

迷你月曆

模板連結

參考資料

  • Discord 群組


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.