這篇介紹了我常用的 Formula 指令,如果想要學 Formula 但不知道怎麼開始,可以看著跟著文章步驟摸一輪,相信大家做完後就能成為 Notion 大神!這次用了 Formula 神器「if」「contains」;帶到一些「date」系列的基本運算;「or」「and」的使用時機等實用指令。
子彈飛了一個月,
終於有人向我提問啦!!
這次被問了「怎麼弄出這些公式?」所以這一篇會針對以下這個模板的「待辦清單」部分的公式做說明,如果想要找特定公式的用法的話,可以善用左方的「章節目錄」做選擇。
如果還沒有看過模板想要領取的話,請左轉到這篇初學者也能輕鬆打造待辦清單。
在寫 Notion 的 Formula (你可以稱之為算式、函式、公式)的時候,跟 Execel 或是 Google sheet 很像,可以讓函式依照某些條件來判斷該如何顯示。只要你掌握到 Notion 的 Formula 可以設定哪些條件之後,要讓他用什麼樣的方法去顯示就是大家可以發揮想像力的地方了。
而當你點開 Notion 的 Formula 你可以看見所有 Properties 以及函式前面都會有以上四種符號,代表他們在函式中有不同的身分,我對他們的認識為(從左至右)文字、數值、條件、日期。先對這四個符號有基本概念,在接下來的教學中比較不會卡關!
因為之前寫的 Formula 有點複雜,所以這幾天又將他做了優化,讓它看起來更清爽一點。其實是亂到不知道怎麼寫教學文,所以優化了一輪,但理論上一樣啦!
這個頁面總共用到了 9 個 Formula,我先用顏色來將有關聯性的 Property (屬性)標出來。下圖的編號是我在建照模板時的建照順序,我也會依照這順序做介紹。
任務顯示
每個卡片有一堆屬性以及不同的狀態,想要讓大家簡潔地全部顯示成「一行」的話,這真的必學~靈感來源為我很崇拜的日本 Notioner
Yuji Tsuburaya 的這一則
推文,簡約就是王道啊!
❶(contains)包含特定項目時打勾
contains(prop("分類"), "活動")
翻譯蒟蒻
- 條件:屬性分類包含「活動」這個字的話打勾,否則不打勾
❷(or)符合任一條件時打勾
or(contains(prop("分類"), "活動"), contains(prop("分類"), "會議"))
翻譯蒟蒻
- 條件1:符合以下其中一個條件的話打勾,否則不打勾
- 條件2:屬性「分類」裡頭包含『活動』這個字的話打勾,否則不打勾
- 條件3:屬性「分類」裡頭包含『會議』這個字的話打勾,否則不打勾
❸(if)依照條件判斷顯示前者或後者設定
▸ ① 如果是會議或是活動
if(or(contains(prop("分類"), "活動"), contains(prop("分類"), "會議")), "▶︎ " + prop("詳細"), "")
翻譯蒟蒻
- 條件1:符合條件2的話顯示A,否則顯示B
- 顯示A:"▶︎ " 加上屬性「詳細」的內文
- 顯示B:無
- 條件2:符合以下其中一個條件的話打勾,否則不打勾
- 條件3:屬性「分類」裡頭包含『活動』這個字的話打勾,否則不打勾
- 條件4:屬性「分類」裡頭包含『會議』這個字的話打勾,否則不打勾
▸ ② 如果是待辦清單
▸▹ ⒈ 待辦與完成
if(prop("完成"), "✓ done ", "▶︎ to do ")
翻譯蒟蒻
- 條件:如果屬性「完成」被打勾的話顯示A,否則顯示B
- 顯示A:『✓ done』
- 顯示B:『▶︎ to do』
▸▹ ⒉ 待辦與完成、未完成
if(prop("完成"), "✓ done ", if(prop("未完成"), "✘ undone", "▶︎ to do "))
翻譯蒟蒻
- 條件1:如果屬性「完成」被打勾的話顯示A,否則看條件2
- 顯示A:『✓ done』
- 條件2:如果屬性「未完成」被打勾的話顯示B,否則顯示C
- 顯示B:『✘ undone』
- 顯示C:『▶︎ to do』
❹ 合併以上條件並加上待辦事項詳細說明
if(or(contains(prop("分類"), "活動"), contains(prop("分類"), "會議")), "▶︎ ", if(prop("完成"), "✓ done ", if(prop("未完成"), "✘ undone ", "▶︎ to do "))) + prop("詳細")顯示執行日
翻譯蒟蒻
- 條件1:如果屬性「分類」包含『活動』或『會議』的話顯示A,否則看條件2
- 顯示A:▶︎
- 條件2:如果屬性「完成」被打勾的話顯示B,否則看條件3
- 顯示B:『✓ done』
- 條件3:如果屬性「未完成」被打勾的話顯示C,否則顯示D
- 顯示C:『✘ undone』
- 顯示D:『▶︎ to do』
- 無視以上條件,一律加上屬性「詳細」的內文
顯示執行日
❶ (timestamp)13 位時間戳
只要在 timestamp 後面加上任何上「日期或時間」,它就會將這轉為13 位時間戳。
時間戳顯示的「now」在算式中他會顯示國際標準時間,所以為了要校準時差所以需要加上八小時。
- 1000:毫秒 → 秒
- 60:秒 → 分
- 60:分 → 小時
- 8:八小時
❷ (mod)無法被整除的餘數
為了要屬性「今日時間」顯示為每一天的午夜 12:00am,所以要先算出當下這個時間戳無法被「天」這個單位整除的數字為多少。
先從簡單的開始
- 21 ÷ 3 = 7 ⋯ 「0」
- 14 ÷ 3 = 4 ⋯ 「2」
代入時間戳後
- 台灣的標準時間 ÷ 24 小時 = 今天的 12:00am ⋯ 「多出的時間」
▸ 算出當下這個時間的 12:00am 的時間戳
mod(timestamp(now()) + 8 * 60 * 60 * 1000, 24 * 60 * 60 * 1000)
- 現在這個時間 - 剛剛算出來多出的時間 = 台灣時間今天的 12:00am
❸(fromTimestamp)把 13 位時間戳顯示成時間
fromTimestamp(timestamp(now()) - mod(timestamp(now()) + 8 * 60 * 60 * 1000, 24 * 60 * 60 * 1000))
❹(start & end)開始與結束的時間
當你的時間設定有「起始日」跟「結束日」時,就可以用這個指令讓他只顯示其中一個。
▸ ① 顯示起始時間
▸ ② 顯示結束時間
❺(dateBetween)計算兩個時間的差距
不只可以指定顯示「天數」也可以選擇其他時間單位
▸ ① 計算起始時間到今天
dateBetween(start(prop("date")), prop("今日時間"), "days")
▸ ② 計算結束時間到今天
dateBetween(end(prop("date")), prop("今日時間"), "days")
❻(and)符合兩者條件時打勾
prop("起始到今天") <= 0 and prop("結束到今天") >= 0
翻譯蒟蒻
- 如果起始到今天大於 0 的話代表這項任務還未開始
- 如果起始到今天小於等於 0 的話代表這項任務需要開始執行
- 如果結束到今天大於等於 0 的話代表這項任務需要繼續執行
- 如果結束到今天小於 0 的話代表這項任務已經結束
- 條件1:同時符合以下兩個條件的話打勾,否則不打勾
- 條件2:起始到今天小於等於 0 的話打勾,否則不打勾
- 條件3:結束到今天大於等於 0 的話打勾,否則不打勾
有「執行日」這個 checker 的話,就可以看這個活動現在是不是在「進行中」,就可以用 Filter 把目前正在進行中的任務設定為顯示,將那些尚未發生或是已結束的活動隱藏起來,一個超讚的功能。
因為會需要用到四個 Formula,所以看起來可能會有點複雜,但相信大家看完之後對於 Notio Formula 的日期可以怎麼活用能有一定程度的了解!
倒數顯示
❶(format)告訴算式這是文字
若你想要讓他顯示「倒數 ◯ 天」然後在「結束到今天」這個屬性前後加上「倒數」及「天」這兩段文字時,他會在下方顯示「prop("結束到今天") is not a text」的錯誤訊息。
因為對於 Formula 來說數值只能跟數值做計算,文字只能跟文字做串連,而對於 Formula 來說「結束到今天」這個屬性是數值而非文字,所以無法跟文字做串連。為了要讓 Formula 認為這串東西是「文字」,所以要在前面加上一個「format」的指令,他就會將這個屬性轉為一串文字,接著就能做文字接龍了!
❷(if)在不同條件下顯示不同狀態
為了不讓這一欄顯示「倒數 -5 天」這種會讓如腦袋卡住的敘述,所以用 if 讓他只有在需要被倒數時顯示,上面的 if 做了那麼穩紮穩打的基礎功,這邊就直接來飆車!
if(prop("結束到今天") < 0, "", if(prop("結束到今天") == 0, "today", "倒數 " + format(prop("結束到今天")) + " 天"))
翻譯蒟蒻
- 條件1:如果屬性「結束到今天」小於 0 的話顯示A,否則看條件2
- 顯示A:無
- 條件2:如果屬性「結束到今天」等於 0 的話顯示B,否則顯示C
- 顯示B:『today』
- 顯示C:『倒數』加上屬性「結束到今天」加上『天』
顯示工時
有些時候你可能會需要計算每個工作項實際花了多少時間,這個時候你就可以這樣做計算。這裡使用到的指令在面都有用到過了,所以直接進入重點!
❶(dateBetween)計算兩個時間的差距
dateBetween(end(prop("date")), start(prop("date")), "minutes")
❷(round)四捨五入
如果你直接將算出來的分鐘除以 60 你會得到一個沒有很直覺的數字
為了避免這種事情發生,這時候就要用到我們的四捨五入。
但這麼暴力的四捨五入會讓數字有點失真,大部分的人都還是會用 0.5 甚至是 0.25 作為最小單位,這時只要將數字帶進算式就可以囉!
round(prop("總工時(分鐘)") / 60 / 0.5) * 0.5
👇 考量到篇幅,想看更詳細的四捨五入教學的話可以看這篇 👇
回家作業:顯示起始日
if(empty(prop("date")), "未定", if(formatDate(now(), "MMM DD, YYYY") == formatDate(start(prop("date")), "MMM DD, YYYY"), formatDate(start(prop("date")), "▶︎ " + "HH:mm"), if(dateBetween(start(prop("date")), now(), "days") > -1 and dateBetween(start(prop("date")), now(), "days") < 7, "🗓 " + formatDate(start(prop("date")), "ddd" + " " + if(formatDate(start(prop("date")), "HH:mm") == "00:00", "", formatDate(start(prop("date")), "HH:mm"))), if(dateBetween(start(prop("date")), now(), "days") < 1, "", if(formatDate(start(prop("date")), "HH:mm") == "00:00", formatDate(start(prop("date")), "MM.DD ddd"), formatDate(start(prop("date")), "MM.DD ddd HH:mm"))))))
為了避免大家消化不良(其實是不想這篇文章繼續難產下去),這個 Formula 就當作大家的回家作業!
裡頭除了「formatDate」今天沒有講到以外其他指令都有在今天提到。大家可以像我一樣用螢光筆把「條件」跟「顯示」用不同顏色標示出來後,就可以很清楚的看見邏輯。
希望各位可以動動手指點擊左下方的手掌五下,讓我獲得一些 LikeCoin,或是你也可以點選右邊的贊助鈕直接給我錢錢,讓我有動力繼續在假日寫教學文。為了獎勵你看到這邊,我把 level up 的模板放在下面,有興趣的可以拿去玩玩。
我們今天的課就上到這邊
期待大家的提問
下課!
其實一直不知道需不需要更新這個專題,因為之前寫的模板建造教學被反應太長、單個算式教學又被認為不知道怎麼實際運用。寫得辛苦辛苦的教學文,如果沒有讓各位「搞懂」的話,身為投射者的我就會懶得更新很難感受到成就感。
我回到投射者的策略「等待被邀請」,當然,我知道我在這乾等沒用,於是乎,我到處分享模板,等待有人向我提問,等了一個月才等到了第一個,但等待的過程真的好苦澀啊〜😱
寫的過程因為截圖很多途中會寫到有點懷疑人生,腦袋中也有各種質疑的聲音出現,糾結是否真的要寫那麼細。希望能用我當初用著破破爛爛的英文程度,花大量時間到處爬文看影片學習研究的成果,希望可以幫助大家免除一些卡關的痛苦。
peace