Те, кто сталкивался с необходимостью использования в своих скриптах триггера onEdit(e)
, знают, что он по умолчанию срабатывает на любое изменение в ячейке. Это удобно и одновременно не очень по следующей причине: что если надо чтоб он срабатывал не всегда, когда меняется ячейка, а только тогда, когда происходит изменение в определенной ячейке.
Хочу предупредить сразу, что этот пост ориентирован на узкую аудиторию и призван уточнить некоторые нюансы. Чтобы полностью понять принцип работы чекбоксов, рекомендую ознакомиться со статьями по ссылке.
Недавно, в ходе решения вопроса, связанного с изменениями статуса чебоксов и работой onEdit возник вопрос о том, как обрабатывать изменения данных на основании наличия в ячейке чекбокса, и только при изменении состояния этого чекбокса.
Для этой задачи можно использовать метод getDataValidation()
который возвращает правила проверки данных для указанной ячейки. Если в ячейке не установлена проверка данных, этот метод возвращает значение null.
Проверка наличия чекбокса
Итак, есть ячейка А1 и в ней есть чекбокс:
Далее делаю проверку скриптом на наличие его в ячейке:
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 текущего ряда поставить значение из первой строки
}
}
И результатом:
Ваше мнение важно и может улучшить блог
Я хочу услышать ваше мнение и ваши идеи о том, как сделать этот сайт еще лучше. Примите участие в опросе, чтобы поделиться вашими пожеланиями, предложениями и замечаниями. Пройдите опрос сейчас и помогите сделать этот сайт более полезным для вас!