提问人:Wesley Jeftha 提问时间:10/19/2023 最后编辑:Wesley Jeftha 更新时间:10/19/2023 访问量:60
在 Google 表格的递归 Lambda 函数中嵌入 SUMIF / Vlookup / Index-Match 函数
Embed SUMIF / Vlookup / Index-Match functions in Recursive Lambda functions in Google Sheets
问:
问题:
继这个问题之后:
Google 表格中笛卡尔乘积的递归 Lambda 函数
如何在生成数组中添加列,该数组从单独的数据源中查找生成数组中的值?
工作示例:
有关以下数据、逻辑和公式,请参阅此谷歌表格
假设我们将下表作为数组公式的结果(笛卡尔积)(请参阅此处的“代码示例”)
产品 | 国家 | 日期 |
---|---|---|
ABC001型 | 英国 | 9/4/2023 |
ABC001型 | 英国 | 9/11/2023 |
ABC001型 | 英国 | 9/18/2023 |
ABC001型 | 英国 | 9/25/2023 |
ABC001型 | 我们 | 9/4/2023 |
ABC001型 | 我们 | 9/11/2023 |
ABC001型 | 我们 | 9/18/2023 |
ABC001型 | 我们 | 9/25/2023 |
ABC001型 | 澳大利亚 | 9/4/2023 |
ABC001型 | 澳大利亚 | 9/11/2023 |
ABC001型 | 澳大利亚 | 9/18/2023 |
ABC001型 | 澳大利亚 | 9/25/2023 |
现在,目标是将 2 个额外的列(Sales 和 Receipts)添加到上面的数组中,该数组从其他 2 个表中查找值:
销售表
产品 | 国家 | 日期 | 销售 |
---|---|---|---|
ABC001型 | 英国 | 9/4/2023 | $100.00 |
ABC001型 | 英国 | 9/25/2023 | $200.00 |
ABC001型 | 我们 | 9/11/2023 | $350.00 |
ABC001型 | 澳大利亚 | 9/18/2023 | $120.00 |
ABC001型 | 澳大利亚 | 9/25/2023 | $80.00 |
收据表
产品 | 国家 | 日期 | 收益 |
---|---|---|---|
ABC001型 | 英国 | 9/11/2023 | 12 |
ABC001型 | 英国 | 9/18/2023 | 5 |
ABC001型 | 我们 | 9/4/2023 | 7 |
ABC001型 | 澳大利亚 | 9/18/2023 | 15 |
最终结果 将这些表连接在一起后,结果
将是:
产品 | 国家 | 日期 | 销售 | 收益 |
---|---|---|---|---|
ABC001型 | 英国 | 9/4/2023 | 100美元 | |
ABC001型 | 英国 | 9/11/2023 | 12 | |
ABC001型 | 英国 | 9/18/2023 | 5 | |
ABC001型 | 英国 | 9/25/2023 | 200美元 | |
ABC001型 | 我们 | 9/4/2023 | 7 | |
ABC001型 | 我们 | 9/11/2023 | 350美元 | |
ABC001型 | 我们 | 9/18/2023 | ||
ABC001型 | 我们 | 9/25/2023 | ||
ABC001型 | 澳大利亚 | 9/4/2023 | ||
ABC001型 | 澳大利亚 | 9/11/2023 | ||
ABC001型 | 澳大利亚 | 9/18/2023 | 120美元 | 15 |
ABC001型 | 澳大利亚 | 9/25/2023 | 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))
)
答:
0赞
z..
10/19/2023
#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,)})}
)
评论
0赞
Wesley Jeftha
10/20/2023
差不多在那里,日期没有转换回日期值,所以将join_变量调整为:join_, lambda(array, byrow(arrayformula(iferror(array+0,array)), lambda(r, join(,r))))
0赞
Wesley Jeftha
10/20/2023
此外,我在查找(使用 MAP 函数)上应用了一些错误处理以使用法更通用,请参阅修改后的最后一个数组公式:map(arrayformula({vlookup(jtable,{join_(K4:M12),N4:N12},2,),vlookup(jtable,{join_(P4:R12),S4:S12},2,)}),lambda(vals,iferror(vals,“”)))
0赞
Wesley Jeftha
10/21/2023
@z - 我有一个后续问题:stackoverflow.com/q/77328439/1185992
上一个:将列标签与 Pandas MultiIndex 合并
下一个:熊猫合并 101
评论