随着新工作表不断添加到 Google 个工作表中,从其他工作表中提取唯一值

Pull unique values from other sheets as new sheets keep getting added in Google Sheets

我正在尝试从不确定数量的 sheet 的 A 列中生成唯一项列表。这个想法是,随着时间的推移,将添加更多 sheets,我不想更新公式来解释新的 sheets。

Test/example传播sheet https://docs.google.com/spreadsheets/d/193ZTAbn8R-HjwDn2LE2eDDVJk_LbY4V5P9J6ynES6wo/edit#gid=0

在示例中,sheets List1、List2 和 List3 是我要从中创建组合列表(在 sheet "CombinedList" 中)的列表出现在每个 sheet 的 A 列中。正如 "Desired Outcome" sheet 所示,我想以 table 结束,它从每个列表中提取与每个项目关联的值。我可以在创建新的 sheet 时将其名称手动添加到第 1 行;只是 A 列中项目列表的生成让我卡住了。

我最初是在做类似下面的事情,

=ARRAYFORMULA(UNIQUE(QUERY({'List1'!A2:A;'List2'!A2:A}, 
 "select Col1 where Col1 is not null")))

但我不想写出要查询的列表的所有名称,而是想使用类似 INDIRECT() 的方法来引用第 1 行中列出的 sheets。但是,我读过几个地方,INDIRECT 和 ARRAYFORMULA 不能很好地相互配合。

你可以使用这个脚本:

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

function onEdit() { 
var sheet = SpreadsheetApp.getActive().getSheetByName('Master Sheet');  
var src = sheet.getRange("A1");
var str = src.getValue(); 
var cell = sheet.getRange("A2"); 
cell.setFormula(str);
}

然后将其粘贴到您的主人的 A1 sheet:

=ARRAYFORMULA("=ARRAYFORMULA(QUERY({"&TEXTJOIN("; ", 1, 
 FILTER(SNAME(1), SNAME(1)<>SNAME(0))&"!A2:B, "&
 FILTER(SNAME(1), SNAME(1)<>SNAME(0))&"!C2:C&"&
 FILTER(SNAME(1), SNAME(1)<>SNAME(0))&"!A1")&
 "}, ""select Col1,max(Col2) where Col1 is not null group by Col1 pivot Col3""))")

如果添加了新的 sheet,这将满足您不通过添加引用来编辑公式的所有需求。唯一的缺点是重新计算 sheet 名称脚本...为此,您需要拆除 A1 公式,例如在前导 = 之前添加 ' 按回车键,然后将其删除修正公式

spreadsheet demo