将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;
FILTER(SNAME(1); SNAME(1)<>SNAME(0))&"!A1:A20")&"}; ""where Col1 is not null""; 0)")
然后此脚本将从 A1 单元格中获取字符串,并将其作为有效公式粘贴到 A2 单元格中:
function onEdit() {
var sheet = SpreadsheetApp.getActive().getSheetByName('query'); // MASTER SHEET NAME
var src = sheet.getRange("A1"); // COPY STRING FROM
var str = src.getValue();
var cell = sheet.getRange("A2"); // PASTE AS FORMULA INTO
cell.setFormula(str);
}
function SNAME(option) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet()
var thisSheet = sheet.getName();
if(option === 0){ // ACTIVE SHEET NAME =SNAME(0)
return thisSheet;
}else if(option === 1){ // ALL SHEET NAMES =SNAME(1)
var sheetList = [];
ss.getSheets().forEach(function(val){
sheetList.push(val.getName())
});
return sheetList;
}else if(option === 2){ // SPREADSHEET NAME =SNAME(2)
return ss.getName();
}else{
return "#N/A"; // ERROR MESSAGE
};
}
当然,脚本可以更改为 onOpen 触发器或从自定义菜单或按钮触发的自定义名称(但是不能直接将自定义函数用作公式)
这将满足您在添加新工作表时不通过添加引用来编辑公式的所有需求。唯一的缺点是重新计算工作表名称脚本...为此,您需要拆除 A1 公式,例如在前导 = 之前添加 ' 按回车键,然后将其删除以修复公式