Как оптимизировать работу onEdit(e)

Те, кто сталкивался с необходимостью использования в своих скриптах триггера onEdit(e), знают, что он по умолчанию срабатывает на любое изменение в ячейке. Это удобно и одновременно не очень по следующей причине: что если надо чтоб он срабатывал не всегда, когда меняется ячейка, а только тогда, когда происходит изменение в определенной ячейке.

Хочу предупредить сразу, что этот пост ориентирован на узкую аудиторию и призван уточнить некоторые нюансы. Чтобы полностью понять принцип работы чекбоксов, рекомендую ознакомиться со статьями по ссылке.

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

Для этой задачи можно использовать метод getDataValidation() который возвращает правила проверки данных для указанной ячейки. Если в ячейке не установлена проверка данных, этот метод возвращает значение null.

Проверка наличия чекбокса

Итак, есть ячейка А1 и в ней есть чекбокс:

google sheets checkbox

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

function getData() {
  const ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Check")
  const cell = ws.getRange("A1").getDataValidation().getCriteriaType()
  Logger.log(cell)
}
в ячейке есть чекбокс

.getDataValidation().getCriteriaType() — вернула CHECKBOX. Если бы там было что-то другое, например число или символ, результатом еще на моменте .getDataValidation() был бы null

Сравнение с встроенными типами

В гугл таблицах есть следующие типы проверки данных — https://developers.google.com/apps-script/reference/spreadsheet/data-validation-criteria?hl=ru

Именно с ними и можно сравнивать данные из .getCriteriaType()

 if (sheet.getActiveRange().getDataValidation().getCriteriaType() == SpreadsheetApp.DataValidationCriteria.CHECKBOX) { // проверка содержится ли в текущей ячейке checkbox

// здесь необходимый код для изменения чего-либо если в активной ячейке есть чекбокс

  }

В вопросе связки onEdit и чекбокса итоговый код выглядел следующим образом:

function onEdit() {
  checkToRadioBox()
}

function checkToRadioBox() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // текущий лист гугл таблицы
  const cellA1Notation = sheet.getActiveRange().getA1Notation(); // строковое описание диапазона в нотации A1 у текущей ячейки.

  const cellRowIndex = sheet.getActiveRange().getRowIndex(); // номер строки
  const cellColumnIndex = sheet.getActiveRange().getColumn() // номер столбца


  if (sheet.getActiveRange().getDataValidation().getCriteriaType() == SpreadsheetApp.DataValidationCriteria.CHECKBOX) { // проверка содержится ли в текущей ячейке checkbox

    sheet.getRange(cellRowIndex, 1, 1, sheet.getLastColumn()).uncheck(); // снять со всего ряда выделение True

    sheet.getRange(cellA1Notation).setValue(true) // установить True в текущей ячейке

    sheet.getRange("L" + cellRowIndex).setValue(sheet.getRange(1, cellColumnIndex).getValue()) // в столбец L текущего ряда поставить значение из первой строки

  }
}

И результатом:

результат работы скрипта

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

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

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