Как я могу динамически построить массив из диапазонов в Google Sheets? - PullRequest
0 голосов
/ 05 октября 2019

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

Моя рабочая книга здесь . Я пытаюсь создать шаблон листа для выходных и дней недели (Sheet: Weekday Template), где я могу выбирать блоки с помощью раскрывающихся списков (из листа: списки). А затем на листе программы каждого дня (Sheet: Monday Monday) он заполняется с использованием строк из блочных листов (Sheet: Morning Music Block).

Я обманул программу среды (Sheet: Wednesday Program),Я сделал это вручную так, как я хочу. Но пришлось использовать неустойчивую формулу:

=query({'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Antonye Holyde Block'!B3:D;'Mike Macintosh Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Morning Music Block'!B3:D;'Joe Focht Block'!B3:D;'Skip Heitzig Block'!B3:D;'Pancho Juarez Block'!B3:D;'Damian Kyle Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Afternoon Music Block'!B3:D;'J. Vernon McGee Block'!B3:D;'Mike Macintosh Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Evening Music Block'!B3:D;'Joe Focht Block'!B3:D;'J. Vernon McGee Block'!B3:D;'Skip Heitzig Block'!B3:D;'Pancho Juarez Block'!B3:D;'Damian Kyle Block'!B3:D;'Antonye Holyde Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D},"Select * where Col1 is not null")

Я могу сгенерировать этот ужасный текст массива с помощью:

=join(";",ArrayFormula("'"&If(A1,query({indirect("'"&D1&" Modifier'!D2:D")},"Select * where Col1 is not null "),query({'Weekday Template'!D2:D},"Select * where Col1 is not null "))&" Block'!B3:D"))

(ИУ меня это скрыто в «Программе понедельника»! C1, для справки.)

Но когда я пытаюсь вставить этот массив, построенный из запросов, в запрос, я получаю внешний запрос, пытающийся выполнить его с текстом,и не следуя ссылкам вообще.

=query({join(";",ArrayFormula("'"&If(A1,query({indirect("'"&D1&" Modifier'!D2:D")},"Select * where Col1 is not null "),query({'Weekday Template'!D2:D},"Select * where Col1 is not null "))&" Block'!B3:D"))},"Select * where Col1 is not null")

Выходы:

'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Antonye Holyde Block'!B3:D;'Mike Macintosh Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Morning Music Block'!B3:D;'Joe Focht Block'!B3:D;'Skip Heitzig Block'!B3:D;'Pancho Juarez Block'!B3:D;'Damian Kyle Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Afternoon Music Block'!B3:D;'J. Vernon McGee Block'!B3:D;'Mike Macintosh Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Evening Music Block'!B3:D;'Joe Focht Block'!B3:D;'J. Vernon McGee Block'!B3:D;'Skip Heitzig Block'!B3:D;'Pancho Juarez Block'!B3:D;'Damian Kyle Block'!B3:D;'Antonye Holyde Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D

И пробуя по-другому:

=query({indirect("'"&If(A1,query({indirect("'"&D1&" Modifier'!D2:D")},"Select * where Col1 is not null "),query({'Weekday Template'!D2:D},"Select * where Col1 is not null "))&" Block'!B3:D")},"Select * where Col1 is not null")

Выходы:

Interrupt   Station ID          Serial:ID
Spot        Promo               Album:%Block%
Fill        The Word of Promise Serial:TWoP;Announce:5
Spot        Sandy Adams         Serial:Sandy;Album:%Block%
Fill        Music               Genre:Worship

Это правильный, но частичный результат, он запрашивает только первый из моих 39 диапазонов.

Даже нет:

=ArrayFormula(indirect("{"&join(";","'"&If(A1,query({indirect("'"&D1&" Modifier'!D2:D")},"Select * where Col1 is not null "),query({'Weekday Template'!D2:D},"Select * where Col1 is not null "))&" Block'!B3:D")&"}"))

... работает. Он просто говорит:

Function INDIRECT parameter 1 value is '{'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Antonye Holyde Block'!B3:D;'Mike Macintosh Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Morning Music Block'!B3:D;'Joe Focht Block'!B3:D;'Skip Heitzig Block'!B3:D;'Pancho Juarez Block'!B3:D;'Damian Kyle Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Afternoon Music Block'!B3:D;'J. Vernon McGee Block'!B3:D;'Mike Macintosh Block'!B3:D;'Sam Allen Block'!B3:D;'Chuck Smith Block'!B3:D;'Greg Laurie Block'!B3:D;'Jon Courson Block'!B3:D;'Evening Music Block'!B3:D;'Joe Focht Block'!B3:D;'J. Vernon McGee Block'!B3:D;'Skip Heitzig Block'!B3:D;'Pancho Juarez Block'!B3:D;'Damian Kyle Block'!B3:D;'Antonye Holyde Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D;'Bible Reading NKJV Block'!B3:D}'. It is not a valid cell/range reference.

Может кто-нибудь помочь мне решить эту проблему, не прибегая к Сценариям приложения?

1 Ответ

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

в Google Sheets INDIRECT не поддерживает несколько ссылок на ячейки / диапазоны. каждый диапазон (как в вашем случае) должен быть заключен в отдельный INDIRECT, а затем массив может быть построен следующим образом:

={INDIRECT(range1); INDIRECT(range2); etc}

решение в вашем случае будет генерировать пассивный массив в некотором помощникеячейку, а затем скопируйте и вставьте ее в активную формулу вручную или с помощью какого-либо сценария

...