【发布时间】:2016-09-27 06:44:07
【问题描述】:
我有 12 列被公式“IMPORTRANGE”自动填充。
我需要将所有表值整理成一个值(条件是它应该表现得像“ARRAYFORMULA”)。
只是想知道是否为此目的存在任何特定的公式/查询。
我已添加工作表的示例快照。我需要将这些红色突出显示的值放在不同的列中,比如“EF”。
【问题讨论】:
标签: google-apps-script google-sheets
我有 12 列被公式“IMPORTRANGE”自动填充。
我需要将所有表值整理成一个值(条件是它应该表现得像“ARRAYFORMULA”)。
只是想知道是否为此目的存在任何特定的公式/查询。
我已添加工作表的示例快照。我需要将这些红色突出显示的值放在不同的列中,比如“EF”。
【问题讨论】:
标签: google-apps-script google-sheets
我将展示 3 列的示例公式,但您可以对任意数量的列使用相同的逻辑。
公式是
=TRANSPOSE(SPLIT(ARRAYFORMULA(CONCATENATE(TRANSPOSE(FILTER(A2:C,A2:A>0)&"-"))),"-"))
A2:C 是您所有列的范围A2:A>0 是 A 列仅选择适当行的条件。这可能是 A2:A<>"" 用于文本列或任何限制行数的条件。- 是任何不属于原始数据的符号。你可以使用一组符号,甚至是特殊的词来达到同样的目的:=TRANSPOSE(SPLIT(ARRAYFORMULA(CONCATENATE(TRANSPOSE(FILTER(A2:C,A2:A>0)&"devide"))), "devide"))
不连续的列
如果您的数据不是连续的列。
如果是这样,那么你需要将这部分公式FILTER(A2:C,A2:A>0)改为查询:
=query(A:AO;"select A,I,Q,Y,AG,AO... where A > 0")
或者更好:
=query({A:AO};"select Col1, Col6, Col20, Col22, ... where Col1 > 0")
最终的公式如下所示:
=TRANSPOSE(SPLIT(ARRAYFORMULA(CONCATENATE(TRANSPOSE(query({A:AO};"select Col1, Col6, Col20, Col22, ... where Col1 > 0")&"-"))),"-"))
不是连续的列,数据是数字和文字
当您在数据中同时输入数字和文本时,query 将不起作用,因为它在一列中只能处理一种类型的数据。
您的简化案例如下所示:
第一个任务是将名称为“票号”的所有列抓取到一个表中。
让我们在工作表“报告”中工作,使用filter 函数:
=FILTER(Data!1:1001,Data!2:2="Ticket number")
并得到结果:
第二步是实现第一个公式:
=TRANSPOSE(SPLIT(ARRAYFORMULA(CONCATENATE(TRANSPOSE(Report!A3:D&"-"))),"-"))
另一种方法是逐列组合:
={A2:A5;B2:B5;C2:C5}
如果你喜欢这个方法,你可以read more here。
【讨论】:
, 而不是; 来绑定列。
Max 的回答非常好,如果能解决您的问题,我建议您使用它。
如果您想要更多的灵活性,我已经编写了一个名为 Reshape 的库,它允许您按照自己的意愿融合长格式的数据。
你可以运行类似的东西:
=MELT(IMPORTRANGE(<spreadsheet>, "A:DY"), , , , 1)
它将列标题放在自己的列中,以便清楚地识别哪些可能是您想要的,也可能不是您想要的(因为您只谈论将值放入一个列中,这就是该脚本所做的)。查看链接中的两个表格,了解该函数在概念上的作用,看看它是否适合您。
我没有将它作为插件发布到我的网络之外,因此您需要将代码复制并粘贴到您的脚本中
【讨论】: