Извлекайте уникальные значения из других листов, так как новые листы продолжают добавляться в Google Sheets - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь создать список уникальных предметов из столбца А с неопределенным количеством листов. Идея заключается в том, что со временем будет добавлено больше листов, и мне не нужно обновлять формулы для учета новых листов.

Таблица тестов / примеров https://docs.google.com/spreadsheets/d/193ZTAbn8R-HjwDn2LE2eDDVJk_LbY4V5P9J6ynES6wo/edit#gid=0

ВНапример, листы List1, List2 и List3 - это списки, из которых я хочу создать комбинированный список (в листе «CombinedList») с элементами, которые отображаются в столбце A каждого листа. Как показано на листе «Желаемый результат», я хочу получить таблицу, в которую входят значения, связанные с каждым элементом из каждого списка. Я в порядке с ручным добавлением имени новых листов в строку 1, когда они создаются;я просто застрял в списке столбцов А.

Первоначально я делал что-то вроде следующего,

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

, но вместо того, чтобы выписывать всеимена списков для запроса, я хотел бы использовать что-то вроде INDIRECT () для ссылки на листы, перечисленные в строке 1. Однако я читал несколько мест, где INDIRECT и ARRAYFORMULA не очень хорошо играют друг с другом иличто-то.

1 Ответ

0 голосов
/ 13 октября 2019

Вы можете использовать этот скрипт:

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

, затем вставьте его в А1 вашего основного листа:

=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""))")

0

это покроет все ваши потребности не редактировать формулу, добавляя ссылки, если добавляются новые листы. единственный недостаток - это пересчет скрипта имени листа ... для этого вам нужно разобрать формулу А1, например, добавив ' перед ведущим =, нажав ввод, а затем удалив ее, чтобы исправить формулу

Демонстрация электронных таблиц

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...