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)&",+([^,]+)")))}))