Notion Formula 2.0 函数与正则表达式速查手册(含高频实战公式库) #
Notion Formula 2.0 是一次颠覆性的公式引擎重构。相较于旧版 Formula 1.0 繁复且嵌套极深的语法体系,2.0 版本全面引入了现代编程语言范式:链式点语法(Dot Notation)、局部临时变量(let / lets)、富列表数组遍历(.map() / .filter()) 以及对富文本、多人员与关联属性的深度解构能力。
本手册系统梳理 Formula 2.0 核心语法特性、高频内置函数索引、正则表达式常用模式,并提供开箱即用的高阶实战公式库。
1. Formula 2.0 核心语法革新 #
1.1 链式调用(Dot Notation) #
在 2.0 中,你可以像写 JavaScript 或 Swift 一样对属性或中间结果进行链式处理,大幅减少括号嵌套:
/* 旧版 1.0: 难以阅读的层层包裹 */
prop("Tags")
/* 新版 2.0: 流畅的链式调用 */
prop("Tasks").filter(current.prop("Done")).length()
1.2 局部临时变量声明:let() 与 lets() #
在复杂分析或评分公式中,无需重复计算相同的子表达式,使用局部变量可大幅提升计算性能与可读性:
/* 语法结构: lets(变量名1, 表达式1, 变量名2, 表达式2, ..., 最终返回计算) */
lets(
completed, prop("Tasks").filter(current.prop("Status") == "Done").length(),
total, prop("Tasks").length(),
ratio, if(total > 0, completed / total, 0),
round(ratio * 100) + "%"
)
1.3 强类型与隐式转换规则 #
- Text(文本):使用双引号
""包裹,支持使用+进行字符串拼接。 - Number(数值):原生双精度浮点数,支持常规算术运算符
+,-,*,/,%。 - Boolean(布尔):
true或false,支持and,or,not或逻辑符号&&,||,!。 - Date(日期):封装的时间对象,包含开始时间、可选结束时间以及时区信息。
- List(列表/数组):多选标签、人员列表、Relation 关联的多项集合,支持高阶函数式操作。
2. 逻辑与控制流函数速查 #
| 函数名 | 语法定义与签名 | 语义说明与示例 |
|---|---|---|
if | if(condition, trueValue, falseValue) | 基础三元条件判断。if(prop("Score") >= 60, "及格", "不及格") |
ifs | ifs(cond1, val1, cond2, val2, ..., fallbackVal) | 推荐 多分支条件判断,告别深度嵌套。ifs(prop("进度") == 1, "已交付", prop("进度") > 0, "进行中", "待启动") |
empty | empty(value) 或 value.empty() | 判断字符串、数字、列表或关联是否为空或未填。prop("截止日期").empty() |
and | and(a, b) 或 a and b 或 a && b | 逻辑与,所有条件成立返回 true |
or | or(a, b) 或 a or b 或 a || b | 逻辑或,任一条件成立返回 true |
not | not(a) 或 !a | 逻辑非,取反判断 |
3. 文本与正则表达式函数速查 #
Formula 2.0 引入了原生 JavaScript 兼容的正则表达式引擎,为文本清洗、数据校验与模式匹配带来巨大飞跃。
| 函数名 | 语法定义 | 说明与示例 |
|---|---|---|
test | text.test(regex) | 校验文本是否匹配正则模式,返回布尔值 true / false。prop("邮箱").test("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$") |
match | text.match(regex) | 提取匹配正则的所有子串,返回文本列表 List<Text>。prop("描述").match("\\d+")(提取所有连续数字) |
replace | text.replace(regex, replacement) | 替换匹配正则的第一个子串。prop("电话").replace("^\\+86", "") |
replaceAll | text.replaceAll(regex, replacement) | 替换匹配正则的所有子串。prop("内容").replaceAll("\\s+", " ")(将连续空白折叠为单空格) |
length | text.length() | 计算字符串字符长度。prop("标题").length() |
slice | text.slice(start, end) | 切片截取子字符串。prop("工号").slice(0, 3) |
lower / upper | text.lower() / text.upper() | 转全小写 / 转全大写 |
split | text.split(separator) | 按分隔符拆分为列表。prop("路径").split("/") |
3.1 常用正则表达式速查库 #
在 Notion 公式中编写正则表达式时,反斜杠字符需转义写作双反斜杠 \\:
- 中国大陆 11 位手机号:
prop("Phone").test("^1[3-9]\\d{9}$") - 电子邮箱合规校验:
prop("Email").test("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$") - 提取字符串中的全部金额数字:
prop("Notes").match("\\d+(\\.\\d{1,2})?") - 去除前后全部空白字符(Trim):
prop("RawText").replace("^\\s+", "").replace("\\s+$", "")
4. 数值计算与统计函数速查 #
| 函数名 | 语法定义 | 说明与示例 |
|---|---|---|
round | round(num) | 标准四舍五入取整。 保留 2 位小数技巧: round(prop("Rate") * 100) / 100 |
ceil | ceil(num) | 向上取整。ceil(4.1) -> 5 |
floor | floor(num) | 向下取整。floor(4.9) -> 4 |
abs | abs(num) | 计算绝对值。abs(-15) -> 15 |
min / max | min(a, b, ...) / max(...) | 取一组数值中的最小值或最大值 |
sum | list.sum() | 对数组中的所有数值求和。prop("关联工时").map(current.prop("Hours")).sum() |
mean | list.mean() | 计算数组数值算术平均值 |
median | list.median() | 计算中位数 |
5. 日期与时间函数速查 #
Notion 公式中的日期计算至关重要,特别是对 Deadline 倒计时与项目周期的自动化跟踪。
| 函数名 | 语法定义 | 常用单位参数 (units) | 示例与说明 |
|---|---|---|---|
now() | now() | 当前时间点(含分秒动态更新) | 动态倒计时基准 |
today() | today() | 当前日期零点(00:00) | 仅按天比对日期 |
dateBetween | dateBetween(date1, date2, units) | "days", "weeks", "months", "hours", "minutes" | 计算两日期差额。dateBetween(prop("截止日"), today(), "days") |
dateAdd | dateAdd(date, amount, units) | 同上 | 增加时间。dateAdd(prop("创建日"), 7, "days") |
dateSubtract | dateSubtract(date, amount, units) | 同上 | 减少时间 |
formatDate | formatDate(date, "YYYY-MM-DD") | 标准 Moment/Luxon 格式化标记 | 格式化输出。formatDate(now(), "YYYY年MM月DD日 HH:mm") |
6. List(列表/数组)高阶函数速查 #
数组函数是 Formula 2.0 区别于旧版本的王牌武器。当前项在匿名函数内通过关键字 current 指代。
| 函数名 | 语法定义 | 经典应用场景 |
|---|---|---|
map | list.map(current.expression) | 映射转换每一个元素。prop("成员").map(current.name()).join("、") |
filter | list.filter(current.condition) | 过滤满足条件的元素。prop("子任务").filter(current.prop("已完成") == false) |
find | list.find(current.condition) | 查找满足条件的第一个元素 |
join | list.join(separator) | 将列表数组以指定字符连接为单个文本 |
unique | list.unique() | 数组去重 |
sort | list.sort() | 对列表进行自然顺序排序 |
reverse | list.reverse() | 反转列表项次序 |
flat | list.flat() | 将多维嵌套列表展平为一维 |
7. 生产级高阶实战公式库(复制即用) #
7.1 十格动态分段进度条(带精准百分比与色块) #
- 功能:自动读取子任务完成比例或自定义进度数值,输出如
██████░░░░ 60%的精美可视化进度条。 - 公式代码:
lets(
percent, if(empty(prop("Progress")), 0, min(1, max(0, prop("Progress")))),
barLength, 10,
filledCount, round(percent * barLength),
emptyCount, barLength - filledCount,
filledStr, repeat("█", filledCount),
emptyStr, repeat("░", emptyCount),
filledStr + emptyStr + " " + round(percent * 100) + "%"
)
7.2 智能临期预警倒计时状态指示灯 #
- 功能:综合比对任务状态与截止日期,智能返回 🚨 严重逾期、⚡ 今日到期、⏳ 临期 3 天内、✅ 正常推进 或 🎉 已完成。
- 公式代码:
ifs(
prop("Status") == "Done",
"🎉 已顺利完成",
empty(prop("DueDate")),
"⚪ 未排期",
dateBetween(prop("DueDate"), today(), "days") < 0,
"🚨 逾期 " + abs(dateBetween(prop("DueDate"), today(), "days")) + " 天",
dateBetween(prop("DueDate"), today(), "days") == 0,
"⚡ 今日截止,请加急",
dateBetween(prop("DueDate"), today(), "days") <= 3,
"⏳ 临近到期(仅剩 " + dateBetween(prop("DueDate"), today(), "days") + " 天)",
"✅ 正常进行中"
)
7.3 OKR 目标关键结果(KR)多维度权重综合达成率 #
- 功能:根据关联的多个 Key Results,按各自自定义的权重进行加权平均计算,动态汇总出 Objective 的实际达成度。
- 公式代码:
lets(
krList, prop("Key Results"),
totalWeight, krList.map(current.prop("Weight")).sum(),
weightedScore, krList.map(current.prop("CurrentScore") * current.prop("Weight")).sum(),
finalPercent, if(totalWeight > 0, weightedScore / totalWeight, 0),
round(finalPercent * 1000) / 10 + "%"
)
7.4 自动化提取页面纯文本字数与阅读时长预估 #
- 功能:解析关联内容或长文本属性,按每分钟 400 字的中文阅读速率估算耗时。
- 公式代码:
lets(
cleanContent, prop("Notes").replaceAll("\\s+", ""),
charCount, cleanContent.length(),
mins, ceil(charCount / 400),
charCount + " 字 · 约需 " + mins + " 分钟阅读"
)
7.5 跨库穿透汇总(基于 map().flat() 规避多层 Rollup 性能损耗) #
- 功能:从父级卡片一次性穿透至孙级任务列表,汇总所有未完成项数量,彻底终结多层嵌套 Rollup 导致的页面卡顿。
- 公式代码:
prop("Projects")
.map(current.prop("Tasks"))
.flat()
.filter(current.prop("Status") != "Done")
.length()
- 架构调优建议:配合 Notion 数据库性能调优手册 实现企业级万级数据疾速响应。
7.6 自动化 Webhook 消息体格式化与字段清洗 #
- 功能:自动将任务的多条属性(名称、负责人、截止日、严重度)拼接为合规的富文本摘要或转义 JSON 片段,供 Webhook 或自动化平台直接取用。
- 公式代码:
lets(
title, prop("Name").replace("\"", "\\\""),
user, if(empty(prop("Assignee")), "待认领", prop("Assignee").map(current.name()).join("、")),
due, if(empty(prop("DueDate")), "未排期", formatDate(prop("DueDate"), "YYYY-MM-DD")),
"📌 【" + title + "】\n👤 负责人:" + user + "\n📅 截止:" + due
)
- 自动化实践:完整打通飞书/企微机器人与 Make/Zapier 请参考 Notion Webhook 与自动化集成实战。
核心手册与速查工具矩阵
高频速查手册与生产力工具直达常见问题与答疑 (FAQ)
高频疑难解析与避坑指南A
macOS 上主要使用 Command (⌘) 键,Windows 上对应 Ctrl 键;Option 键对应 Windows 的 Alt 键。建议使用快捷键 Cmd/Ctrl + / 随时唤起系统命令面板。