如何修改Google Sheets的CARTESIAN_PRODUCT函数,添加每行列数参数?
实现带列数限制的Google Sheets笛卡尔积命名函数
你可以通过新增参数r实现需求,以下是修改后的命名函数,支持从输入范围中生成指定列数的所有笛卡尔积组合:
命名函数代码
创建名为CARTESIAN_PRODUCT_R的命名函数,参数设为range(输入数据范围)和r(结果每行的列数):
=LET( // 提取每列的非空值 filtered_cols, BYCOL(range, LAMBDA(col, IFNA(FILTER(col, col <> "")))), total_cols, COLUMNS(range), // 生成所有r列的组合索引 column_combos, COMBINATIONS(SEQUENCE(total_cols), r), // 为单个列组合生成笛卡尔积的逻辑 generate_cartesian, LAMBDA(combo, REDUCE(INDEX(filtered_cols,, INDEX(combo, 1)), SEQUENCE(r - 1), LAMBDA(acc, idx, LET( next_col, INDEX(filtered_cols,, INDEX(combo, idx + 1)), // 生成两集合的笛卡尔积 cross_join, FLATTEN(ARRAYFORMULA( INDEX(acc, SEQUENCE(ROWS(acc)), SEQUENCE(1, COLUMNS(acc))) & "§" & INDEX(next_col, SEQUENCE(ROWS(next_col)), SEQUENCE(1, COLUMNS(next_col))) )), cross_join ) )) ), // 批量生成所有列组合的笛卡尔积 all_cartesian, BYROW(column_combos, generate_cartesian), // 拆分临时分隔符并整理结果 split_results, BYROW(all_cartesian, LAMBDA(row, SPLIT(row, "§"))), // 合并所有结果 VSTACK(split_results) )
使用示例
- 若输入数据在
A:C列,要生成2列的笛卡尔积:=CARTESIAN_PRODUCT_R(A:C, 2) - 若输入数据在
A:D列,要生成3列的笛卡尔积:=CARTESIAN_PRODUCT_R(A:D, 3)
关键说明
- 自动过滤输入列中的空值,避免生成无效组合
- 使用
§作为临时分隔符,若你的数据包含该字符,可替换为其他不常用字符(如|、♦) - 当
r=1时,返回所有列的非空值合并结果;当r等于输入列数时,效果与原CARTESIAN_PRODUCT函数完全一致
内容的提问来源于stack exchange,提问作者Iceman6425
相关产品推荐
相关产品推荐

