在 Google 个工作表中查询和转置数据
Query and transpose data in Google Sheets
我有一个 table,看起来像这样:
我想每年创建一行而不是每年创建一列,如下所示:
您可以在this google sheets中获取示例数据。
我认为这将是使用查询或什至制作自定义函数的东西,但我不知道该怎么做(或至少接近)。有什么建议吗?
我相信你的目标如下。
- 您想使用 built-in 函数或自定义函数实现 table 的转换,如您问题中的图像所示。
为此,这个答案怎么样?在这个答案中,我想建议使用自定义功能。每个示例脚本从单元格 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;
}
模式二:
请将以下脚本复制并粘贴到电子表格的脚本编辑器中。当我看到您的示例电子表格时,转换后的 table 中 "Revenues" 和 "Costs" 的列具有原始 table 的单元格坐标。因此,在此模式中,复制了示例电子表格的目标。但是,自定义函数不能直接放入公式。所以在这个模式中,这个脚本没有被用作自定义函数。因此,为了对此进行测试,请使用脚本编辑器运行。
示例脚本:
function myFunction2() {
// Ref: https://whosebug.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". 单元格
注:
- 如果不想放header行,请去掉
res.unshift(["Company", "Company code", "Year", "Revenues", "Costs"]);
。
- 请在 V8 中使用这些脚本。
参考文献:
我有一个 table,看起来像这样:
我想每年创建一行而不是每年创建一列,如下所示:
您可以在this google sheets中获取示例数据。
我认为这将是使用查询或什至制作自定义函数的东西,但我不知道该怎么做(或至少接近)。有什么建议吗?
我相信你的目标如下。
- 您想使用 built-in 函数或自定义函数实现 table 的转换,如您问题中的图像所示。
为此,这个答案怎么样?在这个答案中,我想建议使用自定义功能。每个示例脚本从单元格 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;
}
模式二:
请将以下脚本复制并粘贴到电子表格的脚本编辑器中。当我看到您的示例电子表格时,转换后的 table 中 "Revenues" 和 "Costs" 的列具有原始 table 的单元格坐标。因此,在此模式中,复制了示例电子表格的目标。但是,自定义函数不能直接放入公式。所以在这个模式中,这个脚本没有被用作自定义函数。因此,为了对此进行测试,请使用脚本编辑器运行。
示例脚本:
function myFunction2() {
// Ref: https://whosebug.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". 单元格
注:
- 如果不想放header行,请去掉
res.unshift(["Company", "Company code", "Year", "Revenues", "Costs"]);
。 - 请在 V8 中使用这些脚本。