随着新工作表不断添加到 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
我正在尝试从不确定数量的 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 公式,例如在前导 =
之前添加 '
按回车键,然后将其删除修正公式