Друкувати на консолі в Google Apps Script?


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 Script щодо друку, щоб я міг перевірити, чи виконує мій код те, що я хотів би?

Б) Це проблема з кодом?

Відповіді:


139

Консоль недоступна, оскільки код працює у хмарі, а не у вашому браузері. Натомість використовуйте клас Logger, наданий GAS:

Logger.log(playerArray[3])

а потім перегляньте результати в IDE у меню Перегляд> Журнали ...

Ось документація щодо реєстрації за допомогою GAS .

Редагувати: 2017-07-20 Сценарій додатків тепер також забезпечує ведення журналу Stackdriver . Перегляньте ці журнали в редакторі сценаріїв у розділі Перегляд - Журнали консолі.


28
Як це робиться під час написання функцій для електронних таблиць? Здається, я не можу знайти, куди йде вихід журналу.
TechplexEngineer

4
Дуже корисно. Дякую! Тепер, якби тільки журнал оновлювався в режимі реального часу та знаходився поза місцем для швидкого тестування.
kevincoleman

1
А як щодо шаблону HTML?
Тревор,

1
У електронних таблицях ви можете вивести вивід у спливаюче вікно за допомогою MsgBox або на бічну панель із бічною панеллю. Ви також можете покласти його на аркуші в недоступному для вас місці.
vinnief

Для роботи з електронними таблицями тут підходить бібліотека BetterLog
Ігор Савінкін

17

Просто для того, щоб спиратися на вищезазначене рішення Vinnief, я використовую MsgBox так:

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

і це діє як точка розриву, зупиняє сценарій і виводить будь-який рядок, який вам потрібен, у спливаюче вікно. Особливо я знаходжу в Таблицях, де у мене проблеми з Logger.log, це забезпечує адекватне обхідне рішення у більшості випадків.


12

Незважаючи на те Logger.log(), що технічно правильний спосіб вивести щось на консоль, він має кілька прикрощів:

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

Натомість, коли я хочу щось налагодити, я додаю точки зупинку (клацніть номер рядка) і натискаю кнопку Налагодження (піктограма помилки). Точки зупинку добре працюють, коли ви призначаєте щось змінній, але не так добре, коли ініціюєте змінну і хочете зазирнути всередину її пізніше, що схоже на те, що намагається зробити оператор. У цьому випадку я б змусив умову розриву, ввівши "x" (x позначає місце!), Щоб викинути помилку під час виконання:

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

Порівняйте з переглядом журналів:

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

Консоль налагодження містить більше інформації та набагато легша для читання, ніж накладення журналів. Одна незначна перевага цього методу полягає в тому, що вам ніколи не доведеться турбуватися про забруднення коду безліччю команд реєстрації, якщо збереження чистого коду - це ваша справа. Навіть якщо ви введете "x", ви будете змушені не забути видалити його як частину процесу налагодження, інакше ваш код не буде запущений (вбудований засіб очищення, yay).


1
додавання xбуде такою ж функціональністю, як додаванняdebugger;
JSDBroughton

Повністю згоден. Logger.log не корисний у порівнянні з налагодженням.
Стів Гон,

10

Відповідаючи на питання OP

A) Що я не розумію в тому, як працює консоль Google Apps Script щодо друку, щоб я міг перевірити, чи виконує мій код те, що я хотів би?

Код у .gs-файлах проекту Google Apps Script працює на сервері, а не у веб-браузері. Спосіб реєстрації повідомлень полягав у використанні реєстратора класів .

Б) Це проблема з кодом?

Як зазначалося в повідомленні про помилку, проблема полягала в тому, що 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. У інтерфейсі редактора сценаріїв Google Apps натисніть Вигляд> Ведення журналу Stackdriver .

Додаток

У 2017 році Google випустив для всіх сценаріїв Stackdriver Logging і додав консоль класів, тому включення чогось подібного console.log('Hello world!')не призведе до помилки, але журнал буде знаходитися в Google Cloud Platform Stackdriver Logging Service замість консолі браузера.

З приміток до випуску сценаріїв Google Apps 2017 року

23 червня 2017 р

Ведення журналу Stackdriver було вилучено з дочасного доступу. Усі сценарії тепер мають доступ до ведення журналу 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 Script, і тепер він підтримує console.log () . Отже, тепер ви можете використовувати обидва:

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

Щасливого кодування!


console.logпідтримувалося раніше, ніж зазначене оновлення (див. мою відповідь )
Рубен,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.