Неверно выполняется скрипт макроса

250
04 августа 2018, 17:30

Веду семейный бюджет в Google Spreadsheets. Появилась необходимость в значениях типа флажок. Написал скрипт для изменения значения в данной ячейке и заметил неверное его выполнение. Вот пример скрипта:

spreadsheet.getRange('H1').activate();
data = SpreadsheetApp.getActiveSpreadsheet().getRange('H1').getValues();
if (data == 'FALSE') {
  spreadsheet.getCurrentCell().setValue('TRUE');
} else {
  spreadsheet.getCurrentCell().setValue('FALSE');
}

Поясняю. Если в ячейке типа флажок стоит значение TRUE (установлен флажок), то скрипт выполняется нормально - устанавливается значение FALSE и флажок снимается. Если ф ячейке стоит значение FALSE (не установлен флажок), то скрипт не выполняется - в ячейке остаётся значение FALSE и флажок не устанавливается.

Вероятно, я написал скрипт неправильно, так как только начинаю изучать данный язык. Заранее прошу за это прощения.

Использую браузеры Firefox и Opera на ноутбуке и Google Chrome на мобильном телефоне.

Answer 1

Есть некоторые подозрения по работе кода. Рассмотрим ваш пример кода и попробуем догадаться, в чем же дело:

// получить с таблицы ячейку 'H1' и установить ее активной
spreadsheet.getRange('H1').activate();
// getActiveSpreadsheet() - получить активную электронную таблицу (null - если ее нет)
// getRange('H1') - получить с таблицы ячейку 'H1'
// получить значение ячейки (вот тут может быть массив массивов типа `values[][]`)
data = SpreadsheetApp.getActiveSpreadsheet().getRange('H1').getValues();
// если полученное значение (значения) эквивалентны 'FALSE' выполнить первую часть условия
if (data == 'FALSE') {
  // getCurrentCell() - получить текущую ячейку таблицы (которая активна)
  // установить значение ячейки в 'TRUE'
  spreadsheet.getCurrentCell().setValue('TRUE');
} else {
  // вторая часть условия, если у нас в `data` лежит 'TRUE'
  // getCurrentCell() - получить текущую ячейку таблицы (которая активна)
  // установить значение ячейки в 'FALSE'
  spreadsheet.getCurrentCell().setValue('FALSE');
}

На первый взгляд код выглядит вполне нормально, но лично мне кажется, что в коде присутствуют лишние операции, которые могут нарушать ожидаемое поведение кода. Судя по начальному коду, в переменной spreadsheet хранится таблица, соответственно все, что нам нужно - у нас уже в принципе есть и нам не нужно заниматься активацией ячеек и получением активных таблиц. Попробуем немного изменить исходный код:

// получить ячейку 'H1' с таблицы `spreadsheet` (ваша переменная)
var cell = spreadsheet.getRange('H1');
// получить значение ячейки (не `getValues`)
var value = cell.getValue();
// поменяем значение `value` на противоположное и положим его в  переменную `newValue`
var newValue = !value;
// установим в ячейку новое значение, которое лежит в переменной `newValue`
cell.setValue(newValue);

Вообще, можно записать этот код в меньшее количество строк (к примеру в две), но это уже на ваше усмотрение. Из советов - читайте доки, к примеру: getValue()

READ ALSO
Отмена кнопки win

Отмена кнопки win

Разрабатываю биткоин кранТам пользователь сначала должен кликнут на рекламу потом получить за это сатоши

290
Как добавить текст из select в кнопку?

Как добавить текст из select в кнопку?

Имеется кнопка добавление товара в корзину

249
Electron - не работает require в iframe

Electron - не работает require в iframe

При использовании require в <iframe src"path/to/framehtml"></iframe> который расположен в основном файле index

264
Как реализовать диаграмму? [дубликат]

Как реализовать диаграмму? [дубликат]

На данный вопрос уже ответили:

227