You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写跳过重复行的VSTACK函数实现多表合并与替换

函数方案:合并多表并替换指定ID行

Excel 动态数组方案(支持列对齐)

适用于Excel 365/2021+版本,可自动匹配列值(不受表的列顺序影响,只要列名一致),同时跳过Table1/Table2中与Edited表ID重复的行,改用Edited表对应行:

=LET(
    // 替换为你实际的结构化表名或单元格范围
    T1, Table1,
    T2, Table2,
    Ed, Edited,
    // 以Edited表的列作为目标输出列
    target_cols, Ed[#Headers],
    // 获取所有唯一ID集合
    all_ids, UNIQUE(VSTACK(T1[ID], T2[ID], Ed[ID])),
    // 初始化结果数组
    result, {},
    // 遍历每个ID构建最终结果
    final_result, REDUCE(result, all_ids, LAMBDA(acc, id,
        LET(
            // 判断当前ID是否存在于Edited表
            in_ed, NOT(ISNA(XMATCH(id, Ed[ID]))),
            // 提取Edited表中该ID的行,按目标列匹配
            ed_row, XLOOKUP(target_cols, Ed[#Headers], FILTER(Ed, Ed[ID]=id)),
            // 提取Table1中该ID的行,按目标列匹配(无则返回空)
            t1_rows, IFERROR(XLOOKUP(target_cols, T1[#Headers], FILTER(T1, T1[ID]=id)), ""),
            // 提取Table2中该ID的行,按目标列匹配(无则返回空)
            t2_rows, IFERROR(XLOOKUP(target_cols, T2[#Headers], FILTER(T2, T2[ID]=id)), ""),
            // 拼接非Edited表的行
            non_ed_rows, VSTACK(t1_rows, t2_rows),
            // 累加结果:ID在Edited中则添加Edited行,否则添加Table1+Table2的行
            IF(in_ed, VSTACK(acc, ed_row), VSTACK(acc, non_ed_rows))
        )
    )),
    // 添加表头并返回最终结果
    VSTACK(target_cols, final_result)
)

简化版(列顺序一致时使用)

如果三个表的列顺序完全一致,可使用更简洁的公式:

=VSTACK(
    FILTER(Table1, ISNA(XMATCH(Table1[ID], Edited[ID]))),
    FILTER(Table2, ISNA(XMATCH(Table2[ID], Edited[ID]))),
    Edited
)

Google Sheets 方案

逻辑与Excel一致,仅调整函数适配Google Sheets环境:

=LET(
    T1, Table1,
    T2, Table2,
    Ed, Edited,
    // 假设表头在第一行,替换为实际表头范围
    target_cols, Ed!1:1,
    all_ids, UNIQUE(VSTACK(T1[ID], T2[ID], Ed[ID])),
    result, {},
    final_result, REDUCE(result, all_ids, LAMBDA(acc, id,
        LET(
            in_ed, NOT(ISNA(MATCH(id, Ed[ID], 0))),
            ed_row, XLOOKUP(target_cols, Ed!1:1, FILTER(Ed, Ed[ID]=id)),
            t1_rows, IFERROR(XLOOKUP(target_cols, T1!1:1, FILTER(T1, T1[ID]=id)), ""),
            t2_rows, IFERROR(XLOOKUP(target_cols, T2!1:1, FILTER(T2, T2[ID]=id)), ""),
            non_ed_rows, VSTACK(t1_rows, t2_rows),
            IF(in_ed, VSTACK(acc, ed_row), VSTACK(acc, non_ed_rows))
        )
    )),
    VSTACK(target_cols, final_result)
)

关键注意事项

  • ID格式一致性:确保三个表的ID列数据格式统一(比如均为文本格式),避免因格式差异导致匹配失败(例如数字ID和文本ID会被视为不同值)
  • 重复ID处理:如果Table1和Table2存在相同ID且不在Edited表中,上述公式会保留两行;若需去重,可在non_ed_rows处添加UNIQUE()函数
  • 缺失列处理:如果某表缺少目标列,公式会返回空值,可根据需求修改IFERROR的返回内容

内容的提问来源于stack exchange,提问作者Minouuuu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:47:08