代码之家  ›  专栏  ›  技术社区  ›  franciscofcosta

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

  •  7
  • franciscofcosta  · 技术社区  · 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”条目中,“旧金山”必须与“address1”位于同一行,“辛辛那提”必须与“address2”位于同一行。对于“Candice Len”条目,“Washington”、“Phoenix”、“address1”和“address2”也是如此。

    列E和F只是一个示例。脚本必须在两列以上的多行单元格中运行。

    我如何才能更改脚本,使其能够对其他列而不仅仅是F列执行相同的操作?

    非常感谢你。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Tanaike    6 年前

    这个示例脚本怎么样?我认为有一些方法可以实现你想要的。所以请把这看作其中之一。为了实现您的情况,我将脚本分为三部分。

    流量:

    1. 分析每个单元格。
      • 这可以在 c1 在脚本中。
    2. 使用已解析的单元格创建每个单元格。
      • 这可以在 c2 在脚本中。
    3. 创建输出单元格。
      • 这可以在 c3 在脚本中。

    示例脚本:

    // 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);
    }
    

    样本结果:

    输入:

    enter image description here

    输出:

    enter image description here

    注:

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

    如果我误解了你的问题,请告诉我。我想修改它。

        2
  •  2
  •   Ed Nelson    7 年前

    尝试以下操作:

      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;
    }