跨表公式
跨表公式是一种独立的字段类型,它和行内公式共用同一套公式引擎和全部函数(IF、比较、&&、SUM、CONCATENATE……),只是多了一组跨表函数——LOOKUP(取值)、COUNTIF/SUMIF/JOINLOOKUP(过滤/聚合)——让你不用先建关联,就能按条件从另一张表里查值/统计,再用现成函数任意加工。用完还能一键固化为真正的关联字段。
跟行内公式的区别
Section titled “跟行内公式的区别”| 行内公式(ƒ) | 跨表公式(ƒ⤫) | |
|---|---|---|
| 引用范围 | 只能引用本表列 {列名} | 本表列 {列名} + 目标表列 {表名·列名} |
| 跨表函数 | ❌ 不能用 LOOKUP | ✅ 可用 LOOKUP |
| 计算时机 | 数据一变就重算、结果存进表里 | 打开时临时算、不存进表里 |
| 实时性 | 引用列一变立即重算 | 不保证实时,靠「刷新重算」 |
| 排序 / 搜索 / 分组 / 筛选 | ✅ 支持(值存进表里) | ❌ 全部不支持(值不存进表里,见下) |
| 适用 | 本行内的计算 | 从别的表带数据过来 |
LOOKUP 用法
Section titled “LOOKUP 用法”LOOKUP(返回列, 条件)- 返回列:目标表里要取回的列,必须带表前缀,如
{商品·单价} - 条件:任意公式表达式,对目标表每一行求值,取第一条为真的那行的返回列;无命中返回空
条件里可以混用本表列和目标表列,也能用比较 / && / || 组合:
LOOKUP({商品·库存}, {商品·商品名} = {商品名} && {商品·单价} < 8)条件不止等值——想按「包含」匹配用 CONTAINS(不区分大小写)或 FIND(区分大小写、找不到返 0):
LOOKUP({商品·库存}, CONTAINS({商品·商品名}, {关键词}))LOOKUP({商品·库存}, FIND({关键词}, {商品·商品名}) > 0)引用语法统一用 {},靠表前缀区分:{列名} 是本行字段,{表名·列名} 是目标表字段。
过滤 / 聚合:集合函数
Section titled “过滤 / 聚合:集合函数”LOOKUP 只取第一条匹配。如果你要的是「一组满足条件的行」的统计,用下面三个集合函数——它们对目标表里所有满足条件的行做聚合,在单元格里显示一个标量:
| 函数 | 作用 | 示例 |
|---|---|---|
COUNTIF(条件) | 满足条件的行数(目标表从条件里的 {表.列} 自动推断) | COUNTIF({订单·商品名} = {商品名}) → 该商品的订单数 |
SUMIF({表.列}, 条件) | 满足条件的行对某列求和 | SUMIF({订单·数量}, {订单·商品名} = {商品名}) → 总销量 |
AVERAGEIF({表.列}, 条件) | 满足条件的行对某列求平均(跳过空;无命中为空) | AVERAGEIF({订单·金额}, {订单·商品名} = {商品名}) → 平均客单 |
MINIF({表.列}, 条件) | 满足条件的行某列最小值 | MINIF({订单·单价}, {订单·商品名} = {商品名}) |
MAXIF({表.列}, 条件) | 满足条件的行某列最大值 | MAXIF({订单·单价}, {订单·商品名} = {商品名}) |
JOINLOOKUP({表.列}, 条件, 分隔符?) | 满足条件的行某列拼成一串(分隔符默认 ", ") | JOINLOOKUP({订单·下单人}, {订单·商品名} = {商品名}) → “张三, 李四” |
这套 *IF 聚合与汇总字段的 SUM/AVERAGE/MIN/MAX/COUNT/CONCATENATE 对齐。一样能和现成函数组合,例如 IF(COUNTIF(...) > 0, "有订单", "滞销")。集合函数同样是临时计算,继承下面所有限制(不存进表里、不能排序/搜索/分组/筛选)。
创建跨表公式字段
Section titled “创建跨表公式字段”- 加一列,数据类型选 ƒ⤫ 跨表公式
- 在「引用的目标表」里勾选公式要引用的表——勾上后它的字段就会出现在下方公式编辑器的字段面板里(显示为「表名·列名」)
- 写表达式,可从字段面板点选列、从函数面板点选
LOOKUP等函数 - 保存

假设有一张商品表(商品名 / 单价 / 库存):

在订单表(商品名 / 数量)里加三个跨表公式列,从商品表带数据过来:
① 单价 —— 按商品名查回商品表的单价:
LOOKUP({商品·单价}, {商品·商品名} = {商品名})
② 金额 —— 查回单价后 × 本行数量(复用乘法):
LOOKUP({商品·单价}, {商品·商品名} = {商品名}) * {数量}③ 库存提醒 —— 查回库存后用 IF + 比较判断(复用逻辑函数):
IF(LOOKUP({商品·库存}, {商品·商品名} = {商品名}) < 10, "⚠️缺货", "正常")
效果(西瓜在商品表里没有,是未命中的例子):

未命中与空值的处理
Section titled “未命中与空值的处理”LOOKUP 没匹配到任何行时返回空。空值参与运算时会按公式规则强制转换,这点要留意:
| 写法 | 未命中(如上例「西瓜」)显示 | 原因 |
|---|---|---|
LOOKUP(...) | 空 | 纯查值,没命中就是空 |
LOOKUP(...) * {数量} | 0 | 空在算术里当 0(0 * 1 = 0) |
IF(LOOKUP(...) < 10, ...) | 走 < 10 为真的分支 | 空在比较里当 0,0 < 10 成立 |
想区分「真的没匹配」和「匹配到 0」,用 ISBLANK 兜底:
IF(ISBLANK(LOOKUP({商品·库存}, {商品·商品名} = {商品名})), "无此商品", IF(LOOKUP({商品·库存}, {商品·商品名} = {商品名}) < 10, "⚠️缺货", "正常"))权限、导出与其它影响
Section titled “权限、导出与其它影响”跨表公式是临时取数的手段。当它本质上是「按条件匹配到目标记录」时,可以一键把这层匹配固化成一个真正的单向关联字段——把临时取数变成正式的表间关联。取值(LOOKUP)和过滤(COUNTIF/SUMIF/JOINLOOKUP)都能固化:它们都以「条件」框定了一组目标行,固化就是把这组行连成关联。
在跨表公式列头菜单里选:
- 固化为关联(全部匹配):把每行所有满足条件的目标记录都连上(多值关联)。filter 类(
COUNTIF/SUMIF/JOINLOOKUP)通常用这个——匹配的一组行就成了多值关联,之后可再挂汇总字段做计数/求和。 - 固化为关联(仅首条):只连第一条匹配(单值关联,与
LOOKUP取首条一致)。

生成的是一个新的单向关联字段,原来的跨表公式列保持不动,由你确认无误后自行删除。
适用条件(闸门):只有当表达式顶层就是一个跨表函数(LOOKUP / COUNTIF / SUMIF / AVERAGEIF / MINIF / MAXIF / JOINLOOKUP)时才提供「固化为关联」——这种形态才有干净的匹配关系。若把跨表函数包在运算/IF 里(如 LOOKUP(...) * {数量}、IF(COUNTIF(...) > 0, ...))或顶层不是跨表函数,菜单不出现;请先把里面的跨表函数拆成单独一列再固化。
更新到已有关联字段
Section titled “更新到已有关联字段”「固化为关联」是把整列一次性固化成一个新建的关联字段(快照)。但数据是会变的——今天没匹配上的行,明天可能就匹配上了;快照不会自动跟上。这时不必重新固化整列,可以对某一格增量补写:
右键一个跨表公式单元格 → 「更新到关联字段」 → 在子菜单里挑一个目标关联字段,就把这一行当前的匹配结果并进那个已有的关联字段里。

它和「固化为关联」是一对搭档,分工如下:
| 固化为关联(列头菜单) | 更新到关联字段(单元格右键) | |
|---|---|---|
| 作用范围 | 整列所有行 | 只当前这一格(一行) |
| 目标字段 | 新建一个关联字段 | 并入一个已有的关联字段 |
| 写入方式 | 全量覆盖(快照) | 并集去重、只增不删 |
| 用途 | 第一次把关系固化下来 | 数据更新后,增量补上新匹配 |
写入规则:把本行匹配到的记录并入目标关联字段——已有的关联原样保留、不会被删,只把新出现的匹配追加进去(自动去重,不会重复添加)。若目标是单值关联字段,则仅当它当前为空时填入首条匹配,已有值保持不动。因此这个操作是幂等的:没有新匹配时点了也不会有任何变化。
什么时候能用:菜单项只在同时满足以下两条时出现——
- 该跨表公式可固化(顶层就是一个跨表函数,同固化为关联的闸门);
- 且本表里已经有一个指向公式目标表的关联字段,作为并入的目标。子菜单会列出所有符合的关联字段让你挑;一个都没有时,请先用固化为关联建一个。
跟引用 / 汇总的区别
Section titled “跟引用 / 汇总的区别”- 引用字段、汇总字段都要先建关联字段,沿关联关系取值 / 聚合,结果会存进表里、可排序筛选。
- 跨表公式不用建关联,靠公式条件动态匹配,胜在灵活(条件任意、结果可加工),代价是临时计算、不保证最新、不能排序筛选。
需要稳定、可排序、走既有关联关系的取值,用引用 / 汇总;需要临时按条件从别的表捞数据再加工,用跨表公式。