Jak debugować Google Apps Script (aka gdzie robi Logger.log log to?)

W Arkuszach Google można dodać kilka funkcji skryptowych. Dodaję coś na wydarzenie onEdit, ale nie wiem czy działa. O ile wiem, nie możesz debugować zdarzenia live z Arkuszy Google, więc musisz to zrobić z debuggera, co jest bezcelowe, ponieważ argument zdarzenia przekazany do mojej funkcji onEdit() będzie zawsze niezdefiniowany, jeśli uruchomię go z Script Editor.

Więc próbowałem użyć metody Logger.log do zapisania niektórych danych za każdym razem, gdy wywoływana jest funkcja onEdit, ale to też wygląda na to, że działa tylko wtedy, gdy uruchamia się z Script Editor. Kiedy uruchamiam go z Script Editor, mogę przeglądać dzienniki, przechodząc do View->Logs...

Miałem nadzieję, że będę w stanie zobaczyć dzienniki z czasu, kiedy zdarzenie zostanie wykonane, ale nie mogę tego rozgryźć.

Jak debugować te rzeczy?

Author: Kos, 2012-07-18

10 answers

Logger.log albo wyśle Ci e-mail (ostatecznie) o błędach, które wystąpiły w Twoich skryptach, lub, jeśli uruchamiasz rzeczy z Script Editor, możesz wyświetlić Dziennik z ostatniej funkcji run, przechodząc do View->Logs (nadal w Edytorze skryptów). Ponownie, to pokaże tylko wszystko, co było zalogowane z ostatniej funkcji, którą uruchomiłeś od wewnątrz Script Editor.

Skrypt, który próbowałem uruchomić, miał związek z arkuszami kalkulacyjnymi - zrobiłem arkusz kalkulacyjny todo-checklist type, który posortował pozycje według priorytetów i takie tam.

Jedynymi wyzwalaczami, które zainstalowałem dla tego skryptu były wyzwalacze onOpen i onEdit. Debugowanie wyzwalacza onEdit było najtrudniejsze do zrozumienia, ponieważ myślałem, że jeśli ustawię punkt przerwania w mojej funkcji onEdit, otworzę arkusz kalkulacyjny, edytuję komórkę, mój punkt przerwania zostanie uruchomiony. Tak nie jest.

Aby symulować edytowanie komórki, ja zrobiłem w końcu musiałem zrobić coś w rzeczywistym arkuszu kalkulacyjnym. All I czy upewniłem się, że komórka, którą chciałem traktować jako "edytowaną", została wybrana, a następnie w Script Editor, poszedłem do Run->onEdit. Wtedy mój punkt przerwania zostanie trafiony.

Jednak musiałem przestać używać argumentu event, który jest przekazywany do funkcji onEdit - nie można tego symulować wykonując Run->onEdit. Wszelkie potrzebne informacje z arkusza kalkulacyjnego, takie jak wybrana komórka itp., musiałem dowiedzieć się ręcznie.

W każdym razie, długa odpowiedź, ale rozgryzłem to w końcu.


EDIT :

Jeśli chcesz zobaczyć listę zadań, które zrobiłem, możesz sprawdzić ją tutaj

(tak, Wiem, że każdy może to edytować - o to właśnie chodzi!)

Miałem nadzieję, że to pozwoli Ci zobaczyć scenariusz, jak również. Ponieważ nie widać go tam, oto jest:

function onOpen() {
  setCheckboxes();
};

function setCheckboxes() {
  var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
  var checklist_data_range = checklist.getDataRange();
  var checklist_num_rows = checklist_data_range.getNumRows();
  Logger.log("checklist num rows: " + checklist_num_rows);

  var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
  var coredata_data_range = coredata.getDataRange();

  for(var i = 0 ; i < checklist_num_rows-1; i++) {
    var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
    var item_id = split[split.length - 1];
    if(item_id != "") {
      item_id = parseInt(item_id);
      Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
      checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
    }
  }
}

function onEdit() {
  Logger.log("TESTING TESTING ON EDIT");
  var active_sheet = SpreadsheetApp.getActiveSheet();
  if(active_sheet.getName() == "checklist") {
    var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
    Logger.log("active_range: " + active_range);
    Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
    Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
    Logger.log("active_range. colidx: " + active_range.getColumnIndex());
    if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
      Logger.log("made it!");
      var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
      var val = next_cell.getValue();
      Logger.log("val: " + val);
      var splits = val.split(" || ");
      var item_id = splits[splits.length-1];
      Logger.log("item_id: " + item_id);

      var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
      var sheet_data_range = core_data.getDataRange();
      var num_rows = sheet_data_range.getNumRows();
      var sheet_values = sheet_data_range.getValues();
      Logger.log("num_rows: " + num_rows);

      for(var i = 0; i < num_rows; i++) {
        Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
        if(sheet_values[i][8] == item_id) {
          Logger.log("found it! tyring to set it...");
          sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
        }
      }

    }
  }

  setCheckboxes();
};
 58
Author: Markus Orreilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 11:18:35

Z tego, co wiem, nie można debugować zdarzenia live z Google docs, więc musisz to zrobić z debuggera, co jest bezcelowe, ponieważ argument zdarzenia przekazany do mojej funkcji onEdit () będzie zawsze niezdefiniowany, jeśli uruchomię go z Edytora Skryptów.

True-więc sam zdefiniuj argument zdarzenia do debugowania. Zobacz Jak mogę przetestować funkcję wyzwalacza w gazie?

Próbowałem użyć rejestratora.metoda log do logowania niektórych danych za każdym razem, gdy onedit funkcja zostanie wywołana, ale to też wygląda na to, że działa tylko wtedy, gdy jest uruchamiana z Edytora Skryptów. Kiedy uruchamiam go z Edytora Skryptów, mogę przeglądać dzienniki, przechodząc do Widok - >dzienniki...
Znowu prawda, ale jest pomoc. Biblioteka BetterLog Petera Hermanna przekieruje wszystkie logi do arkusza kalkulacyjnego, umożliwiając logowanie nawet z kodu, który nie jest dołączony do instancji edytora / debuggera.

Jeśli kodujesz na przykład skrypt zawierający arkusz kalkulacyjny, możesz dodać tylko ta jedna linia do góry pliku skryptu, a wszystkie dzienniki trafią do arkusza "dzienniki" w arkuszu kalkulacyjnym. Nie jest potrzebny żaden inny kod, wystarczy użyć Logger.log() Jak zwykle:

Logger = BetterLog.useSpreadsheet();
 29
Author: Mogsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:21

2017 Aktualizacja: rejestrowanie Stackdriver jest teraz dostępne dla Google Apps Script. Z paska menu w Edytorze skryptów, goto: View > Stackdriver Logging aby przeglądać lub przesyłać strumieniowo dzienniki.

Konsola.log () zapisze DEBUG wiadomości poziomu

Przykład onEdit() logowanie:

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

Następnie sprawdź logi w Stackdriver UI oznakowane onEdit() Event Object, aby zobaczyć wyjście

 6
Author: random-parts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 21:25:21

Jeśli masz otwarty Edytor skryptów, zobaczysz logi w widoku - >Logi. Jeśli twój skrypt ma WYZWALACZ onedit, dokonaj zmiany w arkuszu kalkulacyjnym, która powinna wywołać funkcję z edytorem skryptów otwartym na drugiej karcie. Następnie przejdź do zakładki Edytor skryptów i Otwórz dziennik. Zobaczysz, co twoja Funkcja Przechodzi do REJESTRATORA.

W zasadzie tak długo, jak edytor skryptów jest otwarty, Zdarzenie zapisze do dziennika i wyświetli go dla Ciebie. Nie pokaże, czy ktoś inny jest w akta gdzie indziej.

 5
Author: Karl_S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-28 12:51:30

Trochę hacky, ale stworzyłem tablicę o nazwie "console" i za każdym razem, gdy chciałem wyprowadzić na konsolę, pchałem ją do tablicy. Wtedy, gdy chciałem zobaczyć rzeczywisty wynik, po prostu zwracałem console zamiast tego, co zwracałem wcześniej.

    //return 'console' //uncomment to output console
    return "actual output";
}
 4
Author: woojoo666,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-24 09:11:52

Mam ten sam problem, znalazłem gdzieś poniżej w sieci....

Procedury obsługi zdarzeń w dokumentach są jednak nieco skomplikowane. Ponieważ docs może obsługiwać wiele jednoczesnych edycji przez wielu użytkowników, procedury obsługi zdarzeń są obsługiwane po stronie serwera. Głównym problemem tej struktury jest to, że gdy skrypt wyzwalający zdarzenie nie powiedzie się, nie powiedzie się na serwerze. Jeśli chcesz zobaczyć informacje o debugowaniu, musisz skonfigurować jawny WYZWALACZ w menu wyzwalacze, które wysyła Ci informacje o debugowaniu, gdy zdarzenie nie powiedzie się, albo zawiedzie po cichu.

 3
Author: Angus Keenan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-07 13:06:29

Jest daleki od elegancji, ale podczas debugowania często loguję się do Loggera, a następnie używam getLog(), Aby pobrać jego zawartość. Wtedy ja albo:

  • zapisz wyniki do zmiennej (którą można sprawdzić w debuggerze skryptów Google-działa to w przypadkach, gdy nie mogę ustawić punktu przerwania w jakimś kodzie, ale mogę ustawić jeden w kodzie, który zostanie wykonany później)
  • zapisz go do jakiegoś tymczasowego elementu DOM
  • Wyświetl go w alarm

Zasadniczo, to po prostu staje się wyjście JavaScript problem.

Rażąco brakuje funkcjonalności nowoczesnych implementacji console.log(), ale Rejestrator nadal pomaga debugować Skrypty Google.

 1
Author: Michael Scheper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-18 15:36:18

Obecnie ograniczasz się do kontenera związanego z używaniem skryptów w dokumentach. Jeśli utworzysz nowy skrypt poza dokumentami, będziesz mógł eksportować informacje do arkusza kalkulacyjnego google i używać go jak narzędzia do rejestrowania.

Na przykład w pierwszym bloku kodu

function setCheckboxes() {

    // Add your spreadsheet data
    var errorSheet = SpreadsheetApp.openById('EnterSpreadSheetIDHere').getSheetByName('EnterSheetNameHere');
    var cell = errorSheet.getRange('A1').offset(errorSheet.getLastRow(),0);

    // existing code
    var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
    var checklist_data_range = checklist.getDataRange();
    var checklist_num_rows = checklist_data_range.getNumRows();

    // existing logger
    Logger.log("checklist num rows: " + checklist_num_rows);

   //We can pass the information to the sheet using cell.setValue()
    cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows);

Kiedy pracuję z gazem mam dwa monitory ( można użyć dwóch okien ) skonfigurowane z jednym zawierającym środowisko gazowe, a drugim zawierającym SS, więc mogę pisać informacje do i log.

 0
Author: JForgie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 16:45:41

Tylko jako zawiadomienie. Zrobiłem funkcję testową dla mojego arkusza kalkulacyjnego. Używam zmiennej google rzuca w funkcji onEdit (e) (nazwałem ją e). Potem zrobiłem funkcję testową taką:

function test(){
var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7)
var testObject = {
    range:testRange,
    value:"someValue"
}
onEdit(testObject)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog())
}

Wywołanie tej funkcji testowej powoduje, że cały kod jest uruchamiany tak, jak miało to miejsce w arkuszu kalkulacyjnym. Po prostu włożyłem w posiadanie komórki, którą edytowałem whitch dał mi nieoczekiwany wynik, ustawiając wartość jako wartość, którą włożyłem do komórki. OBS! aby uzyskać więcej zmiennych googles daje do funkcji przejdź tutaj: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

 0
Author: Meltinglava Outland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-26 11:40:46

Dev console będzie rejestrować błędy rzucane przez skrypt aplikacji, więc możesz po prostu wyrzucić błąd, aby go zarejestrować jako normalną konsolę.log. Zatrzyma wykonanie, ale nadal może być przydatny do debugowania krok po kroku.

throw Error('hello world!');

Pojawi się w konsoli podobnie jak console.log('hello world')

 0
Author: qwerty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 13:54:20