表格:将单列转置为多行

时间:2017-06-12 15:39:21

标签: google-apps-script google-sheets

我试图在Google表格中获取一行数据并将其转换为新工作表中的多行。 See example spreadsheet。每行应包含一个产品的文件名。可以通过唯一的十六进制产品ID(文件名的前四个字符)来区分产品。

我认为如果可以这样做,它将使用ARRAYFORMULA和TRANSPOSE的组合来完成,但我想知道它是否真的可以用标准的Sheets公式完成。

我要粘贴的文件名列表在产品之间总是有空行,因此任何公式/脚本都可以使用空白行或4个字符的ID来确定何时创建新行。

2 个答案:

答案 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公式,以避免在空行中出错。