在 Google 表格的递归 Lambda 函数中嵌入 SUMIF / Vlookup / Index-Match 函数

Embed SUMIF / Vlookup / Index-Match functions in Recursive Lambda functions in Google Sheets

提问人:Wesley Jeftha 提问时间:10/19/2023 最后编辑:Wesley Jeftha 更新时间:10/19/2023 访问量:60

问:

问题:

继这个问题之后:
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)) 
    )
google-sheets 递归 lambda 笛卡尔乘积

评论


答:

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