Javascript 如何找到每个元素的组合

Javascript 如何找到每个元素的组合,javascript,google-apps-script,google-sheets,google-sheets-formula,array-formulas,Javascript,Google Apps Script,Google Sheets,Google Sheets Formula,Array Formulas,我有一个元素列表: John Richard Bill Bob Walter 我想做点什么,把它们的每一个可能的组合放在两列中,不包括重复项。以下是一个例子: A B John Richard John Bill John Bob John Walter Richard Bill Richard Bob Richard Walter Bill Bob Bill

我有一个元素列表:

John
Richard
Bill
Bob
Walter
我想做点什么,把它们的每一个可能的组合放在两列中,不包括重复项。以下是一个例子:

A            B
John         Richard
John         Bill
John         Bob
John         Walter
Richard      Bill
Richard      Bob
Richard      Walter
Bill         Bob
Bill         Walter
Bob          Walter
正如你所看到的,我原谅了约翰和沃尔特·比尔,因为已经有了比尔-沃尔特的组合。如何使用公式实现这一点?

以下是我的方法:

function myFunction() {
var names = ['John', 'Richard', 'Bill', 'Bob', 'Walter'];
var result = []
var sheet = SpreadsheetApp.getActive().getSheetByName("sheet1")                        
names.forEach( (element, index) => {
  names.slice(index+1,names.length).forEach ( (rest) => {                                      
  result.push([element,rest])        
})})
sheet.getRange(2,1,result.length,result[0].length).setValues(result);
}

说明:

基本上,您可以遍历名称列表。从每个元素开始,只与下一个元素连接。例如,John是姓名列表中的第一个元素,您可以将JohnRichardBillBobWalter连接起来。然后转到下一个元素,即Richard,将他与BillBobWalter连接起来。 这样,您就避免了重复出现,例如:John-JohnJohn-RichardRichard-John。forEach方法帮助您实现这种迭代方法

参考文献:

如何使用公式来实现这一点

使用:

=数组公式(排序(唯一)查询(如果(
转置(拆分(报告(连接(A1:A和字符(9)),计数(A1:A)),字符(9)))>
转置(拆分(连接)(报告(A1:A和字符(9),计数(A1:A))),字符(9)){
转置(拆分(报告(连接(A1:A和字符(9)),计数(A1:A)),字符(9)),
转置(SPLIT(连接)(REPT(A1:A&CHAR(9),COUNTA(A1:A))),CHAR(9)){
转置(拆分(连接)(报告(A1:A和字符(9),计数(A1:A))),字符(9)),
转置(SPLIT(REPT(CONCATENATE(A1:A&CHAR(9)),COUNTA(A1:A)),CHAR(9))),
“其中Col1Col2”,0)

如果A1:A5包含名称

=ARRAYFORMULA(SPLIT(QUERY(
  FLATTEN(
    IF(SEQUENCE(COUNTA(A1:A5))<TRANSPOSE(SEQUENCE(COUNTA(A1:A5))),
      A1:A5& "☤" & TRANSPOSE(A1:A5)
      ,)
   ),
  "where Col1 is not null",0),"☤"))
  • 使用
    IF
    将二维矩阵转换为串联名称:
  • 展平
    矩阵,使用
    QUERY
    SPLIT
    将连接的名称拆回,删除空格

嗨!我张贴了我的答案。请让我知道它是否对你有用!我还提供了将数据附加到工作表中的功能。@player0请查看是否适合我。非常感谢你!由于某种原因,其他的解决方案不起作用,即使我也这么做了。虽然这段代码片段可能是解决方案,但确实有助于提高您的文章质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。@TheMaster您是对的!我在回答中添加了更多的解释和参考资料。你能简要解释一下代码吗?骨骼上的一点肉会有很大帮助。虽然这个代码片段可能是解决方案,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
=ARRAYFORMULA(SPLIT(QUERY(
  FLATTEN(
    IF(SEQUENCE(COUNTA(A1:A5))<TRANSPOSE(SEQUENCE(COUNTA(A1:A5))),
      A1:A5& "☤" & TRANSPOSE(A1:A5)
      ,)
   ),
  "where Col1 is not null",0),"☤"))
0   1   1   1   1
0   0   1   1   1
0   0   0   1   1
0   0   0   0   1
0   0   0   0   0
            John☤Rich   John☤Bill   John☤Bob    John☤Walt
                        Rich☤Bill   Rich☤Bob    Rich☤Walt
                                    Bill☤Bob    Bill☤Walt
                                                Bob☤Walt