我正在尝试使用查询来显示多个Google表格中的数据。我每周制作一张新的工作表,其中有一个特定的工作表名称。 “ 01/13的一周”,“ 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 *")
“ 01/06周”!A:P;“ 01/13周”!A:P
我尝试使用大括号和不使用大括号都没有成功。
我希望工作表能够刷新,并确保它是正确的一天,新工作表名称已填充,查询已更新。
我需要帮助使I1正常工作。数组和查询对我来说是一种新事物,但到目前为止我一直在努力。
如果其中任何一个没有意义,请询问更多详细信息。
答案 0 :(得分:0)
如果您试图更新查询所查看的数据,并且正在为它提供一个字符串,则需要将该字符串放入indirect()函数中。这样会将您的字符串解释为数据引用,并将您的query()指向正确的方向。
为此,您可能会拥有
=QUERY(INDIRECT(I1),"Select *")
答案 1 :(得分: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的第一个参数。
答案 2 :(得分:0)
将INDIRECT
函数粘贴到Google表格中的家伙完全无法理解它的潜力,因此他们不遗余力地对其进行了改进,并涵盖了在这个数组时代至关重要的显而易见的逻辑。 / p>
换句话说,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触发器,或者使用自定义菜单或通过按钮触发的自定义名称(但是无法直接将自定义函数用作公式)