Google sheets Google Sheets GROUPBY查询,将值组合到一个单元格中以满足分组列的要求

Google sheets Google Sheets GROUPBY查询,将值组合到一个单元格中以满足分组列的要求,google-sheets,google-sheets-formula,Google Sheets,Google Sheets Formula,对不起,这个标题让人困惑,我不知道该如何最好地描述它。我附上了截图来澄清。请注意,由于敏感信息,我已删除了第一列。可以假定第一列中的所有值都相同。 我所拥有的是: 我想要的结果如下: 很明显,在本例中,我手动执行此操作是为了显示我正在寻找的结果,但我希望它按SKU分组,其中物种、形状和大小相同。这意味着将对总净重和单位数量列进行汇总。问题是“日期”栏。我希望它显示分组列中的所有日期。我还希望它能在“Case type”和“Location”列中这样做 作为参考,这里是我一直使用的查询,没有达到

对不起,这个标题让人困惑,我不知道该如何最好地描述它。我附上了截图来澄清。请注意,由于敏感信息,我已删除了第一列。可以假定第一列中的所有值都相同。 我所拥有的是:

我想要的结果如下:

很明显,在本例中,我手动执行此操作是为了显示我正在寻找的结果,但我希望它按SKU分组,其中物种、形状和大小相同。这意味着将对总净重和单位数量列进行汇总。问题是“日期”栏。我希望它显示分组列中的所有日期。我还希望它能在“Case type”和“Location”列中这样做

作为参考,这里是我一直使用的查询,没有达到这个结果(它只是删除了日期列)。正如我之前提到的,由于敏感信息,我已删除了第一列。您可以假设第一列中的所有值都相同:

=QUERY({IMPORTRANGE(“我的URL在这里”,“最终库存”!A3:K”),“选择Col1,Col3,Col4,Col5,Col6,SUM(Col8),Col9,Col10,其中Col1''按Col1,Col3,Col4,Col5,Col6,Col8,Col9,Col10标签SUM(Col8')分组)

我并不特别喜欢这种方法。如果有更好的方法可以做到这一点,通过一个不同的查询或应用程序脚本,我很乐意使用,那将非常有用

编辑:为了澄清这一点,数据经常更新,我正在寻找一种在数据更新时自动更新的解决方案。我需要的基本上就是电源表“合并和合并”功能的行为,但我需要它在数据更改时自动更新,电源表功能在其中创建静态表。

解决方案: 您可以使用应用程序脚本执行以下操作:

  • 使用从源代码表(在下面的示例中称为
    source
    )获取数据
  • 获取
    客户
    品种
    表单
    大小
    SKU
    的独特组合。这将需要仅从这些行中检索这些值,使用,然后从生成的二维数组中删除所有重复数组(例如,请参见)。结果数组(
    grups
    在下面的示例中)将包含
    Customer
    Species
    Form
    Size
    SKU
    的所有独特组合
  • 遍历唯一的组合,对于每个组合,使用以下命令从原始数据中检索与该组合匹配的行(
    groupRows
  • groupRows
    上使用,将
    单位
    重量
    相加,并将不同的
    日期
    案例类型
    位置
    添加到相同的值
  • 从结果数组中删除重复的
    日期
    案例类型
    位置
    (称为
    groupedData
    )。有关如何从数组中删除重复值的信息,请参见
  • 使用或使用
    returngroupeddata将数据写入目的地工作表(以下示例中称为
    destination
代码段: 输出:

当涉及大量数据但仅附上屏幕截图时,人们很可能不会提供帮助。这就像要求他们创建一张他们需要自己填写的表格(复制屏幕截图的数据),然后找到解决方案。请让人们更容易帮助你。您始终可以创建一张人们可以访问和使用的虚拟数据表。通过这样做,人们将更愿意提供帮助。我同意@Nabnub的观点,如果您提供一个包含虚拟数据的电子表格,人们可以使用它来制定解决方案,那么您就更有可能获得帮助。@Nabnub我添加了一个类似于this@CarolineRaiford这意味着第一列值不是日期而是字符串,因此,无需使用
实用程序.formatDate
。此外,您还可以通过添加行
returngroupeddata使其成为一个自定义函数在代码的末尾,删除与
目的地
工作表和
设置值
相关的行,并在工作表中调用
=myFunction()
。我编辑了我的代码片段以反映所有这些更改。@CarolineRaiford我在您现在提供的示例表中看到,源数据中还有一行和一列。在本代码开头检索源值时,应根据此修改索引。我猜索引应该是
getRange(3,2,sourceSheet.getLastRow()-2,sourceSheet.getLastColumn()-1
。我希望这不是您之前遇到错误的原因,因为如果是这样的话,我必须回滚上次编辑的一部分:)嗨,我尝试在工作表中进行这些更改,但现在工作不正常-没有分组日期,“案例类型”列出现错误,位置数据未显示。你介意再看一下我附上的那张纸吗?非常接近,谢谢你的帮助。我很抱歉,我不是一个更精通,能够更好地调整自己,但我正在努力@你好!这非常有用。当我运行它时,我得到以下错误:异常:参数(String,String,String)与Utilities.formatDate的方法签名不匹配。你能帮忙吗?还有,这只有在我运行它时才起作用吗?数据不断更新,我需要主数据表来跟上它。嗨@CarolineRaiford,考虑到你接受了这个答案,你能解决你上次评论中提出的问题吗?
// Copyright 2021 Google LLC.
// SPDX-License-Identifier: Apache-2.0

function myFunction() {
  const ss = SpreadsheetApp.getActive();
  const sourceSheet = ss.getSheetByName("Source");
  const sourceValues = sourceSheet.getRange(3,1,sourceSheet.getLastRow() - 2, sourceSheet.getLastColumn()).getValues(); // Get source data
  const groups = sourceValues.map(row => { // Get unique combinations
    return JSON.stringify([row[0]].concat(row.slice(2,5)).concat(row[8]));
  }).reverse().filter((e, i, a) => a.indexOf(e, i + 1) === -1)
    .reverse().map(JSON.parse);
  let groupedData = groups.map(group => {
    const groupRows = sourceValues.filter(row => { // Get matching rows
      return JSON.stringify([row[0]].concat(row.slice(2,5)).concat(row[8])) === JSON.stringify(group);
    });
    return groupRows.reduce((acc, current) => { // Adding the values from same combination
      const date = acc[1] === "" ? current[1] : acc[1] + "\n" + current[1];
      const caseType = acc[5] === current[5] ? acc[5] : acc[5] + "\n" + String(current[5]);
      const location = acc[11] === "" ? current[11] : acc[11] + "\n" + current[11];
      const unit = Number(acc[6]) + Number(current[6]);
      const weight = Number(acc[7]) + Number(current[7]);
      const comments = acc[10] + "\n" + current[10];
      return [group[0], date, ...group.slice(1,4), caseType, unit, weight, group[4], current[9], comments, location];
    }, Array(12).fill(""));
  });
  groupedData.forEach(row => { // Removing duplicate dates, case types, locations
    row[1] = [...new Set(row[1].split("\n"))].join("\n");
    row[5] = [...new Set(row[5].split("\n"))].join("\n");
    row[11] = [...new Set(row[11].split("\n"))].join("\n");
  });
  return groupedData;
}