Google表格将多行单元格拆分为新行(+重复的周围行条目)


14

我正在编译一个企业地址信息数据库,其中包括每个企业的关键人员。我为该项目继承的Google电子表格包含“关键人员”列(在B列中),在同一单元格中列出了多个关键人员名称,并用换行符分隔(即CHAR(10))。每行有一项业务。“关键人员”单元格中的行数逐行变化。我的初始工作表如下所示:

在此处输入图片说明

我需要执行以下操作来优化此工作表:

  1. 拆分每个多行“关键人员”单元格,以便每个关键人员名称出现在其自己的行中。这要求将新行插入到原始行的下方。
  2. 复制原始行中所有其他单元格的数据(即A和C:E列中的数据),以便每个新行都包含每个业务的完整数据
  3. 我需要一个自动化流程-我将要处理约1000个业务,因此无法通过任何手动步骤进行操作

工作表应如下所示:

在此处输入图片说明

使用=TRANSPOSE(SPLIT(B1,CHAR(10)))显然显然只是其中的一部分-它不会插入新行,也不会复制周围的列条目。所有帮助深表感谢!


Answers:


14

首先,很抱歉您的回答很晚,但是我有一个解决方案供您使用。

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

解释

该脚本将评估每一行,尤其是每一行的第二列(在JavaScript数组中,该字段基于零,因此列2对应于该数组的索引1)。它将那个单元格的内容分成多个值,并使用"\n"作为定界符(换行)。之后,它将现有信息添加到数组中,并且仅添加单个结果,当它达到索引1(时k == 1)。新准备的行将被添加到另一个数组中,将返回该行以显示结果。

屏幕截图

数据
在此处输入图片说明

结果
在此处输入图片说明

我为您创建了一个示例文件:将多行单元格插入新行
在“ 工具”>“脚本编辑器”下添加脚本,然后按“保存”按钮。


2
太棒了太棒了-给这个男人买啤酒!非常感谢Jacob,这正是我所需要的。
柯克标签2014年

2
以及如何定义范围?(得到此消息“无法从未定义中读取属性“长度””谢谢!
2013年

在非常大的文件上,这可能会失败...结果太大。
凯尔·彭内尔

精彩回答,只有一个错误。给定范围内的第一列不应包含定界符。临时解决方法是将序列号或静态值作为第一列。没有尝试过,但是第一个空白列也可以解决问题。
Ashish Singh

3

可重复的解决方案将需要一个脚本。

但是,只需一次即可,您可以使用 =SPLIT(B3,CHAR(10))。这将在并排的帮助器列中为您提供所有人员的姓名,如下所示:

在此处输入图片说明

特殊复制/粘贴,重视辅助列的内容。

对于使用的每个帮助程序列(希望不要太多,'希望您在任何一家公司中都没有太多人),将行块手动复制并粘贴到当前块的末尾。(这不是一个很好的描述,但您会感到不安。)


嗨,玛丽,谢谢,但我需要个人。人员名称放入新的ROWS(自动生成额外的行以容纳它们),然后将周围的信息复制到新的“人员”单元格旁边。而且我需要100%自动化的流程-我无法为大约一千家企业手动进行此操作!
柯克标签

您无需为整个数千个企业执行手动步骤。您只需要为与任何一家企业相关联的最多人做事即可:例如,如果一家企业有六个人,那么将创建六个新的帮助者列,因此您必须手动复制粘贴六次,每列一次。
2014年

1
有人可以为此编写脚本(我不是那个人!)-但实际上,花费在测试它上的时间可能要比手动花费的时间更长。
2014年

2

对于可能不会立即掌握如何在接受的答案中使用有用的自定义功能的人们:

  • 您需要一张以上的纸,在示例中,两张纸是DATARESULTRESULT在运行查询之前,该工作表为空。您可以DATA在Jacob的屏幕快照中看到查询表。

  • 您很可能需要修改第k8行的比较值,该比较值指向应在其中找到要解析的数据的列。在第4行的第二个数组值中需要输入相同的数字。

  • 您可能需要修改当前第4行上的定界符 \n

为了使这一切变得轻松,我采用了相同的代码,并将定界符目标列提取到函数顶部设置的变量中。正如Jacob提到的,目标列数从0开始作为第一个数字。

function result(range) {
  delimiter = ", "
  targetColumn = 10

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

参考文献


1
如果我运行代码,则显示:TypeError:无法从未定义中读取属性“ length”。非常感谢。答案应该在这里:答案必须在这里的某个地方(developers.google.com/apps-script/reference/spreadsheet / ...)但是我仍然遇到相同的错误。
user2060451

@ user2060451此答案上的解决方案显示了自定义函数的代码,并非旨在从脚本编辑器中运行它。我添加了指向Google自定义功能指南的链接。
鲁本
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.