如何使用具有多个条件的命名范围对多个工作表求和?
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 个空单元格 {"","","",""}
我相信我想做的事情在 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 个空单元格 {"","","",""}