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

问题描述 投票:3回答:3

我正在尝试使用查询来显示多个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)

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS92TkNiVC5wbmcifQ==” alt =“参考结构示例>

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

=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

google-apps-script google-sheets google-sheets-formula array-formulas google-sheets-query
3个回答
1
投票

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

因此,您可能会拥有

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

0
投票

如果您确实确实需要使用I1,请尝试以下公式

=QUERY({INDIRECT(INDEX(SPLIT(I1,";"),1,1));INDIRECT(INDEX(SPLIT(I1,";"),1,2))},"Select *")

I2具有返回此值'Week of 01/06'!A:P;'Week of 01/13'!A:P的公式。这是一个文本值,具有两个用分号分隔的范围地址。

以上公式使用SPLIT分隔每个地址,它使用INDEX取相应的部分作为INDIRECT的参数,该参数返回值的数组。这些值数组用于构建另一个值数组,该值用作QUERY的第一个参数。


0
投票

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")}

这意味着您最好的办法是像这样[您的数组,如果只有部分工作表/标签存在的话(让我们来假设在总共4个工作表中仅创建2个工作表) :

=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); }

0

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

© www.soinside.com 2019 - 2024. All rights reserved.