汇总来自多个工作表的数据
Summarizing data from multiple sheets
我有一个 google sheet 像这个例子来跟踪飞盘高尔夫的分数:
https://docs.google.com/spreadsheets/d/1uxDFXg2kivZWKICeVklugyXH1OWqsq_s5qXZYzgHkt8/edit?usp=sharing
它非常适合跟踪日常分数,但如果在开头有一个 sheet 可以说出每个人的总分,那就太棒了。另请注意,每个 sheet.
中的名称可能不相同
所以在这个例子中,我想要一个新的 sheet 来自动计算其他 sheet 的分数并显示:
Mike 67,71,65
George 83,70
Phillip 79,72,65
John 66,71
Henry 69
我对 excel 公式非常不熟悉,一直在努力开始。任何帮助将不胜感激。
您可以使用 Google Apps 脚本来完成您要查找的内容。该代码的想法是它将遍历您的 Spreadsheet 中的每个 Sheet,收集所有玩家及其所有值,最后创建一个摘要并将其放入 "Summary" sheet(sheet 必须存在于您的 Spreadsheet 中,名称必须完全相同):
function updateSummary() {
var sheets = SpreadsheetApp.getActive().getSheets();
var summarySheet = SpreadsheetApp.getActive().getSheetByName('Summary');
var allScores = {};
for (var i=0; i<sheets.length; i++) {
if (sheets[i].getName() == 'Summary') continue;
var nColumns = sheets[i].getLastColumn();
var names = sheets[i].getRange(1, 1, 1, nColumns).getValues()[0];
var scores = sheets[i].getRange(20, 1, 1, nColumns).getValues()[0];
for (var j=0; j<nColumns; j++) {
var currentName = names[j];
var currentScore = scores[j];
if (!allScores.hasOwnProperty(currentName))
allScores[currentName] = [];
allScores[currentName].push(currentScore);
}
}
summarySheet.clear();
for (var key in allScores) {
var row = [key].concat(allScores[key]);
summarySheet.appendRow(row);
}
}
这将使用给定的数据在 "Summary" Sheet 中创建以下数据:
相反,如果您更喜欢在问题中描述的那样有两列(第二列包含用逗号分隔的每个分数),您只需将上面代码中的最后一个 for 循环替换为下一个:
for (var key in allScores) {
var row = [key].concat(allScores[key].join(','));
summarySheet.appendRow(row);
}
最后,您可以在 "Summary" sheet 中创建一个图像,它可以用作 运行 脚本的按钮。为此:
在您的 Sheet 中,单击插入>图像>图像 over 个单元格。
Select任意图片。
Select 新创建的图像,然后单击图像右上角出现的三点图标。
单击 "Assign script" 并输入函数名称(在本例中为 updateSummary
),然后单击确定。
尝试:
=QUERY(TRANSPOSE({
'MikeGeorgePhillipJohn 121519'!A1:D20,
'MikeGeorgePhillipJohn 122019'!A1:D20,
'MikeJosephPhillipHenry 122719'!A1:D20}),
"select Col1,sum(Col20)
where Col1 is not null
group by Col1
label sum(Col20)''", 0)
=ARRAYFORMULA(SPLIT(TRANSPOSE(QUERY(QUERY(TRANSPOSE({
'MikeGeorgePhillipJohn 121519'!A1:D20,
'MikeGeorgePhillipJohn 122019'!A1:D20,
'MikeJosephPhillipHenry 122719'!A1:D20}),
"select max(Col20)
where Col1 is not null
group by Col20
pivot Col1", 0),,999^99)), " "))
我有一个 google sheet 像这个例子来跟踪飞盘高尔夫的分数:
https://docs.google.com/spreadsheets/d/1uxDFXg2kivZWKICeVklugyXH1OWqsq_s5qXZYzgHkt8/edit?usp=sharing
它非常适合跟踪日常分数,但如果在开头有一个 sheet 可以说出每个人的总分,那就太棒了。另请注意,每个 sheet.
中的名称可能不相同所以在这个例子中,我想要一个新的 sheet 来自动计算其他 sheet 的分数并显示:
Mike 67,71,65
George 83,70
Phillip 79,72,65
John 66,71
Henry 69
我对 excel 公式非常不熟悉,一直在努力开始。任何帮助将不胜感激。
您可以使用 Google Apps 脚本来完成您要查找的内容。该代码的想法是它将遍历您的 Spreadsheet 中的每个 Sheet,收集所有玩家及其所有值,最后创建一个摘要并将其放入 "Summary" sheet(sheet 必须存在于您的 Spreadsheet 中,名称必须完全相同):
function updateSummary() {
var sheets = SpreadsheetApp.getActive().getSheets();
var summarySheet = SpreadsheetApp.getActive().getSheetByName('Summary');
var allScores = {};
for (var i=0; i<sheets.length; i++) {
if (sheets[i].getName() == 'Summary') continue;
var nColumns = sheets[i].getLastColumn();
var names = sheets[i].getRange(1, 1, 1, nColumns).getValues()[0];
var scores = sheets[i].getRange(20, 1, 1, nColumns).getValues()[0];
for (var j=0; j<nColumns; j++) {
var currentName = names[j];
var currentScore = scores[j];
if (!allScores.hasOwnProperty(currentName))
allScores[currentName] = [];
allScores[currentName].push(currentScore);
}
}
summarySheet.clear();
for (var key in allScores) {
var row = [key].concat(allScores[key]);
summarySheet.appendRow(row);
}
}
这将使用给定的数据在 "Summary" Sheet 中创建以下数据:
相反,如果您更喜欢在问题中描述的那样有两列(第二列包含用逗号分隔的每个分数),您只需将上面代码中的最后一个 for 循环替换为下一个:
for (var key in allScores) {
var row = [key].concat(allScores[key].join(','));
summarySheet.appendRow(row);
}
最后,您可以在 "Summary" sheet 中创建一个图像,它可以用作 运行 脚本的按钮。为此:
在您的 Sheet 中,单击插入>图像>图像 over 个单元格。
Select任意图片。
Select 新创建的图像,然后单击图像右上角出现的三点图标。
单击 "Assign script" 并输入函数名称(在本例中为
updateSummary
),然后单击确定。
尝试:
=QUERY(TRANSPOSE({
'MikeGeorgePhillipJohn 121519'!A1:D20,
'MikeGeorgePhillipJohn 122019'!A1:D20,
'MikeJosephPhillipHenry 122719'!A1:D20}),
"select Col1,sum(Col20)
where Col1 is not null
group by Col1
label sum(Col20)''", 0)
=ARRAYFORMULA(SPLIT(TRANSPOSE(QUERY(QUERY(TRANSPOSE({
'MikeGeorgePhillipJohn 121519'!A1:D20,
'MikeGeorgePhillipJohn 122019'!A1:D20,
'MikeJosephPhillipHenry 122719'!A1:D20}),
"select max(Col20)
where Col1 is not null
group by Col20
pivot Col1", 0),,999^99)), " "))