从这个问题开始:
Google 表格中笛卡尔积的递归 Lambda 函数
如何在生成数组中添加列,以从单独的数据源查找结果数组中的值?
请参阅this googlesheet了解以下数据、逻辑和公式
假设我们有下表作为数组公式的结果(笛卡尔积)(请参阅“代码示例”此处)
产品 | 国家 | 日期 |
---|---|---|
ABC001 | 英国 | 2023 年 9 月 4 日 |
ABC001 | 英国 | 2023 年 9 月 11 日 |
ABC001 | 英国 | 2023 年 9 月 18 日 |
ABC001 | 英国 | 2023 年 9 月 25 日 |
ABC001 | 美国 | 2023 年 9 月 4 日 |
ABC001 | 美国 | 2023 年 9 月 11 日 |
ABC001 | 美国 | 2023 年 9 月 18 日 |
ABC001 | 美国 | 2023 年 9 月 25 日 |
ABC001 | AU | 2023 年 9 月 4 日 |
ABC001 | AU | 2023 年 9 月 11 日 |
ABC001 | AU | 2023 年 9 月 18 日 |
ABC001 | AU | 2023 年 9 月 25 日 |
现在,目标是向上述数组添加 2 个附加列(销售和收据),以从其他 2 个表中查找值:
销售表
产品 | 国家 | 日期 | 销售 |
---|---|---|---|
ABC001 | 英国 | 2023 年 9 月 4 日 | $100.00 |
ABC001 | 英国 | 2023 年 9 月 25 日 | $200.00 |
ABC001 | 美国 | 2023 年 9 月 11 日 | $350.00 |
ABC001 | AU | 2023 年 9 月 18 日 | $120.00 |
ABC001 | AU | 2023 年 9 月 25 日 | $80.00 |
收据表
产品 | 国家 | 日期 | 收据 |
---|---|---|---|
ABC001 | 英国 | 2023 年 9 月 11 日 | 12 |
ABC001 | 英国 | 2023 年 9 月 18 日 | 5 |
ABC001 | 美国 | 2023 年 9 月 4 日 | 7 |
ABC001 | AU | 2023 年 9 月 18 日 | 15 |
最终结果
将这些表连接在一起后,结果将是这样的:
产品 | 国家 | 日期 | 销售 | 收据 |
---|---|---|---|---|
ABC001 | 英国 | 2023 年 9 月 4 日 | 100 美元 | |
ABC001 | 英国 | 2023 年 9 月 11 日 | 12 | |
ABC001 | 英国 | 2023 年 9 月 18 日 | 5 | |
ABC001 | 英国 | 2023 年 9 月 25 日 | 200 美元 | |
ABC001 | 美国 | 2023 年 9 月 4 日 | 7 | |
ABC001 | 美国 | 2023 年 9 月 11 日 | 350 美元 | |
ABC001 | 美国 | 2023 年 9 月 18 日 | ||
ABC001 | 美国 | 2023 年 9 月 25 日 | ||
ABC001 | AU | 2023 年 9 月 4 日 | ||
ABC001 | AU | 2023 年 9 月 11 日 | ||
ABC001 | AU | 2023 年 9 月 18 日 | 120 美元 | 15 |
ABC001 | AU | 2023 年 9 月 25 日 | 80 美元 |
我正在寻找可以动态包含和包含在生成笛卡尔积的原始数组公式中的东西。我不想要一个助手风格的列,即。我们需要在相邻列中使用一个公式来执行 SUMIFS / Vlookup / Index-Match 公式,需要向下拖动该公式来计算静态公式的查找。我希望了解是否存在某种设计模式,我可以学习在生成数组中动态创建附加列,以根据数组本身的行查找数据。
换句话说,如果下面是生成笛卡尔积的代码,如何调整它以动态添加 2 列,根据笛卡尔积本身的行值查找数据:
=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))
)
),
iterate_(iterate_, first_(table), rest_(1))
)
你可以尝试这样的事情:
=let(
table, A4: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))
)
),
ftable, iterate_(iterate_, first_(table), rest_(1)),
join_, lambda(array, byrow(array, lambda(r, join(,r)))),
jtable, join_(ftable),
{ftable,arrayformula({vlookup(jtable,{join_(K4:M12),N4:N12},2,),vlookup(jtable,{join_(P4:R12),S4:S12},2,)})}
)