Всё о checkbox или как подружиться с флажками в google sheets

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

Вставка чекбокса

Есть 2 способа вставить флажок

Через «Вставку»

Через «Данные»

Что возвращает чекбокс

Если сослаться на ячейку с флажком, то можно увидеть следующее:

При выключенном флажке

При включенном флажке

При этом есть один нюанс такого «возвращения»: если писать формулу, завязанную на чекбокс, то в формуле указывается true как boolean значение, а не «TRUE» как текст. В скрипте он так же возвращается как boolean.

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

и тогда при нажатии на флажок будет возвращаться «Кошка», при отжатии — «Собака»

Нажатие на флажок

Есть два способа нажать на флажок:

  • Клик мышкой
  • Пробел

Групповое нажатие на флажки

К примеру есть список фамилий сдающих что-либо:

И они все сдали. Чтобы не кликать по каждому чекбоксу, можно сделать следующее:

  • Выделяю все флажки
  • Нажимаю «пробел»

Условное форматирование и разноцветные чекбоксы

Чекбоксы можно так же использовать при подсветке и условном форматировании, через свою формулу и привязку к ячейке, зафиксированной по столбцу:

Например:

а если нажать, то:

Google apps script + checkbox

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

function checkAllCheckboxes() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('GAS example 1');
  const range = sheet.getDataRange();
  range.check()
}

Скрипт изменяет состояние флажков в диапазоне на «отмечено». Игнорирует ячейки в диапазоне, которые не содержат настроенного значения.

Логично что если есть check, есть и uncheck

function uncheckAllCheckboxes() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('GAS example 1');
  const range = sheet.getDataRange();
  range.uncheck()
}

Так же состояние чекбокса можно получить в скрипте через getValue()

function currentPosition(){
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('GAS example 1');
  const currPosition = sheet.getRange('A1').getValue();
  console.log(typeof currPosition)
}

и, как уже говорил выше, консоль вернет следующее:

из Checkbox в Radiobutton

Допустим у меня есть некий лист с вопросами в виде тестов:

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

function checkToRadioBox(){
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cellA1Notation = sheet.getActiveRange().getA1Notation();

  const cellRowIndex = sheet.getActiveRange().getRowIndex();

  sheet.getRange(cellRowIndex,1,1,sheet.getLastColumn()).uncheck();
  sheet.getRange(cellA1Notation).setValue(true);
}

Что здесь происходит?

const cellA1Notation = sheet.getActiveRange().getA1Notation(); — получаю имя ячейки по которой был произведен клик.

const cellRowIndex = sheet.getActiveRange().getRowIndex(); — нужен номер строки только что упомянутой ячейки.

sheet.getRange(cellRowIndex,1,1,sheet.getLastColumn()).uncheck(); — делаю uncheck по всей строке.

sheet.getRange(cellA1Notation).setValue(true); — ставлю true на ячейку по которой был произведен клик.

Далее же просто завешиваю этот скрипт на onEdit()

function onEdit(){
   checkToRadioBox()
}

В результате получаю следующее:


Ваше мнение важно и может улучшить блог

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

У этой записи 18 комментариев

  1. Shkur

    Как сделать так что бы флажок показывался только если в столбце А есть текст (задача) ?

    1. а сам флажок где должен быть?
      Уточните задачу, ну или пришлите ссылку на гуглотаблицу посмотреть!

  2. Артём

    Подскажите, пожалуйста, а как сделать чтобы у группы флажков отмеченным был только один?
    Допустим есть 3 варианта, выбрали первый, а затем решили выбрать второй, значит метка с первого снялась автоматически.
    Можно так сделать? Формула через True/False не срабатывает.

    1. Добрый день.
      В этом посте выше — «из Checkbox в Radiobutton».
      Там как раз и описывается как сделать чтобы в группе флажков работал только один.

  3. Дмитрий, добрый день, спасибо большое за статью! У меня вопрос такой, по поводу скриптов, которые в конце статьи. Я правильно понимаю, что это уже готовый кусок скрипта, который можно вставить в google sheet для работы с check box? А куда нужно скопировать этот кусок? Честно не могу догадаться? Может быть есть видео?

    1. Добрый день.
      Чтобы открыть google script editor в таблицах надо перейти в «Расширения» и там «Apps script».
      Видео нет, я пока думаю надо ли оно в таком формате блога.

      1. Артём

        Очень нужна краткая инструкция как запускать эти самые скрипты 🙂

  4. Михаил К.

    Здравствуйте!
    А как настроить на флажки проверку данных ?
    К примеру есть массив данных, скажем сверху я создаю два чекбокса «в работе» и «завершено» и при нажатии на любой мне соответственно отображаются только нужные значения (статус «в работе»).
    Знаю как это реализовать через функцию FILTER , но для этого придется создавать вторую таблицу, что неудобно.

    1. Добрый день.
      Есть какое-то поле (столбец) где указан статус? Как флажок будет понимать что именно фильтровать?

  5. Николай

    можно не писать «=TRUE» флажок сам является логическим выражением

    1. да, можно, if возвращает либо true либо false, сделал для наглядности и простоты понимания.

  6. Сергей

    Добрый вечер всем знающим!
    У меня такой вопрос, можно ли использовать флажок с несколькими условиями.
    Задача стоит такая: использовать флажок самостоятельно/вручную (ставить галочку и убирать просто чтобы отметить проверенные работы, например) и в то же время сделать так, чтобы галочка автоматически убиралась, если произошли изменения в другой ячейке или другая ячейка соответствует определенному значению.
    Пока пришёл к подобной формуле
    =ЕСЛИ(ИЛИ(G12=$AH$4;G12=$AH$7;G12=$AH$10);ЛОЖЬ;ИСТИНА)
    Но так невозможно самостоятельно выставлять галочки и убирать их.
    Пожалуйста, помогите реализовать идею)

  7. Вера

    Благодарю за полезную статью! Как сделать radiobuttons с помощью скрипта разобралась. Но проблема что теперь они возвращают значение TRUE на лист при любом раскладе. Как это обойти? Как получить FALSE если чекбокс отключен?

  8. Владимир

    Добрый день, а как можно скриптом установить чекбокс в ячейку или же скриптом вставить формулу самого чекбокса? Использовал .insertCheckboxes().check(), но занимает около 25 секунд непонимая из за чего. Хотелось бы узнать как это делается правильно

    1. Добрый день.
      Странно, что занимает так долго. У меня без последней функции чек() срабатывает моментально, с ней чуть дольше, но точно не 25 секунд.
      Но, если у Вас стабильно работает медленно, попробуйте через dataValidation:

      function buildCheckbox() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('List Name');
      const range = sheet.getRange("C9")

      const checkboxBuilder = SpreadsheetApp.newDataValidation();
      checkboxBuilder.requireCheckbox();
      checkboxBuilder.setAllowInvalid(false);
      checkboxBuilder.build();

      range.setDataValidation(checkboxBuilder).check()
      }

  9. Татьяна

    Добрый день. А есть возможность прописать функцию, чтобы она снимала флажки не со всего листа, а только в одном диапазоне?
    На листе несколько таблиц с флажками: в одной нужно снимать флажки каждый день, во второй раз в неделю, в третьей раз в месяц, к примеру. Можно ли сделать, чтобы было три разных варианта снятия флажков?

    1. Да, вы можете получить необходимый диапазон, пройтись по нему циклом и снять флажки.
      А чтобы это работало раз в неделю или раз в день или на каком-то временном интервале — посмотрите в сторону триггеров — в скриптах, слева, четвертый пункт сверху.

Добавить комментарий