Split/Transpose一列分成多行多列
Split/Transpose one column into multiple rows and columns
在 Google 表格上创建了一个用于视频游戏的表格,以跟踪小组活动的参与情况。我想将 C 列中的数据拆分并转置到多个列中,但找不到不需要我自己手动跨列扩展公式的解决方案。
这是我想要做的事情的一个例子:
Desired Result
从F列开始,第1行是时间戳,第3行是舰队指挥官,第4行及以后是舰队成员(如果舰队指挥官也在也可以,但如果可以的话,可以给加分过滤那个人,因为他们也列在第 3 行)。然后,此数据将用于跟踪每个成员随时间的参与情况,以便他们因此获得奖励。
到目前为止,我使用的是 =TRANSPOSE({Form!C2:C})
,然后是 =TRANSPOSE(SPLIT(D4,", ",0))
、=TRANSPOSE(SPLIT(E4,", ",0))
等。不过就像我说的,我不想手动扩展细胞,因为会有很多车队出去(包括我睡着的时候),数据需要尽快更新。
可能有直接电子表格公式的解决方案(我正在考虑 arrayformula 的技巧)但为了简单起见,我会向您推荐一个自定义公式的解决方案(Google Apps 脚本).
所以 here the demo
这里是演示中使用的函数:
function fleetCommander(data) {
var out = [[], []];
var header = data.shift();
var fleets = [];
var maxFleet = 0;
data.map(
function (row) {
if(row[0] == "" ) {return};
var fleet = row[2].split(",");
fleets.push(fleet);
if(maxFleet < fleet.length) { maxFleet = fleet.length;}
out[0].push(row[0]);
out[1].push(row[1]);
}
);
for(var fleetIndex = 0; fleetIndex < maxFleet; fleetIndex++) {
out.push([]);
}
for(var fleetIndex = 0; fleetIndex < maxFleet; fleetIndex++) {
for(var f = 0; f < fleets.length; f++) {
out[fleetIndex + 2].push(fleets[f][fleetIndex] || "");
}
}
return out;
}
对于基于公式的方法,请尝试输入 E1
=ArrayFormula(transpose({A2:A,D2:D,B2:B, IFERROR(TRIM(REGEXEXTRACT(","&C2:C,"^"&REPT(",+[^,]+",COLUMN(OFFSET(A1,,,1,30))-1)&",+([^,]+)")))}))
如果您真的不需要包含在所需结果中的空白行,请将上面的内容更改为
=ArrayFormula(transpose({A2:B,IFERROR(TRIM(REGEXEXTRACT(","&C2:C,"^"&REPT(",+[^,]+",COLUMN(OFFSET(A1,,,1,30))-1)&",+([^,]+)")))}))
在 Google 表格上创建了一个用于视频游戏的表格,以跟踪小组活动的参与情况。我想将 C 列中的数据拆分并转置到多个列中,但找不到不需要我自己手动跨列扩展公式的解决方案。
这是我想要做的事情的一个例子: Desired Result
从F列开始,第1行是时间戳,第3行是舰队指挥官,第4行及以后是舰队成员(如果舰队指挥官也在也可以,但如果可以的话,可以给加分过滤那个人,因为他们也列在第 3 行)。然后,此数据将用于跟踪每个成员随时间的参与情况,以便他们因此获得奖励。
到目前为止,我使用的是 =TRANSPOSE({Form!C2:C})
,然后是 =TRANSPOSE(SPLIT(D4,", ",0))
、=TRANSPOSE(SPLIT(E4,", ",0))
等。不过就像我说的,我不想手动扩展细胞,因为会有很多车队出去(包括我睡着的时候),数据需要尽快更新。
可能有直接电子表格公式的解决方案(我正在考虑 arrayformula 的技巧)但为了简单起见,我会向您推荐一个自定义公式的解决方案(Google Apps 脚本). 所以 here the demo 这里是演示中使用的函数:
function fleetCommander(data) {
var out = [[], []];
var header = data.shift();
var fleets = [];
var maxFleet = 0;
data.map(
function (row) {
if(row[0] == "" ) {return};
var fleet = row[2].split(",");
fleets.push(fleet);
if(maxFleet < fleet.length) { maxFleet = fleet.length;}
out[0].push(row[0]);
out[1].push(row[1]);
}
);
for(var fleetIndex = 0; fleetIndex < maxFleet; fleetIndex++) {
out.push([]);
}
for(var fleetIndex = 0; fleetIndex < maxFleet; fleetIndex++) {
for(var f = 0; f < fleets.length; f++) {
out[fleetIndex + 2].push(fleets[f][fleetIndex] || "");
}
}
return out;
}
对于基于公式的方法,请尝试输入 E1
=ArrayFormula(transpose({A2:A,D2:D,B2:B, IFERROR(TRIM(REGEXEXTRACT(","&C2:C,"^"&REPT(",+[^,]+",COLUMN(OFFSET(A1,,,1,30))-1)&",+([^,]+)")))}))
如果您真的不需要包含在所需结果中的空白行,请将上面的内容更改为
=ArrayFormula(transpose({A2:B,IFERROR(TRIM(REGEXEXTRACT(","&C2:C,"^"&REPT(",+[^,]+",COLUMN(OFFSET(A1,,,1,30))-1)&",+([^,]+)")))}))