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

问题描述 投票:6回答:2

我有一个带有函数的脚本,该函数遍历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”和“Cincinnati”在同一行中与“address2”在同一行中结束。对于“Candice Len”条目,“华盛顿”,“凤凰”,“地址1”和“地址2”也是如此。

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

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

非常感谢你。

google-apps-script split google-sheets row
2个回答
3
投票

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

流 :

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

样本结果:

Input :

enter image description here

Output :

enter image description here

注意 :

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

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


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;
}
© www.soinside.com 2019 - 2024. All rights reserved.