Drukowanie na konsoli w Google Apps Script?

89

Jestem bardzo nowy w programowaniu (wziąłem udział w niektórych kursach JS na Codecademy). Próbuję stworzyć prosty skrypt, który określi, czy otrzymam arkusz kalkulacyjny z wynikami gry w pokera, kto powinien zapłacić komu. Otworzyłem Google Apps Script i napisałem, aby rozpocząć:

function addplayerstoArray(numplayers) {

  var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

Chodzi o to, aby utworzyć tablicę z całkowitą liczbą graczy w niej. Podczas uruchamiania kodu pomyślałem, że wypisze na konsoli „3”. Ale nic się nie stało. Powiedziało

„ReferenceError:„ console ”nie jest zdefiniowana.”

A) Czego nie rozumiem na temat działania konsoli Google Apps Script w odniesieniu do drukowania, aby zobaczyć, czy mój kod wykonuje to, co chcę?

B) Czy to problem z kodem?

jim_shook
źródło

Odpowiedzi:

144

Konsola nie jest dostępna, ponieważ kod działa w chmurze, a nie w przeglądarce. Zamiast tego użyj klasy Logger dostarczonej przez GAS:

Logger.log(playerArray[3])

a następnie przejrzyj wyniki w IDE pod Widok> Dzienniki ...

Oto dokumentacja dotycząca logowania za pomocą GAS .

Edycja: 2017-07-20 Apps skrypt udostępnia teraz również usługę Stackdriver Logging . Wyświetl te dzienniki w edytorze skryptów w obszarze Widok - Dzienniki konsoli.

Peter H.
źródło
28
Jak to się robi podczas pisania funkcji dla arkuszy kalkulacyjnych? Nie mogę znaleźć miejsca, do którego trafiają dane wyjściowe logowania.
TechplexEngineer
4
Super pomocny. Dziękuję Ci! Gdyby tylko dziennik był aktualizowany na żywo i znajdował się poza drogą do szybkiego testowania.
kevincoleman,
1
A co z szablonem HTML?
Trevor
1
W arkuszach kalkulacyjnych możesz umieścić wynik w wyskakującym okienku za pomocą MsgBox lub na pasku bocznym za pomocą paska bocznego. Możesz również umieścić go w prześcieradle na uboczu.
vinnief
Do rejestrowania arkuszy kalkulacyjnych tutaj pasuje biblioteka BetterLog
Igor Savinkin
17

Aby zbudować na powyższym zhackowanym rozwiązaniu Vinniefa, używam MsgBox w następujący sposób:

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

i zachowuje się jak punkt przerwania, zatrzymuje skrypt i wysyła potrzebny ciąg do wyskakującego okienka. Szczególnie w Arkuszach, gdzie mam problem z Logger.log, zapewnia to odpowiednie obejście w większości przypadków.

skathan
źródło
12

Mimo że Logger.log()jest to technicznie poprawny sposób wyprowadzenia czegoś na konsolę, ma kilka niedogodności:

  1. Rezultatem może być nieuporządkowany bałagan i trudny do szybkiego strawienia.
  2. Musisz najpierw uruchomić skrypt, a następnie kliknąć View / Logs, co oznacza dwa dodatkowe kliknięcia (jedno, jeśli pamiętasz skrót klawiaturowy Ctrl + Enter).
  3. Musisz wstawić Logger.log(playerArray), a następnie po debugowaniu prawdopodobnie zechcesz usunąć Logger.log(playerArray), stąd dodatkowe 1-2 dodatkowe kroki.
  4. Musisz kliknąć OK, aby zamknąć nakładkę (jeszcze jedno dodatkowe kliknięcie).

Zamiast tego, gdy chcę coś debugować, dodaję punkty przerwania (kliknij numer wiersza) i naciśnij przycisk Debuguj (ikona błędu). Punkty przerwania działają dobrze, gdy przypisujesz coś do zmiennej, ale nie tak dobrze, gdy inicjujesz zmienną i chcesz zajrzeć do niej w późniejszym momencie, co jest podobne do tego, co próbuje zrobić operacja. W tym przypadku wymusiłbym warunek przerwania, wprowadzając „x” (x oznacza miejsce!), Aby wyświetlić błąd czasu wykonania:

wprowadź opis obrazu tutaj

Porównaj z przeglądaniem dzienników:

wprowadź opis obrazu tutaj

Konsola debugowania zawiera więcej informacji i jest o wiele łatwiejsza do odczytania niż nakładka Dzienniki. Jedną z drobnych zalet tej metody jest to, że nigdy nie musisz się martwić o zanieczyszczenie swojego kodu wieloma poleceniami rejestrowania, jeśli chcesz zachować czysty kod. Nawet jeśli wpiszesz "x", będziesz zmuszony pamiętać o usunięciu go w ramach procesu debugowania, w przeciwnym razie twój kod nie będzie działał (wbudowany środek czyszczący, yay).

thdoan
źródło
1
dodawanie xmiałoby taką samą funkcjonalność jak dodawaniedebugger;
JSDBroughton,
Kompletnie się zgadzam. Logger.log nie jest użyteczny w porównaniu do debugowania.
Steve Gon
10

Odpowiadanie na pytania PO

A) Czego nie rozumiem na temat działania konsoli Google Apps Script w odniesieniu do drukowania, aby zobaczyć, czy mój kod wykonuje to, co chcę?

Kod plików .gs projektu Google Apps Script jest uruchamiany na serwerze, a nie w przeglądarce internetowej. Sposobem na rejestrowanie komunikatów było użycie Class Logger .

B) Czy to problem z kodem?

Jak powiedział komunikat o błędzie, problem polegał na tym, że consolenie został zdefiniowany, ale obecnie ten sam kod będzie generował inny błąd:

ReferenceError: nie zdefiniowano elementu „playerArray”. (wiersz 12, plik „Kod”)

Dzieje się tak, ponieważ playerArray jest zdefiniowana jako zmienna lokalna. Przeniesienie linii z funkcji rozwiąże ten problem.

var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

Teraz, gdy kod jest wykonywany bez generowania błędów, zamiast spojrzeć na konsolę przeglądarki, powinniśmy przyjrzeć się usłudze Stackdriver Logging. W interfejsie użytkownika edytora Google Apps Script kliknij Widok> Stackdriver Logging .

Uzupełnienie

W 2017 roku Google wypuściło do wszystkich skryptów Stackdriver Logging i dodało Class Console, więc dołączenie czegoś takiego jak console.log('Hello world!')nie spowoduje błędu ale log będzie na Google Cloud Platform Stackdriver Logging Service zamiast w konsoli przeglądarki.

Z Google Apps Script Release Notes 2017

23 czerwca 2017 r

Usługa Stackdriver Logging została usunięta z wczesnego dostępu. Wszystkie skrypty mają teraz dostęp do logowania w usłudze Stackdriver.

Z Logging> Stackdriver logging

Poniższy przykład pokazuje, jak używać usługi konsoli do rejestrowania informacji w usłudze 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.
}
Rubén
źródło
6

W projekcie skryptu Google możesz tworzyć pliki html (przykład: index.html) lub pliki gs (przykład: code.gs). Pliki .gs są wykonywane na serwerze i możesz użyć Logger.log, jak opisuje @Peter Herrman. Jeśli jednak funkcja jest utworzona w pliku .html, jest wykonywana w przeglądarce użytkownika i możesz użyć console.log. Konsolę przeglądarki Chrome można wyświetlić , naciskając Ctrl Shift J w systemie Windows / Linux lub Cmd Opt J na komputerze Mac

Jeśli chcesz użyć Logger.log na plik HTML można użyć scriptlet aby wywołać funkcję Logger.log z pliku html. Aby to zrobić, wstawiłbyś <? Logger.log (coś)?> Podmieniam coś na cokolwiek chcesz logować. Standardowe skrypty, które używają składni <? ...?>, wykonaj kod bez jawnego wysyłania treści na stronę.

Tanya Gupta
źródło
2

Zaktualizowano na rok 2020

W lutym 2020 r. Firma Google ogłosiła poważną aktualizację do wbudowanego środowiska IDE Google Apps Script, które obsługuje teraz console.log () . Możesz więc teraz używać obu:

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

Miłego kodowania!

Davis Jones
źródło
console.logbył obsługiwany wcześniej niż wspomniana aktualizacja (patrz moja odpowiedź )
Rubén