如何在Google Sheets递归Lambda生成的笛卡尔积数组中添加查找列
Google Sheets 递归Lambda笛卡尔积动态添加匹配列方案
需求说明
基于原递归Lambda生成的Product、Country、Date笛卡尔积数组,无需辅助列,直接在数组末尾动态添加Sales和Receipts两列:
- Sales列:从独立的
Sales表中,匹配当前行的Product、Country、Date字段,求和对应销售额 - Receipts列:从独立的
Receipts表中,匹配相同的三个字段,求和对应收款额
需将查找逻辑整合进原笛卡尔积公式,掌握这种动态扩展数组列的设计模式。
整合后的完整公式
=let( table, A2:C, blank, iferror(1/0), first_, lambda(array, tocol(choosecols(array, 1), true)), rest_, lambda(n, choosecols(table, sequence(1, columns(table) - n, n + 1))), wrap_, lambda(array, wrapCount, wraprows(tocol(array, 1), wrapCount)), cartesian_, lambda(a, b, wrap_( byrow(a, lambda(row, reduce(blank, sequence(rows(b)), lambda(acc, i, { acc, row, chooserows(b, i) } ) ) ) ), columns(a) + columns(b) ) ), iterate_, lambda( self, a, b, if(iserror(b), a, self(self, cartesian_(a, first_(b)), rest_(columns(a) + 1)) ) ), // 生成基础笛卡尔积数组 cartesian_result, iterate_(iterate_, first_(table), rest_(1)), // 对每一行扩展Sales和Receipts列 byrow(cartesian_result, lambda(row, let( prod, index(row, 1), country, index(row, 2), date_val, index(row, 3), // 多条件求和Sales sales_sum, sumifs(Sales!D:D, Sales!A:A, prod, Sales!B:B, country, Sales!C:C, date_val), // 多条件求和Receipts receipts_sum, sumifs(Receipts!D:D, Receipts!A:A, prod, Receipts!B:B, country, Receipts!C:C, date_val), // 拼接原行与新计算列 {row, sales_sum, receipts_sum} ) )) )
动态扩展列的设计模式解析
这种模式的核心是先生成基础数据集,再通过BYROW逐行计算扩展列,步骤如下:
- 保留原有的核心逻辑(此处是递归生成笛卡尔积),将结果存入一个变量(如
cartesian_result) - 使用
BYROW遍历基础数据集的每一行:- 从当前行提取需要用于匹配的字段(如Product、Country、Date)
- 调用合适的查找/求和函数(这里用
SUMIFS适配多条件求和场景,若需单值匹配可改用XLOOKUP或INDEX/MATCH组合) - 将原行数据与新计算的列值拼接成新的行数组
- 最终输出包含扩展列的完整数组
如果需要添加更多列,只需在BYROW的拼接部分继续追加新的计算逻辑即可,无需修改原有的基础数据集生成逻辑,扩展性极强。
内容的提问来源于stack exchange,提问作者Wesley Jeftha
相关产品推荐
相关产品推荐

