使用查询组合不断变化的选项卡列表中的数据
Use query to combine data from ever-changing tab list
我正在构建一个 Sheet,它将从其他选项卡中获取导入的数据并将其合并为一个摘要 sheet,供我在其他地方使用。问题是,tabs会按月导入,所以很快就会有几十个,不想每个月都编辑查询功能。它们都将具有相同的命名格式,但我想知道是否有人知道如何使用我可以从另一个单元格中提取的 sheet 名称的变量来制定查询。例如,我可以将选项卡名称导入另一行,并让查询从该行中提取 sheet 名称,但我不熟悉如何执行此操作。这是我在类似 sheet:
中使用的查询公式的示例
=QUERY({'2019 TEAM SALES'!A2:ZY; '2020 TEAM SALES'!A2:ZY}, "select * Where Col1 is not null",1)
有了这个,一年更新一次没什么大不了的。但是这个新的 sheet 将是月度的,因此在短短几个月内就会变得笨拙。有没有办法使用查询通过单元格信息获取 sheet 名称?就像在第 1 行中,我将 sheet 名称与范围连接起来,以便 A1 包含“'2019 TEAM SALES'!A2:ZY” 以及 B1 中的下一个等等,然后查询公式为:
=QUERY(A1:ZZ1, "select * Where Col1 is not null",1)
这样一来,它将始终拉入合并所需的所有当前选项卡。
顺便说一下,我愿意使用其他公式甚至脚本来完成这项工作,因为这是我追求的结果,而不是方法。
我已经看到很多类似于 here 的答案,但这仍然强制使用非常长的公式,我认为这不是很有效,因为这个 sheet 最终将有 50或其中的更多标签。
感谢您的任何见解!
解决方案
为了在公式中使用单元格值(您的变量)以自动执行整个操作,您可以使用公式 indirect,它允许您在公式中使用单元格值。因此,你最终会得到这样的结果:
=QUERY({INDIRECT(A1);INDIRECT(A1)}, "select * Where Col1 is not null",1)
其中 A1
是包含 2019 TEAM SALES!A2:Y2
的单元格
希望对您有所帮助。让我知道您是否需要其他任何东西或者您不明白什么。 :)
提前3个月生成从开始日期到今天的工作表列表:
=ARRAYFORMULA(UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm")))
正在将其转换为查询范围:
=ARRAYFORMULA("INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C"")")
为避免尚不存在的工作表可能出现的错误:
=ARRAYFORMULA("IFERROR(INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C""), {"&
TEXTJOIN(",", 1, SPLIT(REPT("""""♥", COLUMNS(A:C)), "♥"))&"})")
接下来我们加入它来为查询创建一个参考:
=ARRAYFORMULA("{"&TEXTJOIN("; ", 1,
"IFERROR(INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C""), {"&
TEXTJOIN(",", 1, SPLIT(REPT("""""♥", COLUMNS(A:C)), "♥"))&"})")&"}")
然后我们可以构建我们的查询:
={""; ARRAYFORMULA("=QUERY({"&TEXTJOIN("; ", 1,
"IFERROR(INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C""), {"&
TEXTJOIN(",", 1, SPLIT(REPT("""""♥", COLUMNS(A:C)), "♥"))&"})")
&"}, ""select Col1,Col2 where Col3 is not null"", 0)")}
通过这种方式,我们将查询公式生成为 G2 中的字符串,因此下一步是每月手动将其复制粘贴到您需要的位置,或者您可以使用脚本自动复制 G2 的内容并自动-在任何更改时将其粘贴到您需要的位置,这样您就不需要再触摸它了
function onEdit() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1'); // sheet name
var src = sheet.getRange("G2"); // cell which holds the formula
var str = src.getValue();
var cell = sheet.getRange("G10"); // cell where I want the results
cell.setFormula(str);
}
spreadsheet demo
我正在构建一个 Sheet,它将从其他选项卡中获取导入的数据并将其合并为一个摘要 sheet,供我在其他地方使用。问题是,tabs会按月导入,所以很快就会有几十个,不想每个月都编辑查询功能。它们都将具有相同的命名格式,但我想知道是否有人知道如何使用我可以从另一个单元格中提取的 sheet 名称的变量来制定查询。例如,我可以将选项卡名称导入另一行,并让查询从该行中提取 sheet 名称,但我不熟悉如何执行此操作。这是我在类似 sheet:
中使用的查询公式的示例=QUERY({'2019 TEAM SALES'!A2:ZY; '2020 TEAM SALES'!A2:ZY}, "select * Where Col1 is not null",1)
有了这个,一年更新一次没什么大不了的。但是这个新的 sheet 将是月度的,因此在短短几个月内就会变得笨拙。有没有办法使用查询通过单元格信息获取 sheet 名称?就像在第 1 行中,我将 sheet 名称与范围连接起来,以便 A1 包含“'2019 TEAM SALES'!A2:ZY” 以及 B1 中的下一个等等,然后查询公式为:
=QUERY(A1:ZZ1, "select * Where Col1 is not null",1)
这样一来,它将始终拉入合并所需的所有当前选项卡。 顺便说一下,我愿意使用其他公式甚至脚本来完成这项工作,因为这是我追求的结果,而不是方法。
我已经看到很多类似于 here 的答案,但这仍然强制使用非常长的公式,我认为这不是很有效,因为这个 sheet 最终将有 50或其中的更多标签。 感谢您的任何见解!
解决方案
为了在公式中使用单元格值(您的变量)以自动执行整个操作,您可以使用公式 indirect,它允许您在公式中使用单元格值。因此,你最终会得到这样的结果:
=QUERY({INDIRECT(A1);INDIRECT(A1)}, "select * Where Col1 is not null",1)
其中 A1
是包含 2019 TEAM SALES!A2:Y2
希望对您有所帮助。让我知道您是否需要其他任何东西或者您不明白什么。 :)
提前3个月生成从开始日期到今天的工作表列表:
=ARRAYFORMULA(UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm")))
正在将其转换为查询范围:
=ARRAYFORMULA("INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C"")")
为避免尚不存在的工作表可能出现的错误:
=ARRAYFORMULA("IFERROR(INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C""), {"&
TEXTJOIN(",", 1, SPLIT(REPT("""""♥", COLUMNS(A:C)), "♥"))&"})")
接下来我们加入它来为查询创建一个参考:
=ARRAYFORMULA("{"&TEXTJOIN("; ", 1,
"IFERROR(INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C""), {"&
TEXTJOIN(",", 1, SPLIT(REPT("""""♥", COLUMNS(A:C)), "♥"))&"})")&"}")
然后我们可以构建我们的查询:
={""; ARRAYFORMULA("=QUERY({"&TEXTJOIN("; ", 1,
"IFERROR(INDIRECT("""&UNIQUE(TEXT(ROW(INDIRECT(
DATEVALUE("2020-4-1")&":"&
DATEVALUE(TODAY()+90))), "yyyy mmmm"))&"!A:C""), {"&
TEXTJOIN(",", 1, SPLIT(REPT("""""♥", COLUMNS(A:C)), "♥"))&"})")
&"}, ""select Col1,Col2 where Col3 is not null"", 0)")}
通过这种方式,我们将查询公式生成为 G2 中的字符串,因此下一步是每月手动将其复制粘贴到您需要的位置,或者您可以使用脚本自动复制 G2 的内容并自动-在任何更改时将其粘贴到您需要的位置,这样您就不需要再触摸它了
function onEdit() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1'); // sheet name
var src = sheet.getRange("G2"); // cell which holds the formula
var str = src.getValue();
var cell = sheet.getRange("G10"); // cell where I want the results
cell.setFormula(str);
}