Отладка пользовательской функции в скрипте Google Apps

Я пытаюсь создать свою первую настраиваемую функцию для Google Spreadsheet в скрипте приложений, и мне сложно использовать отладчик.

Я работаю над демо-кодом пользовательской функции из документации Google, и я установил drivingDistance(origin, destination) останова в пользовательской функции drivingDistance(origin, destination) которая используется в ячейке моей таблицы. Проблема заключается в том, что отладчик показывает параметры, которые передаются в функцию как undefined. Содержимое любых других переменных, созданных во время выполнения, отображается правильно (хотя они не зависят от входных параметров).

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

У меня такое чувство, что проблема связана с выполнением скрипта приложений на стороне сервера, поэтому я попытался зарегистрировать входные параметры с помощью класса Logger, а также попытался скопировать эти переменные в новые локальные переменные. Но все, что я придумал, было undefined.

Еще один странный намек: этот typeof параметров возвращает String. Но получение их длины вызывает ошибку и пытается связать их с другой строкой, возвращает строку "undefined" (см. Мой экранный дамп).

enter image description here

Я ищу информацию о том, что здесь происходит.

Ответ 1

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

Вместо того, чтобы определять событие для передачи функции, вы хотите предоставить (или получить из таблицы) значения параметров.

function test_drivingDistance() {
  // Define a set of test values
  var testSet = [[ 'Washington, DC', 'Seattle, WA' ],
                 [ 'Ottawa, ON', 'Orlando, FL'],
                 [ 'Paris, France', 'Dakar, Senegal']];

  // Run multiple tests
  for (var test in testSet) {
    Logger.log('Test ' + test + ' = ' + drivingDistance(testSet[test][0],testSet[test][1]));
  }

  // Get parameters from sheet
  var TestFromSheet = drivingDistance(ss.getRange('A1').getValue(),ss.getRange('A2').getValue());
}

Вы поняли эту идею. Вы все равно можете установить контрольные точки внутри своей функции или использовать debugger для приостановки выполнения.


Изменить - просмотр аргументов

Какие аргументы - получение пользовательской функции при вызове из электронной таблицы?

Вы ограничены тем, что вы можете сделать, чтобы отлаживать это, поскольку отладчик не может использоваться для проверки вашей пользовательской функции при вызове из таблиц и ограничений безопасности для блокировки пользовательских функций. Этого может быть достаточно, чтобы получить представление о передаче аргументов в целом. Хотя функции javascript могут иметь именованные параметры, все аргументы передаются как объект типа Array, называемый arguments. Эта настраиваемая функция возвращает массив, который сообщает полученные аргументы. Когда вызывается из электронной таблицы, каждый аргумент будет отображаться в своей собственной ячейке, начиная с ячейки, в которую вы вводите функцию:

function testArguments(  ) {
  var argArray = [];
  for (var arg in arguments) {
    argArray.push("arguments[" + arg + "] = " + JSON.stringify(arguments[arg]))
  }

  return argArray;
}

Screenshot

В javascript нет таких типов, как int или float - просто Number. Эти параметры будут отображаться без кавычек на них и выглядят как цифры. Даты поступают как объекты Date, но при их печати отображаются как строки Date-y. Строки имеют котировки.

Пользовательская функция никогда не получает диапазон в качестве аргумента; когда вы предоставляете параметр диапазона в электронной таблице, его содержимое собирается в одномерный или двумерный массив, а массив является аргументом.