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

问题描述 投票:0回答:1

问题:

从这个问题开始:
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)) 
    )
google-sheets recursion lambda cartesian-product
1个回答
0
投票

你可以尝试这样的事情:

=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,)})}
)
© www.soinside.com 2019 - 2024. All rights reserved.