【问题标题】:Summarizing data from multiple sheets汇总多张工作表中的数据
【发布时间】:2019-12-25 07:43:01
【问题描述】:

我有一个类似这个例子的谷歌表格来跟踪飞盘高尔夫的分数:

https://docs.google.com/spreadsheets/d/1uxDFXg2kivZWKICeVklugyXH1OWqsq_s5qXZYzgHkt8/edit?usp=sharing

它非常适合跟踪日常分数,但如果在开始时有一张单张表可以显示每个人的总分数,那就太棒了。另请注意,每张表中的名称可能不同。

所以在这个例子中,我想要一个新的工作表,它会自动计算其他工作表的分数并显示:

Mike 67,71,65
George 83,70
Phillip 79,72,65
John 66,71
Henry 69

我对 Excel 公式非常不熟悉,并且一直在努力入门。任何帮助将不胜感激。

【问题讨论】:

  • 不是 excel 公式,而是 Google 表格。它们并不完全相同。在这种情况下(无需打开您的项目),您可能需要 TEXTJOIN。
  • 问题1:所有的名字都是已知的吗?问题2:是否所有的表都已经可用了,我的意思是你现在有三个表,但是以后可以添加另一个表,并且在计算总分时也要考虑该表吗?
  • 所有名字都未知,因为可以添加新的工作表并且他们可能有新的人。并且新的工作表也应该添加到摘要页面中。

标签: google-sheets google-sheets-formula transpose google-sheets-query google-query-language


【解决方案1】:

您可以使用 Google Apps 脚本来完成您要查找的内容。代码的想法是它将遍历电子表格中的每个表格,收集所有参与者及其所有值,最后创建一个摘要并将其放入“摘要”表格中(该表格必须存在于您的电子表格中,与严格同名):

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);
  }
}

这将使用给定的数据在“摘要”表中创建以下数据:

相反,如果您更喜欢问题中描述的两列(第二列包含用逗号分隔的每个分数),您只需将上面代码中的最后一个 for 循环替换为以下一个:

for (var key in allScores) {
  var row = [key].concat(allScores[key].join(','));
  summarySheet.appendRow(row);
}

最后,您可以在“摘要”表中创建一个图像,该图像可以用作运行脚本的按钮。这样做:

  1. 在您的工作表中,单击插入>图像>图像覆盖单元格。

  2. 选择您选择的任何图像。

  3. 选择新创建的图片,点击图片右上角的三点图标。

  4. 点击“Assign script”并输入函数名(在本例中为updateSummary),然后点击OK。

【讨论】:

  • 这太好了,不是用结果抓取第 20 行,有没有一种方法可以抓取所有数据,只是在多个工作表中的公共列之间进行简单的连接?
  • 嘿@Datanovice,感谢您的评论。我不确定你这个问题是什么意思。你能再发展一点吗?干杯!
  • 例如this link 我想知道您将如何遍历所有可能的范围并获取列下的所有数据并将其连接到一个工作表中,与此解决方案非常相似,但更改@ 987654327@ 获取所有值而不是第 20 行
  • 这看起来很棒!我去看看
  • 这太棒了!甚至不知道这种功能是可能的,这正是我想要的。谢谢!
【解决方案2】:

尝试:

=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)), " "))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多