使用查询组合不断变化的选项卡列表中的数据

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