Печать на консоли в скрипте Google Apps?

87

Я очень новичок в программировании (прошел несколько курсов JS по Codecademy). Я пытаюсь создать простой скрипт, чтобы определить, если дана таблица с результатами игры в покер, кто кому должен платить. Я открыл скрипт Google Apps и для начала написал следующее:

function addplayerstoArray(numplayers) {

  var playerArray = [];

  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

Идея состоит в том, чтобы создать массив с общим количеством игроков в нем. При запуске кода я думал, что он выведет на консоль «3». Но ничего не произошло. Он сказал

"ReferenceError:" console "не определено."

A) Что я не понимаю в том, как консоль скриптов Google Apps работает в отношении печати, чтобы я мог видеть, выполняет ли мой код то, что мне нужно?

Б) Это проблема с кодом?

jim_shook
источник

Ответы:

139

Консоль недоступна, потому что код выполняется в облаке, а не в вашем браузере. Вместо этого используйте класс Logger, предоставленный GAS:

Logger.log(playerArray[3])

а затем просмотрите результаты в среде IDE в разделе «Просмотр»> «Журналы ...».

Вот некоторая документация по регистрации с помощью GAS .

Изменить: 2017-07-20 Скрипт приложений теперь также обеспечивает ведение журнала Stackdriver . Просмотрите эти журналы в редакторе сценариев в разделе «Просмотр» - «Журналы консоли».

Питер Х
источник
28
Как это делается при написании функций для электронных таблиц? Кажется, я не могу найти, куда идет вывод журнала.
TechplexEngineer,
4
Очень полезно. Спасибо! Теперь, если бы только журнал обновлялся в реальном времени и находился в недоступном для быстрого тестирования месте.
kevincoleman
1
А как насчет HTML-шаблона?
Trevor
1
В электронных таблицах вы можете поместить результат во всплывающее окно с помощью MsgBox или на боковой панели с помощью боковой панели. Вы также можете положить его в простыню в недоступном месте.
vinnief
Для ведения журнала электронных таблиц здесь подходит библиотека BetterLog
Игорь Савинкин
17

Чтобы использовать взломанное решение vinnief, описанное выше, я использую MsgBox следующим образом:

Browser.msgBox('BorderoToMatriz', Browser.Buttons.OK_CANCEL);

и он действует как точка останова, останавливает скрипт и выводит нужную строку во всплывающее окно. Я особенно нахожу в Таблицах, где у меня проблемы с Logger.log, в большинстве случаев это обеспечивает адекватный обходной путь.

скатан
источник
12

Несмотря на то, что Logger.log()это технически правильный способ вывода чего-либо на консоль, у него есть несколько неприятностей:

  1. Результатом может быть неструктурированный беспорядок, который трудно быстро переварить.
  2. Вы должны сначала запустить скрипт, а затем щелкнуть View / Logs, что означает два дополнительных щелчка (один, если вы помните сочетание клавиш Ctrl + Enter).
  3. Вам нужно вставить Logger.log(playerArray), а затем после отладки вы, вероятно, захотите удалить Logger.log(playerArray), следовательно, еще 1-2 дополнительных шага.
  4. Вы должны нажать OK, чтобы закрыть наложение (еще один дополнительный щелчок).

Вместо этого, когда я хочу что-то отладить, я добавляю точки останова (щелкаю номер строки) и нажимаю кнопку «Отладка» (значок ошибки). Точки останова работают хорошо, когда вы присваиваете что-то переменной, но не так хорошо, когда вы запускаете переменную и хотите заглянуть внутрь нее позже, что похоже на то, что пытается сделать оператор. В этом случае я бы принудительно поставил условие прерывания, введя «x» (x отмечает точку!), Чтобы выдать ошибку времени выполнения:

введите описание изображения здесь

Сравните с просмотром журналов:

введите описание изображения здесь

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

thdoan
источник
1
добавление xбудет иметь те же функции, что и добавлениеdebugger;
JSDBroughton
Полностью согласен. Logger.log бесполезен по сравнению с Debug.
Стив Гон
10

Отвечая на вопросы OP

A) Что я не понимаю в том, как консоль скриптов Google Apps работает в отношении печати, чтобы я мог видеть, выполняет ли мой код то, что мне нужно?

Код в файлах .gs проекта скрипта Google Apps выполняется на сервере, а не в веб-браузере. Для записи сообщений в журнал использовалось средство ведения журнала классов .

Б) Это проблема с кодом?

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

ReferenceError: playerArray не определен. (строка 12, файл «Код»)

Это потому, что playerArray определяется как локальная переменная. Эту проблему решит перенос строки из функции.

var playerArray = [];

function addplayerstoArray(numplayers) {
  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

Теперь, когда код выполняется без ошибок, вместо того, чтобы смотреть в консоль браузера, мы должны взглянуть на Stackdriver Logging. В пользовательском интерфейсе редактора скриптов Google Apps нажмите « Просмотр»> «Ведение журнала Stackdriver» .

Дополнение

В 2017 году Google выпустил для всех скриптов Stackdriver Logging и добавил консоль классов, поэтому включение чего-то вроде console.log('Hello world!')ошибки не вызовет, но журнал будет находиться в службе журналов Stackdriver Logging Service облачной платформы Google, а не в консоли браузера.

Из примечаний к выпуску Google Apps Script 2017

23 июня 2017 г.

Stackdriver Logging удален из раннего доступа. Все скрипты теперь имеют доступ к ведению журнала Stackdriver.

Из журнала> Ведение журнала Stackdriver

В следующем примере показано, как использовать консольную службу для регистрации информации в Stackdriver.

function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "structPayload".
  var parameters = {
      isValid: true,
      content: 'some string',
      timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});

  var label = 'myFunction() time';  // Labels the timing log entry.
  console.time(label);              // Starts the timer.
  try {
    myFunction(parameters);         // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label);      // Stops the timer, logs execution duration.
}
Рубен
источник
6

В проекте скрипта Google вы можете создавать файлы HTML (пример: index.html) или файлы gs (пример: code.gs). Файлы .gs выполняются на сервере, и вы можете использовать Logger.log, как описывает @Peter Herrman. Однако, если функция создается в файле .html, она выполняется в браузере пользователя, и вы можете использовать console.log. Консоль браузера Chrome можно просмотреть , нажав Ctrl Shift J в Windows / Linux или Cmd Opt J на ​​Mac

Если вы хотите использовать Logger.log в html-файле, вы можете использовать скриптлет для вызова функции Logger.log из html-файла. Для этого вы должны вставить <? Logger.log (что-то)?> Заменяя что-то тем, что вы хотите зарегистрировать. Стандартные скриптлеты, использующие синтаксис <? ...?> выполнить код без явного вывода содержимого на страницу.

Таня Гупта
источник
2

Обновлено на 2020 год

В феврале 2020 года Google объявил о крупном обновлении встроенной среды разработки скриптов Google Apps, которая теперь поддерживает console.log () . Итак, теперь вы можете использовать оба:

  1. Logger.log ()
  2. console.log ()

Удачного кодирования!

Дэвис Джонс
источник
console.logподдерживалось до указанного обновления (см. мой ответ )
Рубен