Arrays Google Sheets查询-动态构建引用数组源
我的电子表格中有很多表格,表格1,表格2,表格3。。。我想将它们全部添加到数组中,可能是基于任何调用范围?现在我手动添加它们,如下所示:Arrays Google Sheets查询-动态构建引用数组源,arrays,google-sheets,google-sheets-formula,array-formulas,google-sheets-query,Arrays,Google Sheets,Google Sheets Formula,Array Formulas,Google Sheets Query,我的电子表格中有很多表格,表格1,表格2,表格3。。。我想将它们全部添加到数组中,可能是基于任何调用范围?现在我手动添加它们,如下所示: =query( { INDIRECT("sheet1!$A$3:$V"); INDIRECT("sheet2!$A$3:$V"); INDIRECT("sheet3!$A$3:$V") }; "SELECT Col2, Col3, Col4, ...[etc]") 我想创建任何设置表,并将所有应在数组中的表放在此处,如下所示: =query(
=query(
{
INDIRECT("sheet1!$A$3:$V");
INDIRECT("sheet2!$A$3:$V");
INDIRECT("sheet3!$A$3:$V") };
"SELECT Col2, Col3, Col4, ...[etc]")
我想创建任何设置表,并将所有应在数组中的表放在此处,如下所示:
=query(
{
get_all_sheets_names_from('settings!A1:A100'); // something like this
};
"SELECT Col2, Col3, Col4, ...[etc]")
可能吗
我的尝试:
我希望包含数据源的数组取自G2:G列。
C列中的示例显示了如何手动完成此操作。但是,我正在寻找一种解决方案,以便在查询中不必做任何事情,以便查询可以从G2:G中拖动一个包含数据源名称的数组
我认为不可能在查询参数中使用间接,因为间接返回单元格引用,并且查询中的参数{;}是固定对象。
也不可能对完整查询进行间接查询,原因相同:查询不返回单元格上的引用
2有限公司
原理:案例1:在G列中查看第三行第三个源,如果为空,则测试案例2,否则应用具有三个源的公式
案例2:如果第二个源为空,则转到案例1,否则应用具有两个源的公式
案例1:如果为空,则不显示任何来源,否则应用带有1个来源的公式
公式
注1:将ESTVIDE fr替换为ISBLANK eng!!
注2:您可以使用G2=source1和G3=source2进行测试,
但它适用于G2=source3和G3=source1
=SI(ESTVIDE($G$4); SI(ESTVIDE($G$3); SI(ESTVIDE($G$1); "no source(s)";query({((INDIRECT("'"&G2&"'!A1:A5")))};"SELECT Col1")) ;query({(INDIRECT("'"&G2&"'!A1:A5"));(INDIRECT("'"&G3&"'!A1:A5"))};"SELECT Col1")) ;query({(INDIRECT("'"&G2&"'!A1:A5"));(INDIRECT("'"&G3&"'!A1:A5"));(INDIRECT("'"&G4&"'!A1:A5"))};"SELECT Col1"))
网上表格
局限性
当然,这是一个最多只有3个来源的公式!
它将是非常大和丑陋的更多来源
剧本
宏是唯一的解决方案吗
用宏进行求解
附加此脚本,
它从G2:G30获取值源值您需要更多…放入G100。。
它创建公式并将其放在H2上
它在每个源代码中读取的最大值为50参见源代码中的A1:A50
这并不难理解
注意:使用GSheet管理宏是另一个问题,如果您需要建议,请发表评论
链接到实时工作表:
我怎么想
我认为不可能在查询参数中使用间接,因为间接返回单元格引用,并且查询中的参数{;}是固定对象。
也不可能对完整查询进行间接查询,原因相同:查询不返回单元格上的引用
2有限公司
原理:案例1:在G列中查看第三行第三个源,如果为空,则测试案例2,否则应用具有三个源的公式
案例2:如果第二个源为空,则转到案例1,否则应用具有两个源的公式
案例1:如果为空,则不显示任何来源,否则应用带有1个来源的公式
公式
注1:将ESTVIDE fr替换为ISBLANK eng!!
注2:您可以使用G2=source1和G3=source2进行测试,
但它适用于G2=source3和G3=source1
=SI(ESTVIDE($G$4); SI(ESTVIDE($G$3); SI(ESTVIDE($G$1); "no source(s)";query({((INDIRECT("'"&G2&"'!A1:A5")))};"SELECT Col1")) ;query({(INDIRECT("'"&G2&"'!A1:A5"));(INDIRECT("'"&G3&"'!A1:A5"))};"SELECT Col1")) ;query({(INDIRECT("'"&G2&"'!A1:A5"));(INDIRECT("'"&G3&"'!A1:A5"));(INDIRECT("'"&G4&"'!A1:A5"))};"SELECT Col1"))
网上表格
局限性
当然,这是一个最多只有3个来源的公式!
它将是非常大和丑陋的更多来源
剧本
宏是唯一的解决方案吗
用宏进行求解
附加此脚本,
它从G2:G30获取值源值您需要更多…放入G100。。
它创建公式并将其放在H2上
它在每个源代码中读取的最大值为50参见源代码中的A1:A50
这并不难理解
注意:使用GSheet管理宏是另一个问题,如果您需要建议,请发表评论
链接到实时工作表:
那些将粘贴的间接函数复制到谷歌表单中的人完全无法理解它的潜力,因此他们没有对其进行任何改进,也没有覆盖在这个阵列时代至关重要的显而易见的逻辑
换句话说,间接数组不能包含多个数组:
=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("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;
FILTER(SNAME(1); SNAME(1)<>SNAME(0))&"!A1:A20")&"}; ""where Col1 is not null""; 0)")
当然,脚本可以更改为onOpen trigger,也可以通过自定义菜单或via按钮触发自定义名称,但是不能直接将自定义函数用作公式
这将满足您在添加新图纸时不通过添加参考来编辑公式的所有需求。唯一的缺点是重新计算图纸名称脚本。。。为此,您需要拆除A1公式,例如,在前导=按下之前添加'
输入并删除它以修复公式
那些将粘贴的间接函数复制到谷歌表单中的人完全无法理解它的潜力,因此他们没有对其进行任何改进,也没有覆盖在这个阵列时代至关重要的显而易见的逻辑
换句话说,间接数组不能包含多个数组:
=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("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;
FILTER(SNAME(1); SNAME(1)<>SNAME(0))&"!A1:A20")&"}; ""where Col1 is not null""; 0)")
当然,脚本可以更改为onOpen trigger,也可以通过自定义菜单或via按钮触发自定义名称,但是不能直接将自定义函数用作公式
这将满足您在添加新图纸时不通过添加参考来编辑公式的所有需求。唯一的缺点是重新计算图纸名称脚本。。。为此,您需要拆除A1公式,例如,在前导=按下enter键之前添加'