Google Apps Script.Зависимые выпадающие списки! Dependent drop down lists! Google Sheets Урок 10.
Вставка
- Опубліковано 5 вер 2024
- В этом уроке я расскажу о том как сделать зависимые выпадающие списки в гугл таблице, с помощью Google Apps Script. Так же мы косвенно коснемся массивов и как по ним производить поиск значений и научимся делать смещение на нужные нам количества строк и столбцов.
Смотрите до конца, будет интересно.
Поддержи автора канала пальцем в верх и подпиской это для
меня лучший стимул продолжать развиваться.
Станьте спонсором канала, и вы получите доступ к эксклюзивным бонусам. Подробнее:
/ @stmsolution
💰 Поддержать монетой:
🎊 stm-solution.d...
🥇Bitcoin - bc1q5ve3p8zmcm6z9tapts6padpmnvv572tsujukad
📲 Через кнопку "Спасибо"
👍 Или станьте спонсором канала!
#STMSolution #Googlesheets #Googlescript
Подробно о проверке данных - developers.goo...
Все уроки по Гугл таблицам в одном плейлисте - • Google таблицы. Как со...
Помощь по гугл таблицам - пишите в ВК id8947072
Попробуй себя в фрилансе - kwork.ru/?ref=...
Или закажи разработку - kwork.ru/user/...
Мой паблик в Telegram - t.me/stmsolution
Буду рад видеть вас в моей группе ВК - public1...
Twitter - / stm_solution
Мой сайт stmsolution.ru
Еще больше видео на моем канале / @stmsolution
Пишите ваши вопросы и замечания ниже! Постараюсь на все ответить.
Если вам нравится видео, вы можете его поддержать лайком а так же, при желании, поддержать канал монетой
🎊 stm-solution.diaka.ua/donate
🥇Bitcoin - bc1q5ve3p8zmcm6z9tapts6padpmnvv572tsujukad
📲 Через кнопку "Спасибо"
👍 Или станьте спонсором канала!
Подскажите, как можно сделать список в несколько уровней?
У вас в примере Apple > Iphone X
А как можно добавить еще 1 уровень? Apple > Iphone X > 256gb
или еще так: Apple > Iphone X > 256gb > Gold
Если есть решение, напишите пожалуйста.
@@alexandermanzhula5155 тоже ищу, ничего не могу найти... Вы что либо нашли?
подскажите как данный скрипт можно переписать для работы не только для листа "Общий", но для каждого, заранее спасибо
Спасибо, спасибо огромное.
Рад ,что полезно
Дякую. Це те, що треба!
Отличное видео. Пересмотрев ролик несколько раз, получилось привязать к своей ситуации, если бы было менее подробно, может и не получилось бы. Просто здорово. Большое спасибо.
Стараемся))
@@stmsolution Інформація на каналі відповідала своєму часу. Але і зараз нічого подібного не існує - настільки все зрозуміло і доречно прокоментовано.
@@evhentkachenko689 может когда нибудь перезапущу тему с нуля, но пока что желания нет.
Спасибо, очень понятно и подробно
Сделайте пожалуйста ещё видео про фильтры
Добрый , сделаем.
Пару часов назад писал аналогичный скрипт, но все равно вовремя ))) спасибо за информацию.
Спасибо что смотрите!))
Супер, спасибо огромное! У меня получилось, из всех видео о данной теме, вы единственный который доходчиво обьясняете, и наиболее просто.!!!
Подскажите пожалуйста что нужно изменить, чтобы оно начиналось не с о столбца А, а со столбца F? Спасибо большое ещё раз!
Как всегда четко!!!! Спасибо огромное
Круто! Все получилось. Спасибо за урок!
Очень полезно! Большое спасибо!
Привет! спасибо большое! очень полезно!
Было бы полезно еще формирование сметы/заказа/Спецификации и т.п. где-то видела реализацию, когда в базе данных проставляли кол-во, а в соседнем листе формировалась из этих данных смета и ее далее отправляли ее клиенту также с помощью скрипта.
Я в основном даю людям базовые знания, дальше вы уже сами, что угодно можете сделать.
Полезная загогулина )))))))
Спасибо
Отличный ролик! Но как заставить работать скрипт только в двух ячейках конкретного листа? Триггером onEdit почему то не получается, хотя в условии прописан конкретный лист. Он либо работает на всех листах, либо не работает вообще
урок бомба. спасибо!
Здавствуйте, можете подсказать пожалуйста как сделать так что бы скрипты работали одновременно, у меня стоит скрипт на обновление статусов ттн новой почты, каздые 3 часа, и когда это обновление происходит, то в таблице ничего нельзя сделать onEdit не срабатывает, пока не выполниться скрипт.
Как сделать больше 2х зависимых списков? (Т.е. например при выборе Apple->iPhone X-> цена )
В следующих видео буду освещать, но сначала надо узнать что такое фильтр
Супер, спасибо. Буду ждать с нетерпением)
ещё надо возврат сделать к исходному состоянию. Если удалили значение в столбце 1, то в столбце 2 пропадает зависимый выпадающий список.
Да, согласен, но видео и так большое получилось ,решил не добавлять много всего, при том что каждый может уже сам доработать под себя
@@stmsolution 2 строки кода, 15-20 секунд хронометража. В следующем добавьте.)
Не про ифы видео. Плюс объяснить что я делаю это доп минута, я стараюсь вкладываться в 5 минут , а тут как то и так занесло)))
@@stmsolution отличний формат получился
Если у кого выдает ошибку:
-->> Exception: The parameters (String) don't match the method signature for SpreadsheetApp.Range.setDataValidation
на строку ar.offset(0,1).setDataValidation(validation);
Причина в отсутствии скобок: validation()
строка должна выглядить так: ar.offset(0,1).setDataValidation(validation());
Спасибо!
Здравствуйте. Можно вопрос не по теме видео?
Скажите, пожалуйста, можно ли облегчить таблицу - чтобы работала быстрее с большими данными
Добрый день, ua-cam.com/video/cu1EDhDJ0vY/v-deo.html
Спасибо. Я долго искал именно это видео. Доступно и емко. Единственное , во втором листе тоже выскакивают эти выдающие списки. HELP. Что делать?
Проверку на нужный лист пропишите, типо если активный лист, такой то, отделать, иначе return
@@stmsolution, спасибо, я попробую
Добрый день - очень классные у вас ролики - сжато и по существу.
Но остро не хватает комментариев к коду скрипта (устных, или закоменченых) - если нужный диапазон во вкладке "База", не в начале листа, а начинается например на D2, и дальше будет идти шапкой вправо, а списками вниз - как это задать?
Подозреваю в этой строке:
let values = sheetDb.getRange(1,1,1,sheetDb.getLastColumn()).getValues();
Наверное в скобке: строка начала массива, колонка начала массива, высота, и длинна - динамическая последняя колонка.
Я об этом подробно рассказывал в предыдущих уроках. Получение диапазона getRange(стартовая строка,стартовый столбец, количество строк, количество столбцов)
Фух....получилось...спасибо-)
День добрый, спасибо за полезное видео.
Родился такой вопрос, а если нужно выводить определенное число зависимых списков больше чем 1, есть ли способ это реализовать?
Например выбираем: apple> список с айфонами (в 1 столбце), список с айфонами (во 2 столбце), список с айфонами (в 3 стобце) и т.д.
Конечно, все на основании базы данных как построете
Все круто, но жаль что ofset применяется на других листах при редактировании, не могу решение найти(
If прописываете типо if (ss.getActiveSheet().getName()==="Лист1"){то выполняем весь код внутри}
@@stmsolution Спасибо!
@@stmsolution Подскажите пожалуйста, во у меня есть дата 10.12, как мне сделать так что бы когда было 12.10
запускался нужный код? делали подобное ?
Как сделать, что бы искомое значение было не в первом столбце, пятый час мучаюсь !
пропишите поиск в нужном столбце.
дякую
Благодарю за урок! Все работает кроме, когда добавляю
if(ar.getColumn()!==1){return}
Перестают создаваться ячейки со списком, если закомментирую эту строку, все работает. Помогите понять в чем причина.
КОД:
function onEdit(){
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName("ДП");
let sheetDB = ss.getSheetByName("Настройки");
let ar = sheet.getActiveCell();
if(ar.getColumn()!==1){return}
let valToFind = ar.getValue();
ar.offset(0, 1).clearContent().clearDataValidations();
let values = sheetDB.getRange(1,1,1,sheetDB.getLastColumn()).getValues();
let col = values[0].indexOf(valToFind)+1;
console.log(col);
let range = sheetDB.getRange(3, col, 17, 1);
console.log(range);
let validation = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
//sheet.getRange(ar.getRow(), 2).setDataValidation(validation);
ar.offset(0, 1).setDataValidation(validation);
}
Надо смотреть ошибку, что выдает, плюс надо понимать что именно вы делаете.
@@stmsolution Хочу понять как можно добавить еще уровни.
У вас в примере Apple > Iphone X
А как можно добавить еще 1 уровень? Apple > Iphone X > 256gb
или еще так: Apple > Iphone X > 256gb > Gold
Если есть решение, напишите пожалуйста.
спасибо!
Как сделать, чтобы скрипт работал с несколькими листами, куда подставляются данные по выпадающим спискам?
Пропишите их в скрипте
Все прекрасно работало, но вдруг перестало, во втором выпадающем списке пишет загрузка, такое на всех компах в разных браузерах. На телефоне и планшете все работает. В чем может быть проблема?
удалите проверку данных и сделайте заново, гугл глючит
Видео интересное, а нельзя ли сделать отдельное видео "Как задать текстовому ответу цифровое значение в Таблице Гугл Форм"?
Не совсем понятен вопрос.
Здравствуйте. Можно вопрос не по теме видео?
Скажите, пожалуйста, можно ли сделать так чтобы пользователи не работали с одной общей гугл таблицей одновременно, а для каждого создавался свой временный экземпляр? Просто суть моего проекта в том что пользователи вводят некоторые данные на листе и получают соответствующий результат и вмешательство одного пользователя в процесс ввода данных другим пользователем недопустимо.
Или может быть можно ограничить число одновременно редактирующих конкретный лист пользователей до одного?
Сделайте листы для каждого пользователя отдельно и поставьте им доступ только для них, все
@@stmsolution проблема в том что пользователи - случайные люди, т.е. я не знаю их заранее
Добрый день, подскажите пожалуйста как, адаптировать ваш скрипт под строки.
Вот мой вариант, проблема в том, что indexOf(valToFind) в моем случае не определяет индекс ячейки, пишет всегда одно и тоже число (в данном случае "1"), хотя в вашем варианте со столбцами все работает четко, я проверял. Заранее спасибо!
function onEdit(){
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName("Расчет сметы");
let sheetDb = ss.getSheetByName("Цены работа");
let ar = sheet.getActiveCell();
let valToFind = ar.getValue();
let values = sheetDb.getRange(1,1,sheetDb.getLastRow(),1).getValues();
let row = values[0].indexOf(valToFind)+1;
console.log(row);
let range = sheetDb.getRange(row,3,1,sheetDb.getLastColumn()).getValues();
console.log(range);
let validation = SpreadsheetApp.newDataValidation().requireValueInList(range).build();
ar.offset(0,1).setDataValidation(validation);
}
У вас values это один столбец, по этому ничего вы не получите таким образом попробуйте ноль убрать
@@stmsolution ноль убирать пробовал не помогает, можно к вам обратится для доработки этого скрипта? самому знаний не хватает, а разбираться времени нет
До этого объявляли с помощью var, теперь let
Поменялся стандарт объявления переменных , var устарело.
Спасибо за нужную мне информацию. Но у меня в скрипте в строке let col = values(0).indexOf (valToFind); ошибка. Не могу разобраться и исправить. Если можно, помогите, пожалуйста.
values[0]
Аналогично! indexOf(valToFind) не работает с getRange().getValues()! Как у автора всё получилось - не понятно...
@@user-vz1jo5zr7t квадратные скобки
Добрый день! Спасибо! Я новичок. Как убрать следующий момент: скрипт начинает срабатывать на второй вкладке, на которой мы записываем базу для выпадающих списков?
Пропиши условие, что бы проверял нужный ли лист используется, а вообще код желательно посмотреть.
@@stmsolution Не умею пока писать такое условие. Поможете?
function onEdit() {
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName("Учет");
let sheetDb= ss.getSheetByName("Г/ПГ");
let ar = sheet.getActiveCell();
if(ar.getColumn()!==2){return}
let valToFind = ar.getValue();
ar.offset(0, 1).clearContent().clearDataValidations();
let values = sheetDb.getRange (5,1,1,sheetDb.getLastColumn()).getValues();
let col = values[0].indexOf(valToFind)+1;
// console.log(col);
let range = sheetDb.getRange(7, col, 20, 1);
// console.log(range);
let validation = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
ar.offset(0, 1).setDataValidation(validation);
}
@@stmsolution помоги плиз
Скажите, пожалуйста, как в форме-гугл можно запретить редактировать её, если в одном из полей указана дата раньше сегодняшней? Необходимо запретить редактирование ответа на форму за прошедшее число. Можешь есть схожий метод в скриптах ss?
За такое не слышал, посмотрите в документации formapp
STM Solution А есть ли подобная функция в таблицах? Нужно запретить редактирование таблицы в зависимости от значения ячейки
Скажи пожалуйста, а ActiveCell можно заменить на фиксированный столбец в массиве?
Не совсем понял что хотите
@@stmsolution Приветствую. У меня похоже тот же вопрос. как доработать скрипт таким образом, чтобы в 6 строке вашего скрипта присваивать переменную 'ar' не активной ячейке, а целому диапазону например из 20 строк в первом столбце. например если данные из первого столбца не являются выпадающим списком, а возвращаются по другому условию. У меня получилось реализовать это условие только на первой строке листа "Общий", указав в 6 строке скрипта вместо getActiveCell() getRange(3,1)выбрав конкретную ячейку, но как применить это к остальным 20 строкам вниз - не понимаю. Куда копать?
@@user-ug3ye2hv7l массивы, получайте столбец со значениями через getRange().getValues() и потом по этому массиву через цикл пробегайте вытаскивая каждый элемент массива отдельно
@@stmsolution , благодарю) Ответы я так понимаю в уроке про Циклы for и while) Верно?
@@user-ug3ye2hv7l да и в уроках про массивы
Вопрос по ходу. на 8:47 (сразу растяну...) и появились в нижних ячейках списки. Как это произошло?
ua-cam.com/video/kFEmwZhn9w4/v-deo.html добрый день, посмотрите в этом видео, я рассказываю об этом, в правом нижнем углу квадратик зажимаем и тянем в низ
@@stmsolution Спасибо
Когда корректируешь значения в таблице, то постоянно появляется "Проверка данных". Самопроизвольно. И в любом месте. Можно заменить getActiveCell на какой-то другой метод?
Пропишите условия типо что бы срабатывало только в конкретной ячейке
@@stmsolution А можешь направление указать, с чего именно начать)))? Буду благодарен.
Я вношу данные в следующую ячейку в ручную, после выбора значений в двух подряд выпадающих списках. Если что-то удаляю, то в соседней ячейке срабатывает скрипт.
@@stmsolution Первый вариант скрипта работает без этой проблемы. Только и автоматическую очистку ячейки пришлось тоже отменить.
Добрый день. Идентичный вашему код вставляет справа от первого столбца выпадающий список не только на листе Общий, но и на листе База аналогично. Можете пояснить как исправить, чтобы скрипт работал только на листе Общий, или это глюк какой-то?
Больше того если другие листы создавать, скрипт работает и на них, если в первой колонке вводить данные то появляется проверка справа
Добавил условие, если название листа не равно Общий, не выполнять скрипт дальше.
@@kiska5971 Подскажите пожалуйста, как это прописать в коде
Спасибо!
Отличный ролик! Но как заставить работать скрипт только в двух ячейках конкретного листа? Триггером onEdit почему то не получается, хотя в условии прописан конкретный лист. Он либо работает на всех листах, либо не работает вообще
Чтобы script работал только на определенном листе (например: лист с именем "sh1") необходимо весь код функции выполнять при условии что активный лист == sh1
Использовать условие:
if ( активный лист==sh1) [
тело скрипта
]
Нет под рукой компьютера допишу по возможности.
@@you-tube36 Спасибо!
@@you-tube36 Подскажи, какой код прописать