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

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

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

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

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

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

enter image description here

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

1 ответов


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

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

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 приостановить выполнение.


Edit-изучение аргументов

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

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

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

  return argArray;
}

Screenshot

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

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