Объедините несколько диапазонов в листах Google с помощью programmati c lookup - PullRequest
1 голос
/ 01 апреля 2020

У меня есть лист Google с динамически меняющимся числом листов внутри. Я хотел бы иметь возможность автоматически объединять все рабочие листы, включенные в именованный диапазон с именами рабочих листов.

У меня есть работающая формула, которая объединит все данные в одну рабочую таблицу. Я хотел бы, чтобы это вычислялось из именованного диапазона.

UNION FORMULA

={QUERY('Sheet1'!A2:L, "select * where A != ''");QUERY('Sheet2'!A2:L, "select * where A != ''")}

У меня также есть именованный диапазон на другом листе, который имеет все имена рабочих листов

NAMED RANGE

WORKSHEET_NAMES = {Sheet1,Sheet2,Sheet3)

, которые я также имел ранее использовал это для извлечения данных из рабочих таблиц, используя

Col A - this duplicates the range of worksheet names in column A
=QUERY(WORKSHEET_NAMES, "select A where A != ''")

Col B-Z - this looks up the worksheet name and pulls in the range from a string
=QUERY(indirect($A2&"!$A$2:$N"), "select * order by B desc limit 1")

Я не знаю, возможно ли (я искал более 1 часа сейчас) объединить поиск имени моей рабочей таблицы с моей операцией объединения, или если мне потребуется прибегнуть к написанию чего-либо в скриптах Google, чтобы позволить мне выполнить объединение.

РЕДАКТИРОВАТЬ

Пример листа

Лист «Объединение» показывает желаемый результат, но представляет собой формулу, созданную вручную, и не генерируется из именованного диапазона. WORKSHEET_NAMES

Лист «Последние» показывает именованный диапазон, который WORKSHEET_NAMES использует, используя INDIRECT для выбора диапазона из строки. .

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

без сценариев вы можете создать генератор формул в C1 , например:

=ARRAYFORMULA({""; "={"&TEXTJOIN("; ", 1, 
 IF(A1:A="",,"QUERY("&A1:A&"!A2:C, ""where B != ''"")"))&"}"})

0

, а затем скопировать и вставить C2 везде, где вам нужно


, чтобы пропустить повторное копирование-вставку, вы можете использовать скрипт:

function onEdit() { 
var sheet = SpreadsheetApp.getActive().getSheetByName("Contants");  
var src = sheet.getRange("C2");   // The cell which holds the formula
var str = src.getValue();
var cell = sheet.getRange("C10");  // The cell where I want the results to be
cell.setFormula(str);
}

0

, поэтому он скопирует сгенерированную строку "формула" из C2 и вставит ее в C10 как истинную формулу, поэтому все, что вам нужно сделать, это ввести имена листов в столбце A и все автоматически обновляется

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

1 голос
/ 06 апреля 2020

Решение без Google App Script.

Требования:

  • 3 отдельных вспомогательных ячейки
  • 1 вспомогательный столбец, который вам нужно будет вручную перетаскивать вниз при каждом добавлении новое имя листа, или вы можете просто перетащить его вниз 1000 раз, и это будет хорошо для следующих 1000 листов ...

Используя ваш лист отходов в качестве примера, у вас есть список в столбце A.

В клетке B1 положить =arrayformula(if(len("'"&A1&"'!A2:C")<1,"",query(transpose(substitute(query(substitute(indirect("'"&A1&"'!A2:C")," ","_"),"Select * where Col1 is not null",counta(array_constrain(indirect("'"&A1&"'!A2:C"),99^99,1)))," ","\")),"select * where Col1 is not null",99^99))) ДРАГИРУЙТЕ ЭТУ ФОРМУЛУ ВНИЗ, КАК ВАМ НУЖНЫ НАЗВАНИЯ ЛИСТОВ, КОТОРЫЕ ВЫ МОЖЕТЕ СБРОСИТЬ

В клетке C1 положить =arrayformula(if(len(B:B)<1,"",split(B:B," ")))

В ячейку F1 положить =arrayformula(query(transpose(substitute(query({C:E},"select * where Col1 is not null",counta(array_constrain(A:A,99^99,1)))," ","\")),"select *", 99^99))

В ячейку F2 положить =arrayformula(substitute(transpose(split(transpose(split(F1," ")),"\")),"_"," "))

Теперь в ячейке F2 ваш присоединенный отчет будет динамически обновляться при добавлении имен листов.

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