把 Notion 公式玩出新花样了,自动生成绑定项概括、按数量降序
我为搬东西做了两个数据库,物品、容器,打包运送的物品会绑定到容器,以便集中查看管理。
在物品数据库中,我已经在 Notion AI 的帮助下分好了类,容器数据库这边,我则希望能对容器内的物品有个整体概括,于是想办法写了这段公式,它会分类统计每个类别物品的数量、倒序输出给我一段文本描述,比如:
书本x10,小件杂物x4,大件x2,数码电器x1
实现逻辑已经很接近写代码而不是公式了,大概分为 3 个模块:
1. 获取去重的物品类型
map() 遍历容器绑定的所有物品页面,current.prop("物品类别") 获取类型,再 unique() 去重
2. 按数量倒序类别
sort() 重排去重后的每个类型,排序数值指定为该类别的物品数量,用 filter() 筛选绑定物品页面后通过 length() 计数。
需要注意的是,尽管 Notion 公式的 map() 很像 Python 中的 for 遍历循环,但循环中的单项(i)不能自定义变量名,只能用 current,但因为重名、嵌套这类遍历循环容易发生冲突。
这种情况下可用 let() 或 lets() 赋值上一层作用域的 current 来解决,比如:
/*把 current 改名为 item_type,避免后续和另一个 current 冲突*/
let(item_type, current, ...)
使用 sort() 默认会正向排序,比如 sort([3, 1, 2], current) 会得到 [1, 2, 3],想倒序可以给排序数值 *-1,比如 sort([3, 1, 2], current*-1) 。
这套操作下来,就有了按物品数降序的类别列表 sorted_item_types
3. 输出物品统计
map() 遍历降序的物品类别,用 filter() 和 length() 算出对应类型的物品数量,为了避免 current 冲突,这里也用到了 lets()。
最后,就有了开头的输出结果。
完整公式:
```
lets(
/*物品类型去重*/
item_types, unique(map(prop("物品"), current.prop("物品类别"))),
/*按数量倒序*/
sorted_item_types, sort(item_types, -1*let(
item_type, current,
length(filter(prop("物品"), current.prop("物品类别")==item_type))
)
),
/*输出 {物品类型}x{数量}*/
items_summary, map(sorted_item_types, lets(
item_type, current,
type_item_count, length(filter(prop("物品"), current.prop("物品类别")==item_type)),
current + "x" + type_item_count
)
),
items_summary
)
```