Function 谷歌电子表格:生成4列的所有组合,每列8行

Function 谷歌电子表格:生成4列的所有组合,每列8行,function,google-sheets,combinations,permutation,Function,Google Sheets,Combinations,Permutation,我想为Google Sheets创建一个函数,允许我列出所有可能的数字1到8的组合,连接4次(从1111到8888,我认为这是8^4=4096) (为了清晰起见,我添加了一个屏幕截图) 到目前为止,我尝试了: =ArrayFormula(transpose(split(concatenate(A2:A9&B2:B9&C2:C9&D2:D9& char(9)),char(9)))) …但这只给了我8个组合:1111223333444445555666677888

我想为Google Sheets创建一个函数,允许我列出所有可能的数字1到8的组合,连接4次(从1111到8888,我认为这是8^4=4096)

(为了清晰起见,我添加了一个屏幕截图)

到目前为止,我尝试了:

=ArrayFormula(transpose(split(concatenate(A2:A9&B2:B9&C2:C9&D2:D9& char(9)),char(9))))
…但这只给了我8个组合:1111223333444445555666677888

我在编程方面有点差劲,特别是在新语言方面,所以非常感谢您的帮助

这里有一个小程序,可以创建行的所有组合(为行编写更简单):

将其用作组合(A2:D9)将创建4^8个组合,每个组合的长度为8,这不是您想要的。但转置很容易:

=combinations(transpose(A2:D9))
上面的函数以矩形数组的形式返回组合,因此在您的示例中,输出将是4列宽。如果要将组合合并到一个单元格中(因此输出为单列),请使用此修改版本:

function joincombinations(arr) {
  return arr.reduce(function(prod, row) {
    var out = [];
    for (i in row) {
      out = out.concat(prod.map(function(x) {
        return x.concat(row[i]);
      }));
    }
    return out;
  }, [[]]).map(function(row) {
    return row.join("");
  });
}
用法:
=joincombination(转置(A2:D9))
试试看

=arrayformula(if(row(A:A)>4096,"",int((row(A:A)-1)/512)+1&mod(int((row(A:A)-1)/64),8)+1&mod(int((row(A:A)-1)/8),8)+1&mod(int((row(A:A)-1)/1),8)+1))

(工作表中至少需要4096行)。

无法使用,请查看。这非常有效,谢谢!它生成单个数字、所有夫妇和所有三人组以及4个字符的组合。这对我来说更好,那就是传播所有的组合。出于某种原因,它也会对每个结果重复4次-但这很好,也很容易纠正-重复是因为我把A1:D9而不是A2:D9,修正了
=arrayformula(if(row(A:A)>4096,"",int((row(A:A)-1)/512)+1&mod(int((row(A:A)-1)/64),8)+1&mod(int((row(A:A)-1)/8),8)+1&mod(int((row(A:A)-1)/1),8)+1))