Блог

Отладка кода в редакторе Apps Script

Это статья будет полезна тем, кому необходимо изменить или доработать готовый код Apps Script (в том числе и код, размещённый на этом сайте) под свои насущные потребности.

И первый вопрос:

Что делать, если изменённый скрипт перестал работать?

Разумеется, для того чтобы код снова заработал, его необходимо отлаживать или “дебажить” (от английского debug).

И прежде всего нам необходимо найти то самое место, после которого начинается проблемы и код ведёт себя совсем не так, как от него ожидают.

Стратегий здесь может быть несколько. Самая надёжная из них (но не самая быстрая) - это пошагово пройтись по всему коду, начиная с самого начала.

Для этого в окне редактора необходимо:

  • выбрать функцию, которую будем отлаживать (на рисунке это функция tmp());
  • установить breakpoint (точку останова программы) - на рисунке это фиолетовая точка слева от номера 32-й строки;
  • и нажать кнопку Debug (в заголовке над блоком кода, между кнопкой Run и названием функции отладки).

На этом рисунке программа остановилась как раз в точке останова в 32-й строке.

Там же на рисунке видно, что в правом блоке под заголовком Debugger находятся четыре кнопки:

  1. Кнопка Resume (треугольник) - нажатие на эту кнопку продолжит выполнение программы до следующей точки останова (или до конца программы, если точек останова больше нет).
  2. Кнопка Step Over (точка с дугообразной стрелкой) - нажатие обеспечивает выполнение текущей строки и переход на следующую строку.
  3. Кнопка Step In (стрелка направлена вниз к точке) - если текущая строка обычная, то будет выполнение текущей строки и переход на следующую (как и по команде Step Over). Но если текущая строка содержит функцию - переход будет осуществлён внутрь этой функции, то есть на первую строку кода внутри этой функции. (В примере на рисунке это строка 36, в которой содержится функция fillColumn. Нажатие Step In в строке 36 “заведёт” отладчик внутрь этой функции)
  4. Кнопка Step Out (стрелка вверх от точки) - текущая функция будет завершена и следующей точкой останова станет первая строки, после строки вызова текущей функции (в нашем примере это строка 37).

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

Кроме этого мы может вывести нужные значения в консоль с помощью команды

console.log(variable)

На снимки эти данные отображены в нижней части в блоке Execution log.

Как “отдебажить” код функции с аргументами?

Если мы хотим проверить работу функции, у которой есть аргументы, (например функции fillColumn(row, col, mask)) то лучшим решением будет сначала создать вспомогательную функцию tmp(), где

  • Сначала будут заданы значения всех аргументов функции fillColumn - переменные row, col, и mask;
  • А затем будет вызвана самом функция fillColumn(row, col, mask).

Тогда, запуск для отладки этой самой вспомогательной функции tmp(), по сути будет запуском самой функции fillColumn с аргументами.

Собственно говоря, на приведённом выше рисунке функция tmp() как раз и играет подобную вспомогательную роль для функции fillColumn(row, col, mask).

Как отлаживать код внутри функции onEdit(e)?

Системная функция onEdit(e) служит для того, чтобы перехватывать изменение/ввод данных на листах Google-таблиц, и не реагирует на стандартную обработку дебагером по breakpoint. Поэтому “отдебажить” её обычным образом у нас не получится.

Решений может быть, как минимум, два:

  1. Создать вспомогательную функцию, чтобы сначала перенести в неё всю логику функции onEdit(e) и там отладить по заранее заданным входным данным. А после отладки перенести готовый и отлаженный код обратно.
  2. Отлаживать onEdit(e) что называется “на месте”, но в качестве точек останова использовать окна, вызываемые классом Browser:

Browser.msgBox(variable);

Для удобства отладки по второму сценарию в качестве аргументов variable можно добавить значения каких-либо переменных.

Теперь для запуске второго варианта необходимо внести любые изменения на лист Google-таблицы. Это немедленно запустит функцию onEdit(e). И если до строки запуска месседж-бокса нет никаких ошибок, то мы обязательно увидим окно с именем переменной variable.

Дополнительную информация о способах отладки скриптов в редакторе Apps Script, вы сможете получить из этого видео: