在Google表格中查询和转置数据

问题描述 投票:0回答:1

我有一个看起来像这样的表:

enter image description here

我想每年创建一行而不是每年一列,看起来像这样:

enter image description here

您可以在this google sheets中获得样本数据。

我认为这可能是使用查询或什至制作自定义函数的方法,但是我不知道该怎么做(或者至少要接近)。有什么建议吗?

google-apps-script google-sheets google-sheets-formula google-sheets-query
1个回答
0
投票

我相信您的目标如下。

  • 您希望使用内置函数或自定义函数来实现问题图像中所示表格的转换。

为此,这个答案怎么样?在这个答案中,我想建议使用自定义函数。每个样本脚本都从单元格A2:H6中检索源值。请注意这一点。

模式1:

在此模式中,使用自定义函数将值放入电子表格。请复制以下脚本并将其粘贴到电子表格的脚本编辑器中。在这种情况下,请将自定义函数放到=myFunction1()之类的单元格中。

示例脚本:

function myFunction1() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange("A2:H6").getValues();
  const headers = values.shift().splice(2);
  const res = values.reduce((ar, r) => {
    let temp = r.splice(0, 2);
    for (let i = 0; i < headers.length; i += 2) {
      let h = temp;
      ar.push(h.concat(headers[i].split("Revenues")[1].trim(), r.splice(0, 2)));
    }
    return ar;
  }, []);
  res.unshift(["Company", "Company code", "Year", "Revenues", "Costs"]);
  return res;
}

模式2:

[请将以下脚本复制并粘贴到电子表格的脚本编辑器中。当我看到示例电子表格时,转换后的表中的“收入”和“成本”列具有原始表的单元格坐标。因此,在这种模式下,示例电子表格的目标得以复制。但是,自定义函数不能直接放置公式。因此,在此模式下,此脚本不用作自定义函数。因此,为了对此进行测试,请使用脚本编辑器运行它。

示例脚本:

function myFunction2() {
  // Ref: https://stackoverflow.com/a/21231012/7108653
  const columnToLetter = column => {
    let temp,
      letter = "";
    while (column > 0) {
      temp = (column - 1) % 26;
      letter = String.fromCharCode(temp + 65) + letter;
      column = (column - temp - 1) / 26;
    }
    return letter;
  };

  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange("A2:H6").getValues();
  const headers = values.shift().splice(2);
  const res = values.reduce((ar, r, i) => {
    let temp = r.splice(0, 2);
    for (let j = 0; j < headers.length; j += 2) {
      let h = temp;
      const formulas = [`=${columnToLetter(j + 3)}${i + 3}`, `=${columnToLetter(j + 4)}${i + 3}`];
      ar.push(h.concat(headers[j].split("Revenues")[1].trim(), formulas));
    }
    return ar;
  }, []);
  res.unshift(["Company", "Company code", "Year", "Revenues", "Costs"]);
  sheet.getRange(23, 1, res.length, res[0].length).setValues(res);
}
  • 在此脚本中,当使用脚本编辑器运行myFunction2的功能时,结果值是从单元格“ A23”中放入的。

注意:

  • 如果您不想放置标题行,请删除res.unshift(["Company", "Company code", "Year", "Revenues", "Costs"]);
  • 请在V8中使用这些脚本。

参考:

© www.soinside.com 2019 - 2024. All rights reserved.