web-dev-qa-db-fra.com

Comment puis-je tester une fonction de déclenchement dans GAS?

Google Apps Script prend en charge déclencheurs , qui passent événements pour déclencher des fonctions. Malheureusement, l'environnement de développement vous permettra de tester des fonctions sans passer de paramètre, vous ne pouvez donc 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 " Existe-t-il une meilleure façon de faire des paramètres de fonction facultatifs en JavaScript? ". Mais cela introduit un risque qu'un programmeur paresseux (levez la main si c'est vous!) Laisse ce code derrière lui, avec des effets secondaires imprévus.

Il y a sûrement de meilleures façons?

43
Mogsdad

Vous pouvez écrire une fonction de test qui transmet un événement simulé à votre fonction de déclenchement. Voici un exemple qui teste une fonction de déclenchement onEdit(). Il transmet un objet événement avec toutes les informations décrites pour "Spreadsheet Edit Events" dans nderstanding Events .

Pour l'utiliser, définissez votre point d'arrêt dans votre fonction 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, cela 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 du formulaire. Cela a été écrit à l'origine pour Obtenir TypeError dans le déclencheur onFormSubmit? .

/**
 * 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 à faire correspondre les objets d'événement documentés aussi près que possible.

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

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

    • toutes les valeurs namedValues ​​sont des tableaux.
    • Les horodatages sont des chaînes et leur format sera localisé dans les paramètres régionaux du formulaire. Si lu à partir d'une feuille de calcul avec une mise en forme par défaut*, ce sont des objets Date. Si votre fonction de déclenchement repose sur le format de chaîne de l'horodatage (qui est une mauvaise idée), veillez à simuler la valeur de manière appropriée.
    • Si vous avez des colonnes dans votre feuille de calcul qui ne sont pas dans votre formulaire, la technique de ce script simulera un "événement" avec ces valeurs supplémentaires incluses, ce qui n'est pas ce que vous recevrez d'une soumission de formulaire.
    • Comme indiqué dans problème 4335 , le tableau values saute les réponses vides (dans "nouveaux formulaires" + "nouvelles feuilles"). La méthode filter(Boolean) est utilisée pour simuler ce comportement.

*Une cellule au format "texte brut" conservera la date sous forme de chaîne et n'est pas une bonne idée.

72
Mogsdad

Mise à jour 2017: Déboguez le Objets d'événement avec Stackdriver Logging pour le script Google Apps. Dans la barre de menus de l'éditeur de script, goto: View > Stackdriver Logging pour afficher ou diffuser les journaux.

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

Vérifiez ensuite les journaux dans Stackdriver UI étiquetés comme la chaîne message pour voir la sortie

6
random-parts