it-swarm.com.ru

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

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

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

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

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

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

enter image description here

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

29
Jpsy

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

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

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


Редактировать - изучение аргументов

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

Вы ограничены в том, что вы можете сделать для отладки, поскольку отладчик не может использоваться для проверки вашей пользовательской функции при вызове из Sheets, а ограничения безопасности для пользовательских функций блокируют ведение журнала. Этого может быть достаточно, чтобы получить представление о передаче аргумента в целом. Хотя функции 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 - просто Number. Эти параметры будут отображаться без кавычек и будут выглядеть как цифры. Даты поступают как объекты Date, но при печати таким образом отображаются как строки Date-y. Строки имеют кавычки.

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

34
Mogsdad

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

function TEST(input) {
  return (JSON.stringify(input));
}

Результаты будут отображаться на вашем листе так:

 enter image description here

0
Joseph Combs