我试图在Google表格中获取一行数据并将其转换为新工作表中的多行。 See example spreadsheet。每行应包含一个产品的文件名。可以通过唯一的十六进制产品ID(文件名的前四个字符)来区分产品。
我认为如果可以这样做,它将使用ARRAYFORMULA和TRANSPOSE的组合来完成,但我想知道它是否真的可以用标准的Sheets公式完成。
我要粘贴的文件名列表在产品之间总是有空行,因此任何公式/脚本都可以使用空白行或4个字符的ID来确定何时创建新行。
答案 0 :(得分:2)
正如您所说,这非常适合使用=TRANSPOSE
函数。
使用Range.getValues()
将提供一个二维数组,在代码中转换是很容易的。就像答案here一样。
从那里设置写入范围以匹配转置数组的尺寸,然后Range.setValues()
修改强>
重复所需结果的自定义功能。
/**
* Pivots the list of images by image key
*
* @param {Range} range The range of values. Assumes a column.
* @return The range of results as array per image key
* @customfunction
*/
function PIVOTIMAGES(range) {
var imagesByKey = {};
range
.map(function(d){ return d[0]; }) // assumes single column
.filter(function(d) { return d && d != ''; }) // filters out blank rows
.forEach(function(d){ // arranges all images as an array per key
var key = d.split('_')[0]; // assumes key is always XXX_
if (!imagesByKey[key]) {
imagesByKey[key] = [d];
} else {
imagesByKey[key].push(d);
}
});
return Object.keys(imagesByKey).map(function(key) {
return imagesByKey[key];
});
}
这需要一些工作来处理接收多列信息或信息而不是列,但原则上,这是一个简单的解决方案。
我已将其添加到您的示例表中。例如,将其用作公式=PIVOTIMAGES(A2:A10)
。
答案 1 :(得分:2)
我找到了间接解决方案。它不是很优雅,但它是我能想到的最好的。请在updated example spreadsheet的第三个标签中查看。我也添加了解释性评论。
如果示例电子表格最终失去了时间,这里简要概述了我用于后代的公式。
在新工作表的A栏中,我使用=left(Input!A1,4)
公式重现原始列表中每个文件名的前四个字符。
然后我使用=UNIQUE(FILTER(A:A,A:A<>""))
从新工作表的A列创建了重复数据删除的产品ID列表。
最后,我使用产品ID列表构建了一个FILTER公式,然后我可以转置它以获得我想要的结果:=IF(ISBLANK(A1),"",TRANSPOSE(FILTER(Input!A$1:A,REGEXMATCH(Input!A$1:A,"^"&B1))))
RegEx公式将以(B1)开头的任何内容与单元格B1中的产品ID匹配。我添加了一个ISBLANK
公式,以避免在空行中出错。