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()

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
)

❓ 常见问题与答疑 (FAQ)

高频疑难解析与避坑指南
A

macOS 上主要使用 Command (⌘) 键,Windows 上对应 Ctrl 键;Option 键对应 Windows 的 Alt 键。建议使用快捷键 Cmd/Ctrl + / 随时唤起系统命令面板。