Связанные выпадающие списки в табличках Google


Ты получишь возможность сделать в табличках Google свои связанные выпадающие списки:




Всего в несколько простых шагов.

Шаг 1. Скачай себе файл с примером

Перейдя по ссылкам ниже, ты получишь доступ к готовым файлам:

  1. Базовая версия (описана в видео  )
  2. Новая версия — доработанная и улучшенная.

Совет. Эти файлы открыты для просмотра, но не для редактирования. Поэтому сразу создай свою копию: меню Файл → Создать копию.  Далее об этом я расскажу подробнее.

Сравни 2 версии скрипта:

Базовая версия
Новая версия
средняя оценка пользователей★★★☆☆ - 3,4★★★★★ - 4,7
оценитьоценить
Среднее время выполнения в секундах0,30,4
бесплатно и не для продажи
Легко увеличить к-во связанных выпадающих списков
автоматически заполняет единственное значение
Работает с дублями
Не нужно сортировать исходную таблицу
Работает с числами и с текстом
Работает с дробными десятичными числами
функция "умного" удаления
Работает с датами

Ты можешь попробовать обе версии, а так же получить известие в случае появления новых версий. Ключевые вопросы по проекту я постарался осветить ниже. Жду комментариев под статьей: интересуют твои пожелания, отзывы и мысли.



# ? =
Вопросы + Ответы
01 ? =

Быстродействие


Сразу возникает вопрос: а каков максимальный объем данных можно загрузить на лист с данными? Есть ли предел, выше которого скрипт работать уже перестанет?

Ответ, разумеется, предел есть! Но он зависит не от скрипта, а от скорости работы табличек в целом. Я рекомендую использовать скрипт с данными:

  •  не более 5 000 строк для максимально комфортного использования.

    Так ты не почувствуешь, что скрипт заметно тормозит. 
    Можно и больше. Но всё зависит от мощности твоего компьютера. К тому же, верю, в будущем сервера и технологии табличек будут становиться всё быстрее.
Я тестировал скрипт с табличкой в 200 000 строк. И он по-прежнему работал, хотя и медленно. Жду теперь твои результаты тестов скорости.


02 ? =

Почему не выходит редактировать файл с примером


Доступ на редактирование файла с готовым скриптом я не даю, т.к. скрипт нужен всем. Ты откроешь мой пример и обнаружишь, что менять в нем ничего нельзя.

Но можно зайти в меню «файл → Создать копию» и тогда уже это будет твоя копия. Делай с ней, что хочешь, используй, дорабатывай под свои нужды, пиши мне свои отзывы и пожелания, наиболее частые из которых я обязательно учту при дальнейшей разработке проекта.


03 ? =

Где находится скрипт


Настройка скрипта вообще не составит тебе труда.

Для начала зайди в место, где этот скрипт находится. Для этого можно нажать меню «Инструменты → редактор скриптов». А еще, если ты пользуешься браузером Chrome, ты можешь воспользоваться сочетанием клавиш:

  • [Alt + T + E]которое можно запомнить по первым буквам названия меню на английском Tools → Editor.
Совет: используй разные сочетания клавиш в табличках Google
(и не только). Это значительно ускорит тебе работу.

Но продолжим. Когда ты зайдешь в редактор скриптов, ты там увидишь текст моего скрипта. Он длинный:


Но тебе потребуется только поменять настройки, которые я специально разместил в самом начале скрипта. Тут потребуется хорошо потрудится: изменить пару цифр и букв, думаю, справишься ;)

Для справки. К каждой таблице Goolge может быть привязан свой набор скриптов. Для использования того же скрипта в другом файле, необходимо скопировать весь текст кода в редактор скриптов другого файла.


04 ? =

Что конкретно менять в скрипте


Итак, ты уже открыл редактор скриптов и хочешь поменять настройки «под себя». Там так и будет написано: «Изменить настройки». Давай разберёмся по пунктам.

var TargetSheet = 'Основной' 
// имя листа, на котором настроены выпадающие списки
↑ Вместо слова «Основной» вставь имя рабочего листа, на котором ты будешь делать связанные выпадающие списки.

var LogSheet = 'Данные' 
// имя листа с данными для списка
↑ Создай лист с исходными данными для списка, а его название впиши в скрипт.

var NumOfLevels = 4 
// количество уровней выпадающего списка
↑ В нашем примере 4 связанных выпадающих списка. Если нужно, замени их количество на свое, впиши вместо 4 свое число.

var lcol = 2; 
// номер колонки слева, с которой начинается первый список; 
// A = 1, B = 2, etc.
↑ Впиши номер колонки, с которой начинается твоя таблица.

var lrow = 2; 
// номер строки, начиная с которой срабатывает список
↑ Шапка таблицы не должна затрагиваться скриптом, поэтому впиши сюда номер строки, с которой начинаются твои данные.


05 ? =

Как приготовить данные



Данные формируются на отдельном листе. В моем примере имеется 4 уровня вложенных списков:

  • Планета → Страна → Континент → Город. 

При желании можно добавить еще парочку в конце:

  • Район → Улица, 

или в начале:

  • Вселенная → Галактика.

Как тебе сделать свой список? Просто сделай его по примеру моего:


  1. Пропиши имена категорий-уровней таблицы в первой строчке, начиная с клетки A1.
  2. Начни заполнять с последнего уровня: выпиши все возможные варианты.
  3. Двигаясь к первому уровню, вводи все значения, не оставляя пустых ячеек. Некоторые названия придётся повторить, это необходимо для правильной работы скрипта.
  4. Когда данные будут готовы, можно двигаться дальше. В будущем, их можно пополнять новыми данными.
Отлично! Данные готовы, осталось совсем немного настроить таблицу. Не спеши сразу заполнять все данные, для тестирования достаточно нескольких строк. Помни, что данные должны быть едиными:

  • под ними ничего не записывай, 
  • ячейки в них не объединяй.


06 ? =

Как сделать первый выпадающий список?


Первый список нужно будет настроить вручную. Полученные данные нельзя сразу использовать для создания первого выпадающего списка. В моем примере первый уровень данных содержит названия планет, и они повторяются т.к. одна планета содержит несколько континентов, стран и так далее. А нам нужен список уникальных значений.

Для получения списка уникальных значений, используй формулу:
= UNIQUE(A2:A)

Она очень простая и выдает список уникальных значений. Эту формулу рекомендую написать на 4 колонки правее основных данных:


Либо вообще размести ее на новом листе:
= UNIQUE(Данные!A2:A)

После того, как ты получишь список, переходи на свой рабочий лист. Выдели диапазон ячеек, в котором будет находиться будущий выпадающий список. Иди в меню Данные → Проверка данных... и выбери там свой список.

Совет. При выборе данных для выпадающего списка ты можешь учесть необходимость в добавлении новых значений в дальнейшем. Если данные содержатся в диапазоне A1:A20, то ты можешь выбрать бо́льший диапазон для проверки данных: A1:A100. Пустые ячейки будут игнорироваться.

После этой настройки связанные выпадающие списки уже можно использовать! Теперь поговорим о приятных деталях.


07 ? =

Как увеличить количество связанных списков


Об этом я уже упомянул ранее. Для этого зайди в тело скрипта (Инструменты → редактор скриптов) и поменяй там одно число:

var NumOfLevels = 4 
// количество уровней выпадающего списка
↑ В нашем примере 4 связанных выпадающих списка. Вместо 4 поставь свое число.

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

Как видишь, это сделать очень легко.


08 ? =

Как скрипт автоматически заполняет единственное значение


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

Например, мы выбрали часть света = "Азия". В справке "Азии" соответствует только одна страна = "Китай ", а для "Китая" найден лишь один город = "Пекин". Вот, что произойдет при выборе "Азии": скрипт автоматически вставит "Китай" и "Пекин" в нужные ячейки. Правда, удобно?



09 ? =

Как скрипт работает с дублями


Часто бывает необходимость создания списка позиций с типовыми параметрами: цвет, размер, модель, ценовая категория и прочее. Эти значения могут повторяться от одной группы к другой. Получаются дубли.

Хорошая новость! В текущей версии скрипта списки могут содержать дубли, они будут нормально считываться.


10 ? =

Нужно ли сортировать исходную таблицу


Нет. Твои исходные данные могут быть сортированы в произвольном порядке. Это может быть удобно. Добавляя новые данные тебе не нужно беспокоиться о порядке строк. К тому же легче автоматизировать процесс.

Совет. Новые данные можно заполнять вручную, а можно автоматизировать: например, при помощи другого скрипта, или с помощью форм Google.


Работа с другими типами данных

Пока реализована работа со следующими типами данных:


  • [Мама мыла раму] = простой текст
  • [100500] = числа
    • [3,14159265356] = в том числе дробные, 
    • [100/500;100;Текст] = а так же группы данных, состоящих как из текста, так и из чисел
  • [01.08.2050] = дата и время — пока в разработке.

Если у тебя возникает проблема при работе с числами, обязательно напиши мне об этом в комментариях!


11 ? =

Про функцию «умного» удаления


Мне надоели остатки старых кусков проверки данных, которые появляются, когда я хочу удалить что-то в своих списках. Поэтому я настроил это:


Во-первых, как видишь, можно автоматически копировать часть списков, а остальные подтянутся. Ну и, выбрав первый уровень списков и нажав [Delete], ты можешь

  • удалить все следы списков, которые были правее.


12 ? =

Лучше один раз увидеть


Это видео немного устарело, но описание в нем вполне подойдет и для последней версии скрипта:



13 ? =

Обратная связь


Жду комментариев.

Наиболее частым вопросом пользователей является:

  • Как сделать несколько связанных списков одновременно?
Сделал файл для таких случаев:

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




Комментарии

  1. Здравствуйте, Максим!
    Скрипт не хочет работать со списками больше, чем 500 записей.
    Например, есть 2 уровня: Страна, Город. Если выбрать страну с небольшим количеством городов, то всё прекрасно. А если выбрать с более чем 500 городов, то возникает ошибка:
    Не удалось завершить выполнение за 6,236 сек. Превышено максимальное число значений в правиле (500). Используйте критерий "Значения из диапазона".

    Как победить не знаю(

    ОтветитьУдалить
  2. Здравствуйте, такое не победить. Это ограничение гугла. Можно решить только переписыванием логики скрипта. Я сейчас работаю над новой логикой. Когда будет готов новый механизм, отпишусь в Гугл+

    ОтветитьУдалить
    Ответы
    1. Хорошо, спасибо.
      Думаю, для решения моей задачи будет оптимальным такое решение:
      В листе с данными: вся первая строка - список городов, под ними - список городов в столбик.
      В основном листе: первый уровень - выбор значения страны из первой строки с данными. После изменения значения находим номер колонки, содержащий эту страну, и в соседнюю ячейку вставляем правило с диапазоном городов всей этой колонки, кроме первой строки.
      Но я плохо ориентируюсь со скриптовым АПИ гуглотаблиц((

      Удалить
  3. Добрый день, Максим! Спасибо за Ваши инструкции и скрипты и подробные описания. Это очень пригодилось нам.
    Мы столкнулись с такой особенностью: воспользоваться функцией связанных выпадающих списков на целевой странице может только владелец документа. Другие пользователи не могут, даже если им открыт доступ для редактирования документа. Они могут только выбрать из первого выпадающего списка, при этом остальные списки не подтягиваются. Подскажите пожалуйста можно ли как-то обойти это ограничение без изменения владельца? Заранее спасибо!

    ОтветитьУдалить
    Ответы
    1. Добрый день, если на листе есть защищенный диапазон, то другие пользователи не смогут пользоваться скриптом.

      Удалить
    2. Спасибо за оперативный ответ! Убрали защищенные диапазоны, сразу все заработало :)

      Удалить
  4. Максим доброго времени суток, подскажите можно ли в выпадающий список передавать полные данные ячейки? т.е. гиперссылку с текстом например:
    =ГИПЕРССЫЛКА("http://hyperlink.com";"текст_ячейки") ?
    как вариант использовать только гиперссылку http://hyperlink.com, но это уже крайний не очень удобный способ, может нужно в скрипте что подправить?

    ОтветитьУдалить
    Ответы
    1. Добрый день!

      Выпадающие списки Гугла так не умеют. Поэтому запрограммировать это нельзя.

      Удалить
  5. Спасибо огромное, это большой труд, и наверное единственное решение, которое так подробно расписано, для гугл таблиц! Помогите разобраться, почему не хочет формироваться список в D1. Начальные строка и колонка выбраны правильно, список уникальных стран сформировал, а города не подтягиваются. Уровня всего 2 - страна, город. В D1 получаю !ERROR синтаксическая ошибка в формуле.

    ОтветитьУдалить
    Ответы
    1. Виталий, спасибо за отзыв!

      Не знаю, в чем ошибка. Я решил повторить все шаги для 2-мерного списка, второй список находится в колонке D.

      Таблица работает нормально:

      https://docs.google.com/spreadsheets/d/1eY-XGX4YaR5JHFfP_ERgNaoMjDhj0hB3yaSb5-kI-CI/edit#gid=127492123

      Удалить
  6. Максим, добрый день. Подскажите, пожалуйста, можно ли сделать так, чтобы выпадающие списки работали в одном документе на разных вкладках. Я имею в виду, что лист с исходными данными - один, и принцип сортировки и отбора везде одинаковый, просто выпадающие списки дублируются на разных листах. Правильно ли я понимаю, что для этого необходимо добавить новый проект и продублировать скрипт? Или не так?

    ОтветитьУдалить
    Ответы
    1. Смотрите пример скрипта в самом конце статьи в разделе Обратная связь.

      Отдельный скрипт не нужно делать, но нужно несколько ссылок на существующий.

      Удалить
    2. Максим, спасибо за Вашу работу! Я просмотрела раздел "Обратная связь". Там речь идет о создании нескольких разных выпадающих списков на одной вкладке (одном листе), а вопрос пользователя был о создании одинаковых выпадающих списков на разных вкладках. У меня стоит такая же задача. В редакторе скриптов я дублирую Ваш скрипт несколько раз и каждый раз меняю наименования листов, но работает все только для того листа, что указан в скрипте последним. Очень надеюсь на вашу помощь

      Удалить
    3. Максим, я создала отдельный проект для каждого листа, в каждом проекте по одному скрипту. Заработало. Еще раз спасибо

      Удалить
    4. Дарья, а как вы привязали новый проект к своей таблице? Или как вы создаете новый дополнительный проект для таблицы?

      Удалить
  7. Максим, спасибо большое за скрит, но столкнулся с проблемой. при определенном раскладе (закономерности так и не увидел) списки не могут выдать конечный столбец пишет н/д мол функция фильтра не нашла нужного значения. хотя все заполнено по порядку с конца( по вашему гайду) с чем это может быть связано? потому как в другой аналогичной строке все работает отлично.

    ОтветитьУдалить
    Ответы
    1. Леонид, не могу сказать. Нужно уметь воспроизвести ошибку, чтобы ее исправить иначе не смогу найти в чем ошибка и исправить.

      Удалить
  8. Максим, подскажите, у меня в четвертом столбике выбивает ошибку "В ячейке K3 нарушены правила проверки данных. Укажите одно из следующих значений: #N/A." как это можно исправить?

    ОтветитьУдалить
    Ответы
    1. Бойлер Маркет, причины могут быть разные.
      Нужен пример файла, чтобы сказать точно.

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
  9. Этот комментарий был удален автором.

    ОтветитьУдалить
  10. Максим, спасибо за скрипт!
    1.Подскажите, как и где можно поменять в коде, чтобы списки создавались не в соседних ячейках. Например я в ячейки B2 выбираю первое значение, а следующее значение-список создается к примеру с ячейки F2.
    2. можно ли сделать так чтобы последнее значение создавалось без возможности выбора. Объясню, допустим список Завод-Номеклатура-Цвет-Кол-во в пачке. Количество для каждой позиции неизменно и скрипт автоматически вставит значение после выбора цвета, но в ячейки он покажется как поле со списком, можно ли это обойти.
    3. Можно ли пропустить значение в списке, допусти не в каждой номенклатуре есть цвет, тогда поле с количеством не выдаст значения?

    ОтветитьУдалить
    Ответы
    1. Артем,
      в этом скрипте нет возможности сделать списки в произвольных колонках.

      Пожалуйста, попробуйте мой последний скрипт, полностью переписанный:
      https://sheetswithmaxmakhrov.wordpress.com/2018/01/03/smart-data-validation-create-dependent-drop-down-lists-in-goole-sheets/

      Он позволяет сделать любой порядок колонок.

      Удалить
    2. Пункты 2 и 3 -- нет такой возможности.

      Удалить
    3. Анонимный подал хорошую идею:

      ----------------------------
      Если последнее значение статическое в списке, то можно его выводить не как список, а с помощью функции ВПР с автозаполнением столбца (пример ВПР
      + автозаполнения есть у Максима на Ютубе).

      Удалить
  11. Если последнее значение статическое в списке, то можно его выводить не как список, а с помощью функции ВПР с автозаполнением столбца (пример ВПР
    + автозаполнения есть у Максима на Ютубе).

    У меня так запоняються на производстве единицы измерения - кг, шт, литр.

    ОтветитьУдалить
  12. Спасибо огромное за ваш портал и максимально исчерпывающий материал. Благодаря вам даже самые несмышленные в гугл таличках имеют шанс теперь хоть чуточку оптимизировать процесс!

    ОтветитьУдалить
  13. Привет, Максим!

    Скрипт не хочет работать, если значения в первом столбце (1 уровень) заносятся не человеком, а другим скриптом. В этом случае в ячейке рядом (2 уровень) пусто.
    Но если я в первом уровне значения ввожу сам (через выпадающий список, печатаю или вставляю из буфера обмена), все работает нормально.

    Подскажите как исправить данный баг?

    Заранее спасибо!

    ОтветитьУдалить
    Ответы
    1. Привет, Павел!

      Т.к. заносится другим скриптом, то этот другой скрипт нужно подключить к моему.

      Есть костыльный способ "подделать" действия пользователя. Он описан здесь:
      https://stackoverflow.com/questions/16089041/how-can-i-test-a-trigger-function-in-gas

      Но лучше напрямую запустить.

      Удалить
  14. Сделал подключил теперь свежую версию с гитхаба (там где Master.gs), но ошибка так и осталась. Не понимаю логики, в ячейке A1 есть данные (какая разница как они были туда добавлены человеком или другим скриптом), но в ячейке B1 пусто (не появляется выпадающий список)

    это просто капец :(

    ОтветитьУдалить
  15. Здравствуйте, Максим
    Вы проделали более чем отличную работу. После детального ознакомления со скриптом, у меня возник вопрос. Подскажите, пожалуйста:

    Вкладка "Данные" имеет Планета, Континент, Страна, Город.
    Вопрос: как оставить только Планета и Континент, а Страну и Город - удалить?
    Спрашиваю т.к. есть необходимость только в списке на Два уровня.

    В ожидании ответа,
    Юрий

    ОтветитьУдалить
    Ответы
    1. Юрий,
      можно создать отдельную вкладку и перетянуть туда формулой только требуемые колонки:

      ={'Данные'!A:B}

      Удалить
  16. Добрый день. Пытаюсь настроить скрипты по одному из трех способов представленных Вами ранее , и постоянно с работой таблицы возникают проблемы. Сегодня пытаясь прописать данный скрипт, вышла такая ошибка: "TypeError: Не удается прочитать свойство "source" объекта undefined. (строка 37, файл Код)" подскажите, пожалуйста, как ее убрать

    ОтветитьУдалить
    Ответы
    1. ДМ Юрист Невзоров, добрый день!
      Скрипт запускается из триггера автоматически. Если пытаться его запустить из редактора скриптов, объект "событие" будет не определен, то есть undefined, о чем и сообщает ошибка.

      Удалить
  17. Добрый день, Максим!
    Большое спасибо за алгоритм. Подскажите, а возможно сделать выпадающий список 2-го уровня под списком 1-го уровня?
    Спасибо!

    Илья

    ОтветитьУдалить
  18. Макс, спасибо! Воспользовался пока самым простым двухуровневым списком, но уверен, что мне скрипт ещё пригодится!

    ОтветитьУдалить
  19. Добрый день! Опробовала все возможные версии вашего скрипта, но везде не дает сделать 9 уровней списка. С 6 списка начинает выдавать ошибку N/A. Ссылку на документ прикладываю https://docs.google.com/spreadsheets/d/1tFf5zEvKyzUPAU3qdOduHW3Y9LtPTMqMPdBMqQX3Acc/edit?usp=sharing

    Очень надеюсь на помощь! Уже всю голову сломала.

    ОтветитьУдалить
  20. Не работает ваша обновленная табличка - это так должно быть?

    ОтветитьУдалить
  21. Как добавить такое список на несколько листов?

    ОтветитьУдалить
  22. Этот комментарий был удален автором.

    ОтветитьУдалить
  23. Макси добрый день!
    Воспользовалась вашим скриптом, но есть проблема
    скрипт распространился на все листы. хотя названия я поменяла
    т.е добавляю новый лист в книгу и начинаю вводить данные и автоматом срабаывает проверка данных, хотя я ее не делаю, удаляю проверку данных на всем листе но когда начинаю заносить данные она появляется опять, помогите .....

    ОтветитьУдалить
  24. Спасибо за скрипт!
    У меня есть вопрос: если я создаю дополнительный новый лист, как мне на него распространить действие скрипта?

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

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

    Как в данной ситуации поступить?

    ОтветитьУдалить
  25. Здравствуйте!
    Спасибо за скрипт!
    У меня количество уровней выпадающего списка 2.
    На листе, на котором настроены выпадающие списки можно сделать так, чтобы данные были в разных столбцах, но чтоб связь не пропадал? Пример. Планета в столбце D, а Континент в столбце G.
    За ранее спасибо большое!

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Запросы (query) в Google Docs, как инструмент для профессиональной разработки отчетов и приложений

Замечательная функция Фильтра (FILTER) в таблицах Гугла (Google Spreadsheets)