公式允许你在[[Bases 简介|数据库]]中使用其他[[属性]]的数据创建计算属性。你可以执行计算、处理文本、操作日期等。 ## 公式能做什么 公式可以帮助你: - **计算数值**,相加价格、计算总额或执行数学运算。 - **处理文本**,合并字符串、更改大小写或提取子字符串。 - **操作日期**,计算时间差、格式化日期或确定截止日期。 - **应用逻辑**,使用条件语句来显示不同的值。 - **处理列表**,筛选、排序、映射或聚合列表数据。 ## 创建公式属性 要创建公式属性: 1. 在你的数据库中,点击工具栏中的**笔记属性**。 2. 点击菜单底部的**添加公式**。 3. 为公式属性输入名称。 4. 在**公式**字段中输入你的公式。 5. 关闭对话框。 公式编辑器会在你输入时自动补全[[函数]]和属性名称,以验证公式语法。当公式有效时,会显示一个绿色勾号。 创建后,你可以像使用数据库中的其他属性一样使用公式属性。将其添加到[[视图]]中,在筛选中使用它,按它排序等。 ## 编写公式 在公式编辑器中,使用属性、运算符和函数输入表达式。 ### 引用属性 你可以在公式中引用不同类型的属性: - **笔记属性** — 来自笔记[[属性|前置元数据]]的属性。 - **文件属性** — 内置属性,如 `file.name`、`file.size` 或 `file.mtime`。 - **公式属性** — 使用 `formula.formula_name` 引用其他公式。 **示例:** - `price * quantity` — 将两个笔记属性相乘 - `file.name + " - " + description` — 将文件名与笔记属性组合 - `formula.price_per_unit * 1.1` — 使用另一个公式属性 ### 使用运算符 **算术运算符**对数字执行数学运算: - `price + tax` — 加法 - `price - discount` — 减法 - `price * quantity` — 乘法 - `price / quantity` — 除法 - `(part / whole) * 100` — 使用括号控制运算顺序 **比较运算符**比较值: - `price > 100` — 大于 - `age < 18` — 小于 - `status == "Done"` — 等于 - `status != "Done"` — 不等于 - `file.mtime > now() - '7d'` — 比较日期 **布尔运算符**组合逻辑条件: - `!completed` — 非 - `price > 0 && quantity > 0` — 且 - `urgent || important` — 或 在[[Bases 语法#运算符|数据库语法]]中了解更多。 ### 使用函数 函数对值执行操作。可用的函数取决于你正在处理的值的类型。请参阅完整的[[函数]]列表。 **常见函数类别:** - **全局函数** — `if()`、`now()`、`date()`、`link()`、`max()`、`min()` - **字符串函数** — `contains()`、`replace()`、`split()`、`lower()`、`title()` - **数字函数** — `round()`、`ceil()`、`floor()`、`abs()`、`toFixed()` - **日期函数** — `format()`、`relative()`、`date()`、`time()` - **列表函数** — `filter()`、`map()`、`sort()`、`join()`、`unique()` **示例:** - `if(price, "quot; + price.toFixed(2), "")` 定义带有数字格式化的条件。 - `file.name.lower()` 转换为小写。 - `tags.contains("urgent")` 检查标签列表是否包含某个值。 - `due_date.format("YYYY-MM-DD")` 格式化日期。 ## 公式示例 ### 计算截止日期 将项目的截止日期设为开始日期后的 2 周: ```js start_date + "2w" ``` ### 显示逾期状态 如果截止日期已过且状态不是"Done",则显示"Overdue": ```js if(due_date < now() && status != "Done", "Overdue", "") ``` ### 格式化货币 以 2 位小数和货币符号显示价格: ```js if(price, "quot; + price.toFixed(2), "") ``` ### 计算列表项数 计算列表属性中的项目数量: ```js tasks.length ``` ### 计算优先级分数 将多个因素组合为优先级分数: ```js (impact * urgency) / effort ``` ### 合并文本字段 从名和姓创建全名: ```js first_name + " " + last_name ``` ### 计算总费用 将月费用乘以拥有的月数: ```js monthlyUses * formula.Owned.round() ``` ## 数据类型 公式可以处理不同类型的数据: - **字符串** — 用引号括起来的文本:`"hello"` 或 `'world'` - **数字** — 数值:`42`、`3.14`、`(2 + 2)` - **布尔值** — 真或假:`true`、`false` - **日期** — 使用 `date()`、`today()` 或 `now()` 创建 - **列表** — 值的集合:`[1, 2, 3]` - **对象** — 键值对:`{"name": "value"}` 公式的输出类型由所使用的数据和函数决定。 ## 引用其他公式 公式可以引用其他公式,创建派生计算。例如,如果你有一个名为 `price_per_unit` 的公式: ```js price / quantity ``` 你可以在另一个公式中引用它: ```js formula.price_per_unit * 1.1 ``` > [!warning] 避免循环引用 > 公式不能直接或通过其他公式间接引用自身。