Infinite Dependent Dropdown Lists (part 2) (RU voice)
Вставка
- Опубліковано 19 жов 2024
- Infinite Dependent Dropdown Lists (part 2) (RU voice)
This video details how to create Infinite Dependent Dropdown Lists using Google Apps Script.
The good news is that you can automatically create sheets and formulas by pressing just one button from the user menu.
The script described in the video can be found here: • Бесконечные Зависимые ...
#DropdownLists #DependentDropdownLists #GoogleAppsScript #GoogleSheets
Спасибо Вам добрый и умный человек!
Спасибо!
Спасибо большое! Очень многое узнал
И Вам спасибо!
Дождался! Спасибо большое!
Спасибо, что ждали!
@@IT4eachcom Все сделал как по видео, но дополнительная ячейка как на ua-cam.com/video/e3xRFKOojyQ/v-deo.html не уходит(
Сейчас специально создал новый файл, скопировал туда макрос и запусти. Всё работает, "лишняя ячейка" не появляется.
Потом добавил / удалил столбцы на листе "Home" - снова "лишняя ячейка" среагировала правильно.
За ограничение диапазона столбцов вправо (в функции onEdit(e) ) отвечает вот именно эта часть кода:
var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Home');
var colMax = sh.getLastColumn();
if(list_name === "Home" && name !== oldName && col < colMax) {
fillColumn(row, col, mask);
}
Если писали свой скрипт сами, то логично предположить, что где-то прячется ошибка. Соломоновым решением будет воспользоваться готовы скрипта с сайта.
Либо возможен другой вариант: в лишнем столбце на листе Home есть какие-то данные. Тогда попробуйте их очистить. Или же просто удалите этот лист и создайте его заново с помощью скрипта.
Всё рассказано великолепно! По таким роликам можно получить полноценное ОБРАЗование в области JS и GS.
Вижу один явный ляп, который портит эффект ВАУ, после нажатия createMenu.
Скрипт создаёт вначале лист Home, а после Data_2 и оставляет пользователя на этом Data_2, где ему нечего делать...
Как быстро исправить?
+
Есть ещё один хороший/ещёЛучше вопрос: - как мотивировать, материально, автора записывать ролики такого уровня = часто. Нужна простая форма, для пересылки денег.
Спасибо за отзыв!
Отвечаю на вопросы:
1.) добавить в конец скрипта строчку: SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Имя нужного листа").activate();
по всей видимости вместо, "Имя нужного листа" должно быть "Home"
2.) С этим сложнее - в последнее время много заказов.
Но результат можно получить почти мгновенно, если выслать тех задание на IT4each.com@gmail.com
@@IT4eachcom за 1). = Спасибо!
2). - Напишите в реквизитах канала номер карты, я буду отправлять туда деньги, по мере просмотра и конспектирования роликов, а тем более появления новых.
На почту буду писать обязательно этим летом, по мере формирования списка задач/вопросов для програМ, которые пишу.
Возможность онлайн оплаты по карте есть на сайте it4each.com
@@IT4eachcom про одинарные кавычки я догадался НЕ опытным путём : )
Скрипт:
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Home').activate(); // = Отлично работает,
поставленный в самом низу, но конечно перед };
}
Ещё раз = Спасибо!!!
Спасибо очень нужные обучения, карма + тебе)))
Спасибо за добрые слова и обратную связь)
Добрый день, спасибо за ваш труд. Хотелось бы изменить скрипт так, что бы:
1. Первый уровень выпадающих списков был со стобца C вмето A, что бы перед выпадающими списками были еще пара столбцов для своих формул;
2. В одной таблице несколько однотипных листов с выпадающими списками, что бы несколько человек могли заполнять выпадающие списки в своих листах одновременно (результат заполнения на всех листах получится разный, но каталог данных одинаковый).
Здравствуйте, Алексей!
Спасибо за Ваш комментарий!
Что же касается Вашего пожелания, то всё, что описано, реально сделать и это не займёт много времени.
Правда, если с таблицей одновременно работает сразу несколько пользователей, то есть смысл всерьёз задуматься о базе данных. Пример подобной реализации таблицы, выполненной на фреймворке Django, есть на моём канале (см. ссылку в следующем комментарии)
Пожалуйста, пришлите более подробное ТЗ на мой емейл: it4each.com@gmail.com
ua-cam.com/video/PlrK55FISEI/v-deo.html
Приветствую. А возможно ли реализовать автовставку следующих значений, если они *единственные* в выпадающих списках? Имхо, киллерфича.
И ещё -- тут 36:02 в 10ю строку копируется излишнее создание объекта? В 8й же оно же:)
Здравствуйте!
Да, разумеется, автовставка *единственных* значений в списке технически возможна и займёт всего лишь несколько строк кода.
И спасибо за то, что нашли опечатку. Восьмая строка действительно дублируется.
@@IT4eachcom Спасибо, буду разбираться, как реализовать)
Кстати, я сейчас подумал, что вместе со вставкой единственного значения было бы логично "сдвунуть" и ячейку редактирования на одно поле вправо. (Поскольку значение уже выбрано и ждать там больше нечего.)
Так что несколькими строчками кода тут, пожалуй, не обойтись.
И вообще автоматизация - это всегда палка о двух концах. Иногда "ручное" решение оказывается значительно быстрее и эффективнее "автоматизированного". Особенно, если автоматизировать совсем уж уникальные случаи.
скрипт необходимо редактировать под существующие таблицы, и как поднастроить не известно. Если есть такая возможность, проговорить илил описать что необходимо исправить что бы скрипт работал уже с другими таблицами.
Ответ выслал на почту
Подскажите пожалуйста, как возможно менять расположение столбцев в скрипте, что бы выпадающие списки в исходной таблице отображались в новом месте?
Не уверен, что понял вопрос, но самый простой способ поменять столбцы в итоговом листе - это изменить их на листе *Data*
Спасибо! есть 1 вопрос. а как в Home переместить эти столбцы? они должны быть не А В С и чуть дальше. если их передвинуть то все ломается
Здравствуйте!
Да совершенно верно, все формулы "заточены" на начало с первого столбца, поэтому, для вставки столбца (столбцов) в начало листа Home, надо аккуратно переписать формулы этого листа.
Если сами не справитесь, напишите мне на IT4each.com@gmail.com
Добрый день! А как сделать разрывы? Допустим между товарами (строками) нужно вставить строку с каким то итогом.
Здравствуйте! Интересный вопрос!
Сейчас - никак. Потому что любое изменение в столбце "А:А" запускает процедуру fillColumn(). А она первым делом удаляет всю информацию справа от ячейки редактирования.
Но проблема легко решается, если добавить новое условие: Запускать процедуру fillColumn() только при условии, если в первой ячейке строки нет какого-нибудь ключевого слова. Например, слова "ИТОГО:"
Если замените код в строке #13 вместо
if(list_name === "Home" && name !== oldName && col < colMax) {
на
if(list_name === "Home" && name !== oldName && col < colMax && sh.getRange(row, 1).getValue() !== "ИТОГО:") {
то в строке, где в первом столбце стоит "ИТОГО:", можно будет писать промежуточные итоги.
ВАЖНО!!! В этой ячейке строки должно быть ИМЕННО то ключевое слово, что написано в if в строке #13.
С точностью до каждого знака, без пробелов и кавычек!
Спасибо за отлично проделанный труд.
Вопрос в том, что когда начинаешь заполнять вторую строку - в первой уже ругается на ошибку.
Здравствуйте, Игорь!
Спасибо за обратную связь!
Ответ на Ваш вопрос можно найти в следующем видео ua-cam.com/video/pABmdcpC2LA/v-deo.html или, как ещё одни вариант, сделать индивидуальный заказ на it4each@gmail.com
Чтение по скрипту начинается с первого столбца) Мне необходимо сделать чтобы чтобы чтение было со 2го столба, т.е листе Home чтение со 2го столбца было) Как это осуществить?
В скрипте следующего видео появилась переменная сдвига: ua-cam.com/video/MtVOiyODpv0/v-deo.html
@@IT4eachcomвозможно ли что бы данный скрипт работал не только на одном листе, а сразу на нескольких? и что бы листов Home тоже было несколько
Да, в последнем видео это реализовано: ua-cam.com/video/pABmdcpC2LA/v-deo.html
Уважаемый, еще бы иметь пример таблицы уже готовой и настроенной, как у вас в видео, что бы там подшаманить свои переменные и всё заработало, цены вам не было бы
Здравствуйте! В конце видео подробно показано, где взять и как настроить готовый скрипт, который всё сделает ща Вас.
@@IT4eachcom Извиняюсь, посмотрел еще раз, вчера голова была вся забита другим, действительно всё очень просто, в конце видео инструкция за 5 сек сделать свой список)
Скажите а возможно сделать что бы при выборе список добавлялся не справа, а снизу? или через строку от выбора?
@@IT4eachcom @IT4each com еще очень важный момент, как сделать, вот я выбираю например цифру 1 или 3 и в зависимости от этой цифры , мне надо что бы появлялось снизу такое количество выпадающих списков в столбик..
Это возможно, но не быстро. Могу следать на заказ. Мой емейл it4each.com@gmail.com
То же самое - задача нестандартная, поэтму придётся писать отдельный скрипт.
и тут таже ошибка вылазит Cannot read property 'range' of undefined (строка 3, файл Код). Куда смотреть? С чем может быть проблема?
такая же проблема.
В этом конкретном случае проблема возникла из-за ошибки в названии листа. Но в Вашим случае могут быть и другие причины:
Либо сам код скопирован с сайта с ошибкой,
либо ошибка в именах листов ( *Home*, *Data* ),
либо нет данных на листе *Data* .
Пожалуйста, проверьте ещё раз!
@@IT4eachcom добрый день, но код не скопировал а писал его за вами по видео.
Здравствуйте!
Ну тем более, если писали сами, значит вероятность ошибки очень высока. Попробуйте скопировать код с сайта: it4each.com/blog/?tag=Dropdown+List
И пожалуйста, ещё раз обратите внимание на имена листов. В идеале - скопируйте эти имена из скрипта!
Здравствуйте. А где можно скачать данный sheet?
Здравствуйте!
Если Вы имеете в виду скрипт, то скачать его можно здесь: it4each.com/blog/beskonechnye-zavisimye-vypadaiushchie-spiski-v-google-sheets-chast-2/
Обратите также внимание, что лист с данными ОБЯЗАТЕЛЬНО должен называться *Data*
Всё остальные листы будет созданы автоматически, как только Вы запустите скрипт в пользовательском меню _'Custom Menu'_ .
@@IT4eachcom Уважаемый, не все сильны в скриптах и я не лентяй, но уже 2 часа по-буквенно ввожу 1 в 1 ваши формулы и у меня ""Array result was not expanded because it would overwrite data in xxxx"
Н" . Применил Transpose до фильтра - заработало, но проблема вылезла уже в другом... Прошу поделится готовым sheet'ом с формулами и скриптами, если это для вас приемлемо.
Помнится как то давно работал с подобными списками и где-то обнаружил что та формула работала только с отсортированными значениями по алфавиту. Что с наскоку было ни разу не очевидно, и после сортировки все заработало. Здесь какойто подобный затык, но не могу его найти.
Приемлемо конечно, просто не понятно, зачем это Вам нужно. Потому что скрипт и так САМ создаёт ВСЕ формулы.
Как вариант, если хотите, могу провести индивидуальное занятие и подробно рассказать и показать как всё работает. Моя почта для связи: IT4each.com@gmail.com
Здравствуйте, реально не могу понять как использовать скрипт в таблице где нужно создать например 15 листов на которых бы подтягивались данные для этих списков. Можете объяснить в какой строке, что нужно добавить, чтобы добавить листы в таблицу с нужными именами? Как настроить чтобы данные для этих листов тянулись из листа Data, но если нужно какой-то лист настроить на данные из Data_2? Помогите, пожалуйста.
Здравствуйте!
Если все листы однотипные - ссылаются на один и тот же лист Data, то их можно добавить вручную (скопировать с листа Home).
Если же нужен вариант сложнее (у каждого Home - свой лист Data), то в комментарии это объяснить - нужно делать изменения сразу в нескольких местах.
@@IT4eachcom Благодарю за ответ. Я уже нашел в одном из ваших видео ответ на свой вопрос. Немного подредактировал скрипт и довольно неплохо. Но одна ошибка выпадает при выполнении.
01:21:52 Ошибка
TypeError: Cannot read property 'range' of undefined
onEdit @ Код.gs:10
Не подскажите что это может быть?
let row = e.range.getRow();
эта строка даёт ошибку
Чаще всего это ошибка в имени листа - должен быть Home
В следующем видео (var 3) есть более "продвинутый" скрипт, который проверяет имена листов и выдаёт сообщение, если что-то не так.
Такая вот проблема что скрипт делает все хорошо, но функция omEdit не может начать действовать если нет изначально записанных значений с первой колонки. А потому приходиться вводить вручную, что не очень удобно
Здравствуйте!
Непонятно почему так? onEdit() не должна зависеть от значения ячейки в колонке слева. Она зависит только от измения значения редактируемой ячейки. Ну и, разумеется, от разрешённого диапазона ячеек, указанного в условии этой функции.
Кстати, в последнем видео ( ua-cam.com/video/pABmdcpC2LA/v-deo.html) в функцию onEdit() добавлены изменения: теперь формулы автоматически "протягиваются" на три строки ниже, считая от строки редактирования.
@@IT4eachcom Наверное я неправильно выразился. Функции onEdit при запуске таблицы неоткуда взять первоначальные значения потому, как в первую колонку ничего не записывается и соответственно нету смены значения в ячейки после которой запускается функция FillColumn
@@IT4eachcom По сути проблемы можно решить добавлением триггера который при нажатии на ячейку в колонке "А" листа "Home", а не смену значений, будет запускать запись значений в соответствующий столбец листа "Data_2", но к сожалению я достаточно криворукий что бы это не реализовать. Или как-то так
Вы пишите: "Функции onEdit при запуске таблицы неоткуда взять первоначальные значения потому, как в первую колонку ничего не записывается и соответственно нету смены значения в ячейки после которой запускается функция FillColumn"
Всё правильно! Формулы в первой колонке (которее затем и "подтягивают" значения в первый столбец) создаёт не *onEdit()* , а функция *createSheets()*
И всё-таки, позвольте ещё раз предложить посмотреть следующие видео этой серии:
ua-cam.com/video/MtVOiyODpv0/v-deo.html
ua-cam.com/video/pABmdcpC2LA/v-deo.html
Во-первых, там большет нет листа Data_2 и проблемы с ним связанной - красные треугольнички меток об ошибке там больше не появлятся.
Во-вторых, формулы в первый столбец теперь проставляются автоматически при каждом изменении на основном листе
. Поэтому функция *createSheets()* теперь тоже больше не нужна.
Добрый день! Подскажите пожалуйста, почему если я даю доступ другому человеку к файлу, где я настроил скрипт, то у него не работают зависимые списки? Более того, даже если я просто с другого гугл-аккаунта на своем же компьютере открываю файл - скрипт не работает.
Здравствуйте!
Проверьте уровень доступа, который даётся другому пользователю. С максимальным уровнем доступа (Editor) скрипты гарантированно работают.
@@IT4eachcom да, у меня стоит именно editor. Я специально сделал расширенные настройки. Может ли быть из-за того, что я на листы Data и Data2 защиту поставил?
Скорее всего.
Доброго времени суток, можно ди в данном файле " Бесконечные зависимые выпадающие списки" создавать колонки которые можно будет редактировать, у меня не получилось ( все колонки зависимые, можете пожалуйста помочь. Заранее спасибо
Я Вам ответил по email!
@@IT4eachcom А вы могли бы мне подсказать, как сделать так, чтобы зависимые колонки, были конечными? Т.е. по иерархии я хочу чтобы менялись только 3 стобца, а далее можно было самостоятельно редактировать, а то сейчас они все стираются при выборе первого зависимого поля.
Здравствуйте!
Иными словами Вам нужно сделать так, чтобы ячейки справа от связанных списков не стирались?
Насколько помню, это реализовано в следующем (по плейлисту) видео: ua-cam.com/video/pABmdcpC2LA/v-deo.html
@@IT4eachcom спасибо! Я тут уже накостылил кое-как, но для чистоты кода обязательно изучу предложенное видео!
К сожалению, у меня Скрипт не работает. Первая строчка без нареканий, все последующие - выдает ошибку (((
Здравствуйте. Это более, чем странно...
1. Скрипт в точности скопирован с сайта? (Все строчки кода от и до?)
2. Лист с данными действительно ли называется *Data* ?
3. Какая именно ошибка возникает на листе таблицы, начиная со второй строки? (и начиная с какого столбца?)
@@IT4eachcom , здравствуйте!
1. Скрипт скопирован и вставлен в точности по инструкции: copy на сайте, потом ctrl+А, ctrl+V)))
2. да, Data
3. Точнее, каждая новая строка без ошибки, но вот все предыдущие выдает Ошибку (не соответствует параметрам)
Выдает ошибку во всех столбцах кроме первого.
Я грешила на неуникальность данных. Удалила все , ввела уникальные даные, но все равно выдает ошибку((.
Если удалить предыдущие заполненные строки, то в выпадающий список показывает только 1 значение, которое выбрано в самой последней строке, иногда что-то клинило и показывало все значения, но потом проходило и снова показывало одно ))
@@vasilisaprosto7213 Ясно )
Однако, согласитесь, что между фразами "у меня Скрипт не работает" и "скрипт работает, но в предыдущих строках появляется красный треугольник, при наведении на который возникает окно 'не соответствует параметрам'" - существует ОГРОМНАЯ разница )))
Эта - ошибка валидации данных. Возникает из-за того, что данные на листе Data_2 меняются динамически. То есть каждая следующая строка меняет список данных на листе Data_2, и в этом новом списке отсутствуют ранее выбранное значение ячейки. А в последней строке таких "треугольничков" нет, поскольку Data_2 пока ещё содержит верные (с точки зрения валидатора) данные.
И если Вы внимательно посмотрите видео, то такие же треугольнички заметите и там.
К сожаление, эти треугольнички так просто не отключить. Поэтому вариант #1 - просто этого не замечать.
Вариант #2: решить эту проблему "в лоб" можно вот таким способом: stackoverflow.com/questions/56533676/ignore-data-validation-errors-in-google-sheets
Лично мне больше по душе вариант #3: просто удалять все формулы валидации (но не значения в ячейках!) как только строка пересатаёт быть активной. Тем более, что если строка начинает редактироваться, все эти формулы справа от ячейки редактирования и так будут удалены вместе с данными. Поэтому, если Вам нужна именно такая доработка скрипта, просто напишите мне на : IT4each.com@gmail.com
@@IT4eachcom здравствуйте!
Однако, соглашусь, но не полностью.
Красные флажки можно пережить (моя психика с таким справляется и даже без подкрашивания, которое описано в варианте №2))
Про проблему валидации, или как ее там, догадалась, но это никак не облегчает процесс использования скрипта.
* Главная проблема - невозможность нормально корректировать уже заполненные ячейки.
Вариант в ручную - не подходит, иначе "ну зачем это все нужно было создавать?"
А тем более при большом объеме информации, А тем более при нескольких пользователях листа.
На данный момент использую корявенький скрипт на 2а ур-ня с потенциалом на несколько ур-ней.
Удобно то что он работает для всех ячеек. Красные флажки появляются, но тогда когда действительно есть ошибка.
Он тормозит, грешила на его корявость, но оказалось - зря ))
Не отношу себя к тем умным людям, которые умеют создавать такие чудесные, рабочие скрипты (действительно восхищаюсь Вами), но весь этот скрипт обеспечивает нормальную работу только одной строчки (?!) серьезно ?
**Это лично мое субъективное мнение стороннего наблюдателя.
Мое восхищение такими людьми как Вы от этого не уменьшится.
Большое спасибо за огромное количество добрых слов )))
Однако, если раздражающие треугольники Вам не особо мешают, то я не могу понять, чем плох существующий вариант? И в чём конкретно проявляется _невозможность нормально корректировать уже заполненные ячейки_ ?
Если необходимо отредактировать созданную ранее строку, Вы просто меняете значение в первой (крайней левой) ячейке этой самой строки. Это действие автоматически запускает скрипт, который вновь создаёт валидную формулу в следующей (второй слева) ячейке.
Вы выбираете нужное значение и снова запускаете скрипт, но уже для третьей ячейки.
И так последовательно, до самого конца строки Вы можете изменить значения всех имеющихся в ней ячеек.
Что Вам не нравится в этом варианте?
И скрипт выдает ошибку,
TypeError: Cannot read property 'range' of undefined
onEdit @ Код.gs:3
А что Вы сделали перед этим?
Не читает ваш код
и TypeError: Cannot read property 'value' of undefined ( " let name = e.value; ")
Здравствуйте!
Либо сам код скопирован с сайта с ошибкой,
либо ошибка в именах листов ( *Home*, *Data* ),
либо нет данных на листе *Data* .
Пожалуйста, проверьте ещё раз!
Ни одну из этих обозначерий не читает))
TypeError: Cannot read property 'oldValue' of undefined
TypeError: Cannot read property 'value' of undefined
TypeError: Cannot read property 'source' of undefined
Здравствуйте!
Попробуйте скопировать код с сайта: it4each.com/blog/?tag=Dropdown+List
И пожалуйста, ещё раз обратите внимание на имена листов. В идеале - скопируйте эти имена из скрипта!
12:47:33 PM Notice Execution started
12:47:33 PM Error
TypeError: Cannot read property 'range' of undefined
onEdit @ Code.gs:3