Excel 如何在Google工作表中创建所有可能的配对组合而不重复?
如何在excel/google表格单元格上执行迭代以获得成对组合Excel 如何在Google工作表中创建所有可能的配对组合而不重复?,excel,excel-formula,google-sheets,iteration,Excel,Excel Formula,Google Sheets,Iteration,如何在excel/google表格单元格上执行迭代以获得成对组合 "string1" "string2" "string3" ... "string10" 我正在考虑编写一个可以迭代这些字符串的函数,以创建以下内容: "string1, string2" "string1, string 3" ... "string 1, string 10" "string 2, string 3" ... "string 2, string 10" "string3, string 4" .
"string1"
"string2"
"string3"
...
"string10"
我正在考虑编写一个可以迭代这些字符串的函数,以创建以下内容:
"string1, string2"
"string1, string 3"
...
"string 1, string 10"
"string 2, string 3"
...
"string 2, string 10"
"string3, string 4"
... ...
"string9 string10".
这在谷歌表单中是可能的吗
对于本机函数来说,这是一项艰巨的任务。尝试脚本并将其用作自定义函数:
function getTournament(teams_from_range)
{
// teams_from_range -- 2D Array
var teams = [];
// convert to list
teams_from_range.forEach(function(row) { row.forEach(function(cell) { teams.push(cell); } ); } );
return getTournament_(teams);
}
function getTournament_(teams)
{
var start = 0;
var l = teams.length;
var result = [], game = [];
// loop each value
for (var i = 0; i < l; i++)
{
// loop each value minus current
start++;
for (var ii = start; ii < l; ii++)
{
game = []
game.push(teams[i]);
game.push(teams[ii]);
result.push(game);
}
}
return result;
}
函数getTourname(团队范围内的团队)
{
//_范围内的团队_——2D阵列
var团队=[];
//转换为列表
teams_from_range.forEach(函数(行){row.forEach(函数(单元格){teams.push(单元格);}});
返回getTournament(团队);
}
函数getTournament_u2;(团队)
{
var start=0;
var l=团队长度;
var结果=[],游戏=[];
//循环每个值
对于(变量i=0;i
用法:
=getTourname(A1:A10)
对于本机函数来说,这是一项艰巨的任务。尝试脚本并将其用作自定义函数:
function getTournament(teams_from_range)
{
// teams_from_range -- 2D Array
var teams = [];
// convert to list
teams_from_range.forEach(function(row) { row.forEach(function(cell) { teams.push(cell); } ); } );
return getTournament_(teams);
}
function getTournament_(teams)
{
var start = 0;
var l = teams.length;
var result = [], game = [];
// loop each value
for (var i = 0; i < l; i++)
{
// loop each value minus current
start++;
for (var ii = start; ii < l; ii++)
{
game = []
game.push(teams[i]);
game.push(teams[ii]);
result.push(game);
}
}
return result;
}
函数getTourname(团队范围内的团队)
{
//_范围内的团队_——2D阵列
var团队=[];
//转换为列表
teams_from_range.forEach(函数(行){row.forEach(函数(单元格){teams.push(单元格);}});
返回getTournament(团队);
}
函数getTournament_u2;(团队)
{
var start=0;
var l=团队长度;
var结果=[],游戏=[];
//循环每个值
对于(变量i=0;i
用法:
=getTournament(A1:A10)
我必须同意@Max的观点,即使用本机函数是困难的,或者至少是冗长的,但在谷歌表单中是可能的
=ArrayFormula(query({if((row(A:A)<=counta(A:A)^2)*(int((row(A:A)-1)/counta(A:A))<mod((row(A:A)-1),counta(A:A))),
vlookup(int((row(A:A)-1)/counta(A:A)),{row(A:A)-1,A:A},2)&vlookup(mod((row(A:A)-1),counta(A:A)),{row(A:A)-1,A:A},2),"")},"select Col1 where Col1<>''"))
(3) 使用VLOOKUP中的行号获取具有
vlookup(mod((行(A:A)-1),counta(A:A)),{row(A:A)-1,A:A},2)
请注意,该列表将包括不需要的对,如String1String1和String2String1
(4) 使用if条件将不需要的对设置为“”
如果((row(A:A),我必须同意@Max的观点,即使用本机函数很困难,或者至少是冗长的,但在谷歌表单中是可能的
=ArrayFormula(query({if((row(A:A)<=counta(A:A)^2)*(int((row(A:A)-1)/counta(A:A))<mod((row(A:A)-1),counta(A:A))),
vlookup(int((row(A:A)-1)/counta(A:A)),{row(A:A)-1,A:A},2)&vlookup(mod((row(A:A)-1),counta(A:A)),{row(A:A)-1,A:A},2),"")},"select Col1 where Col1<>''"))
(3) 使用VLOOKUP中的行号获取具有
vlookup(mod((行(A:A)-1),counta(A:A)),{row(A:A)-1,A:A},2)
请注意,该列表将包括不需要的对,如String1String1和String2String1
(4) 使用if条件将不需要的对设置为“”
if((行(A:A)=查询(数组)公式(拆分(
转置(拆分(报告(连接(A2:A和字符(9)),计数(A2:A)),字符(9))&“&
转置(拆分(连接)(报告(A2:A和字符(9),计数A(A2:A))),字符(9)),“”),
“其中Col1 col2按Col1排序”,0)
=查询(数组)公式(拆分(
转置(拆分(报告(连接(A2:A和字符(9)),计数(A2:A)),字符(9))&“&
转置(拆分(连接)(报告(A2:A和字符(9),计数A(A2:A))),字符(9)),“”),
“其中Col1 col2按Col1排序”,0)
=数组公式(拆分(排序(
转置(SPLIT(CONCATENATE)(REPT(UNIQUE)(转置(SPLIT(JOIN(“,”,TEXTJOIN(“,”,1,A2:A)),“,”)和“,”&
转置(唯一(转置(拆分(JOIN(“,”,TEXTJOIN(“,”,1,A2:A)),“,”))(
唯一(转置(拆分(JOIN(“,”,TEXTJOIN(“,”,1,A2:A)),“,”))=ARRAYFORMULA(拆分(排序(
转置(SPLIT(CONCATENATE)(REPT(UNIQUE)(转置(SPLIT(JOIN(“,”,TEXTJOIN(“,”,1,A2:A)),“,”)和“,”&
转置(唯一(转置(拆分(JOIN(“,”,TEXTJOIN(“,”,1,A2:A)),“,”))(
可能是唯一的(转置(SPLIT(JOIN(“,”,TEXTJOIN(“,”,1,A2:A)),“,”)))。除此之外,您还没有提供足够的信息来确定您想要什么。到目前为止,您尝试了什么?字符串1在哪里,等存储?是否总是希望返回两个字符串的组合?字符串是否包含引号?…以及我没有想到的其他问题。相关:@Dave,请编辑问题以使其更易于理解,如果你说为什么需要它,这可能是一个好问题,并给出一个包含3个字符串而不是10个字符串的示例。此外,我建议将其重命名为:在列表中查找所有可能的配对。
。投票通过!我也投票通过了,因为这是一个很好的挑战,但问题可以改进。可能。除此之外,您还没有提供足够的信息来确定您想要什么。到目前为止,您尝试了什么?字符串1在哪里,等存储?是否总是希望返回两个字符串的组合?字符串是否包含引号?…以及我没有想到的其他问题。相关:@Dave,请编辑问题以使其更易于理解,如果你说为什么需要它,这可能是一个好问题,并给出一个包含3个字符串而不是10个字符串的示例。此外,我建议将其重命名为:查找列表中所有可能的行。
。投票!我也投票了,因为这是一个很好的挑战,但问题可以改进。很好!我花了一个小时来理解。您可以添加2个注释。注1您是如何做到的:找到所有可能的组合并排除不必要的行。注2关于所需的行。解决方案如果工作表有N^2行,那么就可以工作,因此对于100个值,您需要10K行!我的公式的较短版本:=query(filter(vlookup)(int((row(a:a)-1)/counta(a:a)),{row(a:a)-1,a:a},2)&vlookup(mod((row(a:a)-1),counta(a:a)),{row(a:a)-1),int((row(a:a)-1)/counta(a:a))对不起,没有解释!是的,我认为你使用过滤器是一个更好的方法。这是真的
=counta(A:A)
=2*N-1
=iferror(ArrayFormula(vlookup(ceiling((M-sqrt(M^2-8*row(A:A)))/2,1),{row(A:A),A:A},2)),"")
=iferror(ArrayFormula(vlookup(N+row(A:A)-(M*CEILING((M-SQRT(M^2-8*row(A:A)))/2,1)-CEILING((M-SQRT(M^2-8*row(A:A)))/2,1)^2)/2,{row(A:A),A:A},2)),"")
=QUERY(ARRAYFORMULA(SPLIT(
TRANSPOSE(SPLIT(REPT(CONCATENATE(A2:A&CHAR(9)), COUNTA(A2:A)), CHAR(9)))& " "&
TRANSPOSE(SPLIT(CONCATENATE(REPT(A2:A&CHAR(9), COUNTA(A2:A))), CHAR(9))), " ")),
"where Col1<>Col2 order by Col1", 0)
=ARRAYFORMULA(SPLIT(SORT(
TRANSPOSE(SPLIT(CONCATENATE(REPT(UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),",")))&","&
TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),",")))), (
UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),",")))<=
TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),",")))))*
REGEXMATCH(CONCATENATE(","&SUBSTITUTE(TEXTJOIN(",",1,A2:A),",",",,")&","&CHAR(9)),"(,"&
UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),",")))&",[^\t]*,"&
TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),","))))&",)|(,"&
TRANSPOSE(UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),","))))&",[^\t]*,"&
UNIQUE(TRANSPOSE(SPLIT(JOIN(",",TEXTJOIN(",",1,A2:A)),",")))&",)"))&CHAR(9)),CHAR(9)))),","))