将多行单元格拆分为不同的行

7

我有一个脚本,其中包含一个函数,它会遍历 Google 电子表格中一系列行,并将第 F 列中的多行单元格拆分成多个行。然后,它会复制同一行中其他列中的单元格到新创建的行中。以下是我的意思的示例。

函数运行的范围如下:

enter image description here

该函数运行并产生以下结果:

enter image description here

作为您可以看到的,第一张图片中,F列中的某些单元格有多行。该函数检测到这些内容,并将其拆分为与换行符相同数量的行,然后复制其他列中剩余的单元格。对于“John Doe”和“Candice Len”,F列都有多行条目,因此在函数运行后,这两个名称都获得了与F列地址相同的行数。
我使用的函数如下:(在函数中,F列的索引为5)
    function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][5].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 5) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

这个工作很好。但是,我希望该函数能够处理F列以外的其他列。因此,如果我有其他具有多行条目的列,我希望该函数可以运行通过行,将多行单元格拆分为与换行符相同数量的行,并将单元格的内容复制到新创建的行中的剩余列中。下面是一个示例,其中E列和F列都有多行条目。
如果我有这样的东西:

enter image description here

我希望这个函数能把它转换成这样:

enter image description here

在这种情况下,需要注意每一行都必须有相同数量的换行符,以便多行单元格中的不同行可以与不同列中的相应行进行映射。换句话说,以最后两张截图为例,在“John Doe”条目中,“San Francisco”必须结束于与“address1”相同的行,“Cincinnati”必须结束于与“address2”相同的行。对于“Candice Len”条目,“Washington”、“Phoenix”、“address1”和“address2”也是如此。 列E和F只是示例。脚本必须遍历超过两个列的多行单元格。 我该如何更改脚本,使其能够对其他列执行相同的操作,而不仅仅是F列?
非常感谢。
2个回答

4
这个示例脚本怎么样?我认为有一些方法可以实现你想要的。所以请把这个视为其中之一。为了达到你的情况,我将脚本分成了三个部分。
流程:
1. 解析每个单元格。
- 这可以在脚本中的中看到。
2. 使用解析后的单元格创建每个单元格。
- 这可以在脚本中的中看到。
3. 创建输出单元格。
- 这可以在脚本中的中看到。
示例脚本:
// Main of this script.
function result(range) {
  var output = [];
  for (var i in range) {
    var celLen = 1;
    var c1 = range[i].map(function(e, i){
      var cell = e.toString().split("\n"); // Modified
      var len = cell.length;
      if (len == 1) {
        return cell[0];
      } else if (len > 1) {
        celLen = celLen > len ? celLen : len;
        var t2 = [];
        for (var k=0; k<cell.length; k++) {
          t2.push(cell[k]);
        }
        return t2;
      }
    });
    var c2 = c1.map(function(e, i){
      var r = [];
      if (!Array.isArray(e)) {
        for (var k=0; k<celLen; k++) {
          r.push(e);
        }
      } else {
        for (var k in e) {
          r.push(e[k]);
        }
        if (e.length < celLen) {
          for (var m=0; m<celLen - e.length; m++) {
            r.push("");
          }
        }
      }
      return r;
    });
    var c3 = c2[0].map(function(e, i){return c2.map(function(f, j){return c2[j][i]})});
    Array.prototype.push.apply(output, c3);
  }
  return output;
}

// For testing this script.
function main() {
  var ss = SpreadsheetApp.getActiveSheet();
  var data = ss.getDataRange().getValues();
  var r = result(data);
  ss.getRange(ss.getLastRow() + 1, 1, r.length, r[0].length).setValues(r);
}

示例结果:

输入:

在此输入图像描述

输出:

在此输入图像描述

注意:

  • 在此示例脚本中,您可以自由增加列。
  • 为了解析每个单元格的值,使用了\n
  • 我不确定您的情况是否有其他模式。因此,我准备了这个样本脚本来假设一些情况。请确认样本结果。

如果我误解了您的问题,请告诉我。我会进行修改。


嗨,Tanaike,非常感谢您的帮助! 我尝试运行您的脚本,但总是收到错误消息:"TypeError: Cannot find function split in object 0. (line 7, file "Split")"。您有什么想法我可能做错了什么吗?我已经尝试将“function main()”中的“var data = ss.getDataRange().getValues();”更改为“var data = ss.getActiveRange().getValues();”,然后函数运行,但只有A1单元格上的标题被粘贴在下面。 - franciscofcosta
@franciscofcosta 很抱歉给你带来不便。在我的环境中,“ss.getActiveRange().getValues();”也可以工作。所以你能分享一份有关你情况的示例表格吗?有了示例表格,可以更容易地消除错误。 - Tanaike
当然 - 谢谢。您可以在此处找到示例表格:https://docs.google.com/spreadsheets/d/1J_x-fYDnUFKwrYEu9tZz7DRcoP1Rz1KpDTtROoc1WOw/edit?usp=sharing - franciscofcosta
1
@franciscofcosta 很高兴您的问题得到了解决。我也可以从您的问题中学到东西。谢谢你。 - Tanaike
1
@franciscofcosta 对于造成的不便我感到抱歉。如果我的回答有问题,请告诉我。我愿意学习并解决它们。 - Tanaike
显示剩余8条评论

2

试试这个:

  function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][4].split("\n"); 
    var s1 = range[i][5].split("\n");    
  for(var j=0, jLen=s.length; j<jLen; j++) {
    var output1 = []; 
    for(var k=0, kLen=range[0].length; k<kLen; k++) {
  if(k == 4 ) {
      output1.push(s[j]);
      output1.push(s1[j]); 
      k=k+1
    } 
    else {
      Logger.log(k)
      output1.push(range[i][k]);
    }
  }
  output2.push(output1);
}}
  return output2;
}

非常感谢Ed Nelson。当我只有两列超过一行时,脚本运行得非常完美。我应该如何更改它才能拥有3或4列的换行符?谢谢! - franciscofcosta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接