如何在 Google 表格中创建多个工作表引用的 INDIRECT 数组字符串?

Posted

技术标签:

【中文标题】如何在 Google 表格中创建多个工作表引用的 INDIRECT 数组字符串?【英文标题】:How to create INDIRECT array string of multiple sheet references in Google Sheets? 【发布时间】:2019-01-15 05:53:17 【问题描述】:

我正在尝试使用查询来显示来自多个 Google 表格的数据。我每周制作一张具有特定工作表名称的新工作表,例如Week of 01/13Week of 01/06 等等。

以下是我的想法产生的参考:

我有一个使用COUNTA(INDIRECT("'" & A5 & "'!E4:E",true) 的摘要表

A5 是一个单元格,它连接日期和单词以复制 工作表名称。

直到B5<=today() 才会填充汇总表上的行

所以我可以将它设置为忘记它,并且工作表将继续 随着时间的推移,给我我的每周数据并保持床单干净 直到一周到来。

长话短说,我使用了一个查询,它通过特定参数为我提供了我需要的所有数据,但我必须每周使用新的工作表名称手动更新数据语法数组。

=QUERY('Week of 01/13'!A:P;'Week of 01/06'!A:P;'Week of 12/30'!A:P;'Week of 12/23'!A:P;'WEEK OF 12/16'!A:P;'WEEK OF 12/09'!A:P;'WEEK OF 12/02'!A:P;'WEEK OF 11/25'!A:P;'WEEK OF 11/18'!A:P;'WEEK OF 11/11'!A:P;'WEEK OF 11/04'!A:P;'WEEK OF 10/28'!A:P;'WEEK OF 10/21'!A:P;'WEEK OF 10/14'!A:P;'WEEK OF 10/07'!A:P;'WEEK OF 09/30'!A:P;'WEEK OF 09/23'!A:P;'WEEK OF 09/16'!A:P;'WEEK OF 09/09'!A:P;'WEEK OF 09/02'!A:P,
 "Select * where Col11 = 'RD' order by Col2 desc",0)

我想构建一个对数组的引用,该数组将根据日期自动填充串联。

使用下面的代码,我可以让连接给我我需要的数组,

=if(H4<=today(),CONCATENATE("'",H$1,text(H4,"mm/dd"),"'!A:P;",),"")

但是当我尝试将它输入到查询函数中时,它只会返回连接的文本:

=QUERY(I1,"Select *")

 

'Week of 01/06'!A:P;'Week of 01/13'!A:P

我试过带和不带大括号都没有成功。

我希望工作表能够刷新并查看它是正确的日期,填充新工作表名称并更新查询。

我需要帮助以使 I1 正常工作。

Link to Test Query Sheet

【问题讨论】:

我添加了一张测试表,以便对我正在尝试做的事情有基本的了解 【参考方案1】:

INDIRECT 函数复制粘贴到 Google 表格中的家伙完全不了解它的潜力,因此他们零努力改进它并涵盖了在这个数组时代至关重要的明显逻辑。

换句话说,INDIRECT不能摄入多个数组:

=INDIRECT("Sheet1!A:B"; "Sheet2!A:B")

也不将数组字符串转换为活动引用,这意味着任何连接的尝试也是徒劳的:

=INDIRECT(MasterSheet!A1:A10)
————————————————————————————————————————————————————————————————————————————————————
=INDIRECT("Sheet1!A:B; Sheet2!A:B")
————————————————————————————————————————————————————————————————————————————————————
=INDIRECT("Sheet1!A:B"; "Sheet2!A:B")
————————————————————————————————————————————————————————————————————————————————————
=INDIRECT("INDIRECT("Sheet1!A:B"); INDIRECT("Sheet2!A:B")")

唯一可能的方法是在每个范围的每一端使用INDIRECT,例如:

=INDIRECT("Sheet1!A:B"); INDIRECT("Sheet2!A:B")

这意味着您能做的最好的事情就是像这样预编程您的数组,如果只有部分工作表/选项卡存在(让我们有一个场景,其中只有 2 个工作表是从共 4):

=QUERY(
 IFERROR(INDIRECT("Sheet1!A1:B5"), "",""); 
  IFERROR(INDIRECT("Sheet2!A1:B5"), "",""); 
  IFERROR(INDIRECT("Sheet3!A1:B5"), "",""); 
  IFERROR(INDIRECT("Sheet4!A1:B5"), "",""), 
 "where Col1 is not null", 0)

因此,即使工作表名称是可预测的(并非总是如此),像这样对 100 多张工作表进行预编程也会很痛苦(即使有各种偷偷摸摸的方法如何在 30 秒内编写这样的公式)


另一种方法是使用脚本转换字符串并将其作为公式注入

A1 将是处理看起来像真正公式的字符串的公式:

=ARRAYFORMULA("=QUERY("&TEXTJOIN("; ", 1, 
 IF(A3:A<>"", "'Week of "&LEFT(A3:A, 5)&"'!A1:D5", ))&
 ", ""where Col1 is not null"", 1)")

进一步填充 A6:A 将自动扩展字符串

然后此脚本将从 A1 单元格中获取字符串,并将其作为有效公式粘贴到 C5 单元格中:

function onEdit()  
var sheet = SpreadsheetApp.getActive().getSheetByName('Master Sheet');  
var src = sheet.getRange("A1");
var str = src.getValue(); 
var cell = sheet.getRange("C5"); 
cell.setFormula(str);

当然,脚本可以更改为 onOpen 触发器或从自定义菜单或按钮触发的自定义名称(但是不能直接将自定义函数用作公式)

【讨论】:

【参考方案2】:

如果您尝试更新您的查询正在查看的数据并且您正在向它提供一个字符串,您需要将该字符串放入indirect() 函数中。这会将您的字符串解释为数据引用,并将您的 query() 指向正确的方向。

所以你可能有这个

=QUERY(INDIRECT(I1),"Select *")

【讨论】:

我尝试过,但看起来引号使其无效,它会在末尾添加单引号或在开头添加双引号。 您的间接()正在引用 F2,您当前在单元格引用中有错字。 '01/06 周'!A:C; 'Week of 01/13'!A:C'Week of 01/20'!A:C - 您在第二个范围之后缺少分号。

以上是关于如何在 Google 表格中创建多个工作表引用的 INDIRECT 数组字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AppScript 在 BigQuery 中将 Google 工作表持久化为表格

Zapier 从 Tsheets 数据在 Google 表格中创建多行

如何在 iPad 的视图控制器中创建多个表格视图?

当我引用其他表时,如何保存在 Access 2003 中的表单中创建的数据?

无法访问通过 Google 电子表格 API 通过服务帐户创建的工作表

如何在excel中创建表格区域