google-apps-script - 如何将具有多行的 2 列单元格拆分为唯一的行,同时保留/复制周围的数据?

标签 google-apps-script google-sheets

我正在使用一个有 2 列的工作表,其中的单元格中可能有多行。我试图弄清楚如何同时分割两个单元格(因为它们都应该具有相同数量的行)并为每个新分割维护/复制周围的数据。我已经看到了使用公式和脚本来完成此操作的几种不同方法,如下所示,但这些似乎都只取决于拆分单列单元格,而不是两列。

我的数据集如下,它从表单提交中提取信息,因此我无法更改数据的输入方式,我只需要尝试找出解析数据的最佳方法。理想情况下,两个单元格将具有相同的行,并将在回车符上拆分(我最熟悉使用的 CHAR(10)),我只需要弄清楚同时拆分这两个单元格。我在下面链接的表中整理了一些示例数据。我还提供了一个代码示例,我发现该示例在单列单元格上执行此任务(来自 here ,但相当旧 - 我也不太确定如何修改我的范围以不是示例中的 B 列)

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].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 == 1) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}    

此处提供数据样本:
https://docs.google.com/spreadsheets/d/1edR-pKxx98l01zFE2LBUkWvQJPKQ9IV_LIHieDwf-1I/edit?usp=sharing

任何帮助将不胜感激!

最佳答案

  • 您希望在共享电子表格中实现从 RAW DATA 转换为 DESIRED RESULT
  • 您希望使用自定义函数来实现此目的。

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案之一。

示例脚本:

当使用您的共享电子表格时,请将 =result(A3:E6) 的公式放入单元格中。

function result(values) {
  return values.reduce(function(ar, e) {
    var [colD, colE] = e.slice(-2).map(function(f) {
      return f.split("\n").map(function(g) {return g.split(/\s+/)[1] || g});
    });
    return ar.concat(colD.map(function(f, j) {return e.slice(0, 3).concat([f, colE[j]])}));
  }, []);
}
  • 首先,“D”列和“E”列的值被拆分。
  • 下一步,每行都是根据分割后的值创建的。

结果:

enter image description here

注意:

  • 此示例脚本可用于您的示例电子表格。如果更改值的格式,则脚本可能无法使用。请小心这一点。

引用文献:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

添加:

从您的第二个共享电子表格中,我准备了从 RAW DATA 转换为 DESIRED RESULT 的脚本。我认为“D”列与第二个共享电子表格中的第一个共享电子表格不同。在这种情况下, "1 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="16737b777f7a275665777b667a733875797b" rel="noreferrer noopener nofollow">[email protected]</a>\n2 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fe9b939f9792ccbe8d9f938e929bd09d9193" rel="noreferrer noopener nofollow">[email protected]</a>\n3 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="690c040800055a291a080419050c470a0604" rel="noreferrer noopener nofollow">[email protected]</a>" 需要转换为 BillSteveTed 。但这是不可能的。因此,我使用您的第一个逻辑准备了以下示例脚本。就像 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="37525a565e5b067744565a475b521954585a" rel="noreferrer noopener nofollow">[email protected]</a><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4e2b232f27227c0e3d2f233e222b602d2123" rel="noreferrer noopener nofollow">[email protected]</a><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c2a7afa3abaef182b1a3afb2aea7eca1adaf" rel="noreferrer noopener nofollow">[email protected]</a>

示例脚本:

为了使用此脚本,请将 =result(A3:O6) 放入单元格中。

function result(values) {
  return values.reduce(function(ar, e) {
    var head = e.splice(0, 3);
    var [colD, colE] = e.splice(0, 2).map(function(f) {return f.split("\n").map(function(g) {return g.split(/\s+/)[1] || g})});
    var values = colD.map(function(f, j) {return head.concat([f, colE[j]]).concat(e)});
    return ar.concat(values);
  }, []);
}

关于google-apps-script - 如何将具有多行的 2 列单元格拆分为唯一的行,同时保留/复制周围的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741490/

相关文章:

javascript - 监控 Google 电子表格单元格值并撤消不需要的更改

dom - Google Apps Script 是否有类似 getElementById 的内容?

javascript - D&D 风格的随机机会结果,在按钮点击时带有 if/then 语句 - 老师试图为类做事件

google-sheets - 如何使用 VLOOKUP 格式化结果以在具有任意数量搜索键的单个单元格内循环

google-sheets - 在 Google 表格中提取 '-' 字符后的子字符串

javascript - .setValue() 对 Google Sheets 脚本不一致

regex - 谷歌电子表格 : Any Regex Replace

google-apps-script - 使用Google应用程序脚本开发Gmail插件时,如何将数据安全地存储在Google中?

google-sheets - 计算 Google 表格单元格中的换行符数

javascript - https ://docs. 的请求失败 google.com 返回代码 401 - 从 Google 表格保存并通过电子邮件发送 PDF 文件