即刻App年轻人的同好社区
下载
App内打开
MrCoffeeTalker
2月前
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
)
```
107

来自圈子

圈子图片

笔记交流站

3863人已经加入