2024-11-25|閱讀時間 ‧ 約 0 分鐘

Notion Formula 2.0 § 動態日程行程表

前言與應用場景

曾經看到同好提問:「Notion 能不能設計一個顯示當天待辦事項的行事曆?」當時我心想,使用資料庫篩選功能來顯示當天任務已經能滿足我的需求,但仔細琢磨後才明白,他們想要的是日曆應用程式中的視覺化效果——能清楚看到當天已排定事項的時段,和哪些時段是空白的樣式。

幾年後,公式 2.0 誕生,我找到了這個有趣的範例。此設計允許使用者設定一天的開始時間結束時間,生成以小時為單位的時間標籤,並自動匹配與這些時間標籤相對應的任務。同時,我們還可以設置,將一天分成三個大區塊(早晨、下午、晚上),使用不同的背景顏色區分各時段,呈現出色彩分明的日程視圖。

以下是該範例的主要功能與公式拆解,讓我們來一步步了解如何實現這樣的動態行事曆。

https://x.com/PurpleNotion/status/1713536449646108787

公式拆解

時間標籤

根據開始時間結束時間,生成每小時的時間標籤(如 06:00),並進一步將標籤格式化為固定長度,確保多位數字的時間能夠對齊顯示。

..............
/* 基本變量 */
開始時間, prop("Start Time").toNumber(),
結束時間, prop("End Time").toNumber(),
總時間, 結束時間 - 開始時間,

/* 生成時間標籤 */
時間標籤, "x".repeat(總時間).split("").map(index + 開始時間).concat([結束時間]),
標籤最大長度, 時間標籤.max().length(),
零零標籤, 時間標籤.map("0".repeat(標籤最大長度 - format(current).length()) + current),
完整標籤, 零零標籤.map(current + ":00"), /* 時間標籤加上分鐘:00 */
..............

接下來,依據一天的不同時段(早晨、下午、晚上),為時間標籤添加背景顏色,增強視覺效果。

..............
/* 計算各時間段的時長 */
早晨結束, 12, /* 早晨結束時間 */
下午結束, 18, /* 下午結束時間 */
morn_hours, max(min(早晨結束, 結束時間) - 開始時間, 0),
aft_hours, max(min(下午結束, 結束時間) - max(開始時間, 早晨結束), 0),
eve_hours, max(結束時間 - max(開始時間, 下午結束), 0),

/* 樣式化時間標籤 */
標籤樣式, 完整標籤.map(
ifs(/* 早晨藍色、下午橙色、晚上紫色 */
morn_hours >= 0
and index + 1 <= morn_hours, current.style("blue_background"),
aft_hours >= 0
and index + 1 >= morn_hours
and index + 1 <= morn_hours + aft_hours, current.style("orange_background"),
current.style("purple_background")
)
),
..............

關於時間標籤的部分,我提供了 GPT 建議的修改版本,大家可以根據需求選擇自己喜歡的寫法。

..............
/* 基本變量 */
開始時間, prop("Start Time").toNumber(),
結束時間, prop("End Time").toNumber(),
總時間, 結束時間 - 開始時間,

/* 時間段參數化 */
早晨開始, 6,
早晨結束, 12,
下午開始, 12,
下午結束, 18,
晚上開始, 18,
晚上結束, 24,

/* 計算各時間段的時長 */
morn_hours, max(min(早晨結束, 結束時間) - max(開始時間, 早晨開始), 0),
aft_hours, max(min(下午結束, 結束時間) - max(開始時間, 下午開始), 0),
eve_hours, max(min(晚上結束, 結束時間) - max(開始時間, 晚上開始), 0),

/* 生成時間標籤 */
時間標籤, "x".repeat(總時間).split("").map(index + 開始時間).concat([結束時間]),
標籤最大長度, 時間標籤.max().length(),
零零標籤, 時間標籤.map("0".repeat(標籤最大長度 - format(current).length()) + current),
完整標籤, 零零標籤.map(current + ":00"), /* 時間標籤加上分鐘 */
..............

對應時間的任務

利用時間標籤篩選任務資料庫中的對應項目,並將任務名稱動態附加到時間標籤後方。

這部分與原本的公式有一點點不同,這個改版也是能正常運作的。

..............
/* 分配任務至指定的時間標籤 */
scheduled_labels, 標籤樣式.map(
lets(
n, current,
n + " " + prop("Scheduler").filter(
lets(
start, current.prop("Date & Time").dateStart().formatDate("HH").toNumber().toNumber(),
end, if(
/* 如果結束時間不在整點,則四捨五入 */
current.prop("Date & Time").dateEnd().formatDate("mm").toNumber() > 0,
current.prop("Date & Time").dateEnd().formatDate("HH").toNumber() + 1,
current.prop("Date & Time").dateEnd().formatDate("HH")
).toNumber(),
n.toNumber() >= start and n.toNumber() < end
)
)
)
),
/* 輸出結果 */
scheduled_labels.join("\\n")
..............

完成後,將公式欄位添加到 Gallery View 並啟用欄位摺疊功能,即可直觀顯示當日行事曆內容。

範例頁面

當日行事曆

小小心得

雖然這個公式十分有趣,但對我來說,它並不適合我的筆記。相較於這種圖形化行事曆,我更偏好使用 Notion 原生的篩選器與排序功能,直接瀏覽當天的任務清單。如果需要檢視任務時段與空白時間,我會考慮使用 Timeline View,將時間單位設為 Day,這樣也能一目了然。或是也可以進一步使用 Notion Calendar,它的面板就像是 Google 日曆一樣。

無論是動態行事曆還是時間軸檢視,選擇適合自己需求的方式才是關鍵。希望這篇分享能啟發你,讓日程管理更加靈活!

參考資料



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