Jak Mogę przetestować funkcję spustu w gazie?

Google Apps Script obsługuje wyzwalacze, które przekazują zdarzenia do wyzwalania funkcji. Niestety, środowisko programistyczne pozwoli Ci testować funkcje bez przekazywania parametrów, więc nie możesz symulować zdarzenia w ten sposób. Jeśli spróbujesz, otrzymasz błąd w stylu:

ReferenceError: 'e' nie jest zdefiniowane.

MOŻNA POTRAKTOWAĆ zdarzenie jako opcjonalny parametr i wstawić wartość domyślną do funkcji wyzwalacza przy użyciu dowolnej z technik z " Czy istnieje lepszy sposób na wykonanie opcjonalnych parametrów funkcji w JavaScript?". Ale to wprowadza ryzyko, że leniwy programista (ręce do góry, jeśli to Ty!) pozostawi ten kod z niezamierzonymi skutkami ubocznymi.

Na pewno są lepsze sposoby?

Author: Kos, 2013-04-18

2 answers

Możesz napisać funkcję testową, która przekazuje symulowane Zdarzenie do funkcji wyzwalającej. Oto przykład, który testuje onEdit() funkcję wyzwalającą. Przekazuje obiekt event ze wszystkimi informacjami opisanymi dla "edycja zdarzeń arkusza kalkulacyjnego" w Understanding Events.

Aby go użyć, Ustaw swój punkt przerwania w docelowej funkcji onEdit, Wybierz function test_onEdit i naciśnij Debug.

/**
 * Test function for onEdit. Passes an event object to simulate an edit to
 * a cell in a spreadsheet.
 *
 * Check for updates: https://stackoverflow.com/a/16089067/1677912
 *
 * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
 */
function test_onEdit() {
  onEdit({
    user : Session.getActiveUser().getEmail(),
    source : SpreadsheetApp.getActiveSpreadsheet(),
    range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
    value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
    authMode : "LIMITED"
  });
}

Jeśli jesteś ciekawy, to zostało to napisane, aby przetestować onEdit funkcję dla Google Arkusz kalkulacyjny oparty na trzech komórkach .

Oto funkcja testowa dla zdarzeń przesyłania formularzy arkusza kalkulacyjnego. Buduje swoje symulowane zdarzenie poprzez odczyt danych przesłania formularza. To zostało pierwotnie napisane dla Getting TypeError in onformsubmit trigger?.

/**
 * Test function for Spreadsheet Form Submit trigger functions.
 * Loops through content of sheet, creating simulated Form Submit Events.
 *
 * Check for updates: https://stackoverflow.com/a/16089067/1677912
 *
 * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
 */
function test_onFormSubmit() {
  var dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
  var data = dataRange.getValues();
  var headers = data[0];
  // Start at row 1, skipping headers in row 0
  for (var row=1; row < data.length; row++) {
    var e = {};
    e.values = data[row].filter(Boolean);  // filter: https://stackoverflow.com/a/19888749
    e.range = dataRange.offset(row,0,1,data[0].length);
    e.namedValues = {};
    // Loop through headers to create namedValues object
    // NOTE: all namedValues are arrays.
    for (var col=0; col<headers.length; col++) {
      e.namedValues[headers[col]] = [data[row][col]];
    }
    // Pass the simulated event to onFormSubmit
    onFormSubmit(e);
  }
}

Porady

Podczas symulacji zdarzeń należy zadbać o to, aby udokumentowane obiekty zdarzenia były jak najbliżej.

  • Jeśli chcesz zweryfikować dokumentację, możesz zarejestrować odebrane Zdarzenie z funkcji wyzwalacza.

    Logger.log( JSON.stringify( e , null, 2 ) );
    
  • W arkuszu kalkulacyjnym zdarzenia składania:

    • wszystkie wartości namedValues są tablicami.
    • znaczniki czasu są ciągami znaków, a ich format będzie zlokalizowany zgodnie z ustawieniami regionalnymi formularza. W przypadku odczytu z arkusza kalkulacyjnego z domyślnym formatowaniem*, są to obiekty datowane. Jeśli funkcja wyzwalania opiera się na formacie ciągu znacznika czasu (co jest złym pomysłem), zadbaj o symulację wartości odpowiednio.
    • jeśli masz kolumny w arkuszu kalkulacyjnym, które nie są w formularzu, Technika w tym skrypcie symuluje "Zdarzenie" z tymi dodatkowymi wartościami, które nie są tym, co otrzymasz z przesłania formularza.
    • Jak podano w Issue 4335 , tablica values pomija puste odpowiedzi (w "nowych formularzach" + "nowych arkuszach"). Metoda filter(Boolean) jest używana do symulacji tego zachowania.

*komórka sformatowana "zwykły tekst" zachowa datę jako ciąg znaków i nie jest to dobry pomysł.

 66
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 11:54:12

2017 Aktualizacja: Debuguj Obiekty zdarzeń za pomocą rejestrowanie Stackdriver dla skryptu Google Apps. 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():

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});
}

Przykład onFormSubmit():

function onFormSubmit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    namedValues: e.namedValues,
    range:  e.range.getA1Notation(),
    value:  e.value
  }

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

Przykład onChange():

function onChange (e) {
  var debug_e = {
    authMode:  e.authMode,  
    changeType: changeType,
    user:  e.user
  }

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

Następnie sprawdź logi w Stackdriver UI oznaczony jako łańcuch message, aby zobaczyć wyjście

 3
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 04:28:33