在 MS Excel 中,找重複值相對簡單,微軟提供了大量函數庫,還能使用 Python 或 VBA 提高編寫彈性。但如果我們想在 Notion 的資料庫中實現類似的功能,該怎麼做呢?
本次練習是根據 Ben Smith、Notion Workflow 的教學進行延伸,除了會嘗試找出重複姓名的方法,還會嘗試找出相同日期的資料。
這個範例是影片中的範例,基本的邏輯是:
Name
值匯總到資料庫 DB2 中形成列表。Name
與 DB2 中的列表進行匹配,找到相同值時以 ★
表示。★
的數量大於 1,表示該值重複。/* DB1 判斷重複 */
lets(
/* 顯示列表中的所有元素:A,B,C,D,E,A,B */
姓名_全部, map(prop("DB2"),current.prop("DB1")).replaceAll(" ",""),
/* 顯示:Name欄位的資料 */
姓名_無符號, prop("Name").replaceAll("[ |,]", ""),
/* 將列表中重複值替換成 ★ 號,顯示A,★,C,D,E,A,★, */
替換重複值, 姓名_全部.replaceAll("\b" + 姓名_無符號 + "\b", "★"),
重複次數, 替換重複值.replaceAll( "[^★]", "").length(),
if(prop("Name"), 重複次數 > 1, false)
)
/* DB2 欄位:重複項目*/
map(prop("DB1").filter(current.prop("重複_Name") == true), current.prop("Name")).unique()
過程中要注意,輸入名字時可能不小心多輸入空白或符號,因此使用正則表達式 \b
來匹配單詞邊界,以提高精確度:
\b
用來指定匹配字串位於單詞的邊界,如空白、標點、或字串開頭結尾。"apple banana"
,使用 \bapple\b
可確保僅匹配獨立的 "apple"
,不會錯誤匹配 "applepie"
。這是之前我在的某個群組中,某群友的需求,需要找重複的日期資料,麻煩的地方在於日期不是字串,所以無法直接替代符號。(不知道為什麼,我在這裡卡了一陣子🤣)
後來我想到的解法,是把這串日期變成字串,使用formatDate()
就行了,還可以去掉中間的/
或是-
,這樣就能解決問題了🎉。
另外,因為我在前面已經使用formatDate()
定義呈現的樣子,且它指定匹配的資料本來就是日期,不會有奇怪的符號,就不需要使用\b
。
之前我在的某個群組中,有群友提出了一個找重複日期的需求。我就想到了這個練習,想著不然把它變成一篇筆記🤣。過程中,日期格式無法直接像字串一樣比對符號,曾讓我卡了一段時間🤣。
雖然讓我卡了一段時間🤣,但後來有想到解決方法,使用 formatDate()
將日期轉為字串,並且這樣能同時去掉中間的 /
或 -
符號,使其統一格式後便能精確匹配。
此外,因為已使用 formatDate()
定義日期格式,並且匹配的資料也只與日期有關,不會出現額外符號,因此不需再用到 \b
。
/* DB1 判斷重複 */
lets(
/* 顯示列表中的所有元素 */
日期_全部, map(prop("DB2"), current.prop("日期")),
/* 顯示:日期欄位的資料 */
日期, prop("日期").formatDate("YYYYMMDD"),
/* 將列表中重複值替換成 ★ 號 */
替換重複值, 日期_全部.replaceAll(日期, "★"),
重複次數, 替換重複值.replaceAll( "[^★]", "").length(),
if(prop("Name"), 重複次數 > 1, false)
)
/* DB2 欄位:日期*/
map(prop("DB1"), current.prop("日期").formatDate("YYYYMMDD"))
/* DB2 欄位:重複項目*/
map(prop("DB1").filter(current.prop("重複_日期") == true), current.prop("Name")).unique()
※若你有習慣看我提供的參考資料,會發現 Ben Smith 的資料頁面中,說明他的公式不是似乎有點問題,所以我根據自己的理解有改了一下~目前測試都是可以正常使用的喔~