Google表格查询数据语法

时间:2019-01-15 05:53:18

标签: google-sheets formula spreadsheet array-formulas google-sheets-formula

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

我想建立一个对数组的引用,该数组将根据一天的时间自动填充连接。

  

Sample structure of reference

使用以下代码,我可以将其连接起来,给我所需的数组,

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

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

=QUERY(I1,"Select *")

“ 01/06周”!A:P;“ 01/13周”!A:P

我尝试使用大括号和不使用大括号都没有成功。

我希望工作表能够刷新,并确保它是正确的一天,新工作表名称已填充,查询已更新。

我需要帮助使I1正常工作。数组和查询对我来说是一种新事物,但到目前为止我一直在努力。

如果其中任何一个没有意义,请询问更多详细信息。

Link to Test Query Sheet

3 个答案:

答案 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);
}

0

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