如何用公式在A2生成左侧数组?基于QUERY结果添加商品项
实现思路与公式方案
一、A2单元格自动生成左侧手动输入的单元格数组
假设左侧手动输入的内容区域为B2:B(纵向非空单元格),A2单元格可通过动态数组公式自动提取非空值生成数组:
=TOCOL(B2:B, 1)
TOCOL函数将纵向区域转为单列数组,参数1表示忽略空单元格,自动适配左侧手动输入的内容变化;- 若左侧为横向输入(如B2:Z2),替换为
TOROW(B2:Z2, 1)即可。
二、右侧按数量匹配生成交易行(基于QUERY函数)
核心逻辑:先从「交易日志」提取指定数据,再按每行的添加数量重复生成对应行,分三步实现:
1. 预提取交易日志中的添加商品数据
在空白单元格(如S2)写入QUERY公式,提取所有「添加商品」类型的交易行及对应价格:
=QUERY(交易日志!A:Z, "SELECT B, D WHERE E='添加商品'")
- 替换公式中的
B(商品名列)、D(价格列)、E(交易类型列)为你实际的列标识; - 公式返回的动态数组(
S2#)将作为后续匹配价格的数据源。
2. 逐行处理Q列商品+R列数量,生成对应行
在目标起始单元格(如T2)写入以下公式,自动遍历Q3:R的每一行,按R列数量生成对应次数的商品+价格行:
=REDUCE("", Q3:R, LAMBDA(acc, row, LET( 商品, INDEX(row, 1), 数量, INDEX(row, 2), 价格, XLOOKUP(商品, S2#Col1, S2#Col2, "无匹配"), IF(商品="", acc, VSTACK(acc, SEQUENCE(数量, 2, {商品, 价格}, 0))) ) ))
REDUCE用于累加每一行的生成结果,初始值为空;LET简化变量定义,避免重复计算;XLOOKUP从预提取的S2#数组中匹配当前商品的价格;SEQUENCE(数量,2,{商品,价格},0)生成重复数量次的商品+价格行,步长0保证每一行内容一致。
3. 优化:直接整合QUERY与生成逻辑(无需中间单元格)
若不想单独使用S2存储QUERY结果,可将公式整合为:
=REDUCE("", Q3:R, LAMBDA(acc, row, LET( 商品, INDEX(row, 1), 数量, INDEX(row, 2), 交易数据, QUERY(交易日志!A:Z, "SELECT B, D WHERE E='添加商品'"), 价格, XLOOKUP(商品, INDEX(交易数据,,1), INDEX(交易数据,,2), "无匹配"), IF(商品="", acc, VSTACK(acc, SEQUENCE(数量, 2, {商品, 价格}, 0))) ) ))
内容的提问来源于stack exchange,提问作者solexious
相关产品推荐
相关产品推荐

