Comment tester une fonction de déclenchement dans le gaz?

Google Apps Script prend en charge Triggers , qui passent Events pour déclencher des fonctions. Malheureusement, l'environnement de développement vous permettra de tester les fonctions sans passer de paramètre, donc vous ne pouvez pas simuler un événement de cette façon. Si vous essayez, vous obtenez une erreur comme:

ReferenceError:' e ' n'est pas défini.

On pourrait traiter l'événement comme un paramètre facultatif, et insérer une valeur par défaut dans la fonction de déclenchement en utilisant l'une des techniques de " y a-t-il une meilleure façon de faire les paramètres optionnels de la fonction dans JavaScript? ". Mais cela introduit un risque qu'un paresseux programmeur (lever la main si c'est vous!) que le code derrière, avec des effets secondaires indésirables.

il y a sûrement de meilleurs moyens?

37
demandé sur Kos 2013-04-18 21:01:57

2 réponses

Vous pouvez écrire une fonction de test qui passe un événement simulé à votre fonction de déclenchement. Voici un exemple qui teste une fonction de déclenchement onEdit() . Il passe un objet d'événement avec toute l'information décrite pour " tableur Modifier les événements "dans comprendre les événements .

pour l'utiliser, définissez votre point de rupture dans la fonction de votre cible onEdit , sélectionnez la fonction test_onEdit et appuyez sur 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"
  });
}

si vous êtes curieux, ceci a été écrit pour tester la fonction onEdit pour feuille de calcul Google conditionnelle à trois cellules .

Voici une fonction de test pour les événements de soumission de formulaire de feuille de calcul. Il construit son événement simulé en lisant les données de soumission de formulaire. Cela a été écrit à l'origine pour obtenir TypeError dans 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);
  }
}

Conseils

lors de la simulation d'événements, veillez à apparier les objets d'événements documentés aussi près que possible.

  • Si vous souhaitez valider la documentation, vous pouvez enregistrer l'événement reçu à partir de votre fonction de déclenchement.

    Logger.log( JSON.stringify( e , null, 2 ) );
    
  • sous forme de tableur événements de soumission:

    • toutes les valeurs nommées sont des tableaux.
    • les horodateurs sont Les chaînes de caractères, et leur format seront localisés à l'emplacement de la forme. Si Lu à partir d'une feuille de calcul avec le formatage par défaut * , ils sont des objets Date. Si votre fonction de déclenchement repose sur le format de chaîne de caractères de l'horodatage (ce qui est une mauvaise idée), prenez soin de vous assurer de simuler la valeur de manière appropriée.
    • si vous avez des colonnes dans votre tableur qui ne sont pas dans votre forme, la technique dans ce script simulera un "événement" avec ces supplémentaires valeurs incluses, ce qui n'est pas ce que vous recevrez d'une soumission de formulaire.
    • comme indiqué dans numéro 4335 , le tableau values saute sur les réponses Vierges (dans" nouveaux formulaires " + "nouvelles feuilles"). La méthode filter(Boolean) est utilisée pour simuler ce comportement.

* une cellule formatée "texte simple" préservera la date comme une chaîne de caractères, et n'est pas une Bonne Idée.

66
répondu Mogsdad 2017-05-23 11:54:12

2017 Mise à jour: Déboguez les Event objects avec Stackdriver Logging pour le Script Googleapps. De la barre de menu dans l'éditeur de script, goto: View > Stackdriver Logging pour visualiser ou diffuser les logs.

de la console.log () écrira DEBUG messages de niveau

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

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

exemple onChange () :

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

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

puis vérifiez les journaux dans le Stackdriver UI étiqueté comme la message chaîne pour voir la sortie

3
répondu random-parts 2017-10-21 04:28:33