如何使用具有多个条件的命名范围对多个工作表求和?

How can I sum across multiple sheets using a named range with multiple conditions?

我相信我想做的事情在 Google 表格公式中应该很简单,但是任何基于 Excel 公式的解决方案都应该很容易转移。

因为会定期添加其他字符,所以我有一个命名范围:“英雄”。

Heroes
Bilbo
Gandalf
Saruman
Wormtongue
Tom Bombadil

对于每个英雄,我在一个整体工作簿中有一个工作sheet。在这些工作sheet 中,有日期、时间、任务和计数的列。每天数次,一位英雄会冒险进行某种类型的任务,并带着一定数量的奖品返回。每个企业都有自己的行,可以按日期和时间区分。例如-:

Date Time Quest Count
12/4 3:00P Ring 9
12/5 8:00A Mordor 6
12/5 4:15P Sting 3

与此同时,我有一个总结工作sheet,我正在手动输入(现在... 帮助创建 =arrayformula() 或等同于获取所有内容的奖励积分unique date/time 每个角色作品的组合sheet) 一个或一批英雄被派往任务的日期和时间。我正在尝试找出公式模板,该模板将在相应行表示的特定日期和时间(从 12/4,3:00P,Ring 开始,计算每个英雄的每个任务类型的计数比如是9,就是当时比尔博的任务奖励;当然其他英雄也都在3:00P出动,导致其他任务有奖励,多个英雄可能会冒险同类型的任何给定时间的任务):

Date Time Ring Sting Mordor Moria
12/4 3:00P 9 3 4 1
12/4 9:30P 1 0 8 0
12/5 8:00A 5 3 6 9
12/5 12:10A 3 1 3 8
12/5 4:15P 4 5 2 5

因为并非摘要中的每个日期和时间 sheet 都会存在于每个英雄的作品中 sheet,我似乎无法使用“SUMIFS”,它的功能是每个 sum_range 和 criteria_range 仅在满足条件时添加到同一行。我认为有一个 SUMPRODUCT() 或 INDEX(MATCH()) 方法可以做到这一点,但是当包括命名范围以跨多个作品阅读时 sheets,在我的修补中只添加了第一个英雄的数字这个。

我正在讨论这里的解决方案。有人喜欢探戈吗?非常感谢!

支持示例工作簿:https://docs.google.com/spreadsheets/d/142IE9r2ip6YHsGdMr-zt_IHd6W7glqUId_UiGQnCUZs/edit?usp=sharing

会这样:

=QUERY({Bilbo!A:D; Gandalf!A:D; Saruman!A:D; Wormtongue!A:D; 'Tom Bombadil'!A:D}, 
 "select Col1,Col2,sum(Col4) where Col1 is not null group by Col1,Col2 pivot Col3", 1)


如果您想要特定的地点顺序,您可以这样做:

=TRANSPOSE(SORT(TRANSPOSE(QUERY(
 {Bilbo!A:D; Gandalf!A:D; Saruman!A:D; Wormtongue!A:D; 'Tom Bombadil'!A:D}, 
 "select Col1,Col2,sum(Col4) where Col1 is not null 
  group by Col1,Col2 pivot Col3", 1)),
 MATCH(FLATTEN(QUERY(QUERY(
 {Bilbo!A:D; Gandalf!A:D; Saruman!A:D; Wormtongue!A:D; 'Tom Bombadil'!A:D}, 
 "select Col1,Col2,sum(Col4) where Col1 is not null 
  group by Col1,Col2 pivot Col3", 1), "limit 0", 1)),
 {"Date"; "Time"; "Ring"; "Sting"; "Mordor"; "Moria"}, ), 1))

或像这样手动操作:

=QUERY(QUERY({Bilbo!A:D; Gandalf!A:D; Saruman!A:D; Wormtongue!A:D; 'Tom Bombadil'!A:D}, 
 "select Col1,Col2,sum(Col4) where Col1 is not null group by Col1,Col2 pivot Col3", 1), 
 "select Col1,Col2,Col5,Col6,Col3,Col4")


如果你想用英雄列表来智胜它......不要。从其他 sheet 引用范围需要使用 INDIRECT。令人惊讶的是,ARRAYFORMULA 不支持 INDIRECT,因此您无法构建数组。此时,您要么重新考虑您的生活选择,要么使用支持此类间接数组的脚本。没有脚本你能做的最好的事情就是像这样硬编码它:

=QUERY({
 INDIRECT(Main!A2&"!A:D"); 
 INDIRECT(Main!A3&"!A:D"); 
 INDIRECT(Main!A4&"!A:D"); 
 INDIRECT(Main!A5&"!A:D"); 
 INDIRECT(Main!A7&"!A:D")}, 
 "select Col1,Col2,sum(Col4) where Col1 is not null 
  group by Col1,Col2 pivot Col3", 1)

和 ofc 只有当 sheet 存在于列表中并且列表不包含空单元格时才有效,否则你会得到 ARRAY 这样的错误,因为 Main!A6 sheet不存在:

所以为了应对它,我们可以用 IFERROR 做一些手部技巧幻灯片,这将使我们不会得到错误,并且仍然使用不存在的 sheet 甚至空单元格,所以我们可以像这样预先编程以备将来添加:

=QUERY({
 IFERROR(INDIRECT(IF(Main!A2="", 0,  Main!A2)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A3="", 0,  Main!A3)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A4="", 0,  Main!A4)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A5="", 0,  Main!A5)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A6="", 0,  Main!A6)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A7="", 0,  Main!A7)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A8="", 0,  Main!A8)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A9="", 0,  Main!A9)&"!A:D"), {"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A10="", 0, Main!A10)&"!A:D"),{"","","",""}); 
 IFERROR(INDIRECT(IF(Main!A11="", 0, Main!A11)&"!A:D"),{"","","",""})}, 
 "select Col1,Col2,sum(Col4) where Col1 is not null 
  group by Col1,Col2 pivot Col3", 1)

注意:范围内的 4 列 A:D = 4 个空单元格 {"","","",""}