Générer un rapport hebdomadaire de réservations de salles avec Google Apps Script
Dans cet article, nous allons explorer comment automatiser la génération d’un rapport hebdomadaire de réservations de salles dans Google Docs en utilisant Google Apps Script. Cette solution permet d’organiser facilement les informations de réservations et d’obtenir un document bien formaté, prêt à être partagé avec les équipes ou le personnel administratif.
Objectif
Notre objectif est de créer un rapport de réservation de salles contenant les informations suivantes :
- Les dates et heures de chaque réservation.
- Les détails de chaque événement, comme le titre et la description.
- Un format clair et lisible, sans lignes blanches superflues, pour faciliter la lecture et l’impression du document.
Étapes de création du script
Voici les étapes principales de notre code pour créer ce rapport.
- Création et formatage du document : Le script commence par créer un document Google Docs avec un titre indiquant la période du rapport, puis ajoute un paragraphe indiquant la date de génération du rapport.
- Boucle de traitement des salles : Pour chaque salle, nous ajoutons un titre indiquant le nom de la salle, suivi d’un tableau récapitulant les réservations. Chaque ligne du tableau présente :
- La date et l’heure de la réservation.
- Les détails de l’événement : titre et description.
- Formatage des données : Les cellules de chaque ligne du tableau sont mises en gras pour une meilleure lisibilité, et la couleur du texte des détails de l’événement est légèrement différente afin de faciliter la distinction entre les informations de date et les détails.
- Suppression des lignes blanches : Une attention particulière est portée à l’élimination des lignes blanches entre les sections, afin de garantir un document clair et professionnel.
Code du script
Voici le code complet utilisé pour créer ce rapport :
function creerRapportReservationSalles(listeEvenements, dateDebut, dateFin) { // Assurez-vous que les dates sont au format Date dateDebut = new Date(dateDebut); dateFin = new Date(dateFin); const titreDoc = `Rapport hebdomadaire de réservation de salle : ${formatterDate(dateDebut)} à ${formatterDate(dateFin)}`; const doc = DocumentApp.create(titreDoc); const corps = doc.getBody(); corps.clear(); corps.appendParagraph(titreDoc).setHeading(DocumentApp.ParagraphHeading.HEADING1); corps.appendParagraph(`Généré le : ${Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'dd/MM/yyyy')}`); listeEvenements.forEach((salle, index) => { if (!salle.nomSalle) return; // Vérifie la présence du nom de la salle corps.appendParagraph(salle.nomSalle).setHeading(DocumentApp.ParagraphHeading.HEADING2); const tableau = [['Date & Heure', 'Détails de l’événement']]; salle.evenements.forEach(evenement => { // Assurez-vous que les dates de l'événement sont au format Date const debut = new Date(evenement.debut); const fin = evenement.fin ? new Date(evenement.fin) : null; const dateHeureFormatee = formatterDateEvenement(debut, fin); const titre = evenement.titre || "Sans titre"; // Valeur par défaut si titre manquant const description = evenement.description || "Aucune description"; // Valeur par défaut si description manquante const [date, heure] = dateHeureFormatee.split(' ('); const detailsEvenement = `${titre}\nDescription : ${description}`; tableau.push([`${date}\n${heure ? heure.replace(')', '') : ''}`, detailsEvenement]); }); const tableauDoc = corps.appendTable(tableau); // Mise en forme des en-têtes const headerRow = tableauDoc.getRow(0); headerRow.getCell(0).getChild(0).asParagraph().setBold(true); headerRow.getCell(1).getChild(0).asParagraph().setBold(true); // Formate les cellules et ajuste la largeur en ajoutant un espace invisible dans la première colonne for (let i = 1; i < tableauDoc.getNumRows(); i++) { const row = tableauDoc.getRow(i); const cell1 = row.getCell(0); const cell2 = row.getCell(1); cell1.setPaddingTop(0).setPaddingBottom(0); cell2.setPaddingTop(0).setPaddingBottom(0); // Ajoute un espace dans la première cellule pour ajuster la largeur if (cell1.getNumChildren() > 0) { cell1.getChild(0).asText().appendText(" "); } // Mise en gras du contenu de chaque cellule pour les lignes d'événements cell1.getChild(0).asParagraph().setBold(true); cell2.getChild(0).asParagraph().setBold(true).setForegroundColor('#b00000'); } if (index < listeEvenements.length - 1) { corps.appendHorizontalRule(); } }); } // Fonctions de formatage function formatterDate(date) { return Utilities.formatDate(date, Session.getScriptTimeZone(), 'dd/MM/yyyy'); } function formatterDateEvenement(debut, fin) { const dateDebut = Utilities.formatDate(debut, Session.getScriptTimeZone(), 'dd/MM/yyyy'); const heureDebut = Utilities.formatDate(debut, Session.getScriptTimeZone(), 'HH:mm'); const heureFin = fin ? Utilities.formatDate(fin, Session.getScriptTimeZone(), 'HH:mm') : ''; return heureFin ? `${dateDebut} (${heureDebut} - ${heureFin})` : `${dateDebut} (${heureDebut})`; }
Explication du code
- Fonction principale : creerRapportReservationSalles reçoit une liste d’événements (listeEvenements) ainsi qu’une date de début et de fin pour définir la période du rapport.
- Fonctions de formatage : Les fonctions formatterDate et formatterDateEvenement gèrent le formatage des dates pour les rendre plus lisibles.
Résultat du code
Extension à ce code
Pour faciliter le suivi des réservations de salles de réunion et de l’agenda personnel, nous avons ajouté une fonction qui collecte automatiquement les événements de tous les agendas de salles spécifiés et de l’agenda personnel pour la semaine en cours (aujourd’hui et les 6 jours suivants).
Cette fonction, obtenirEvenementsSallesEtPersonnel, permet de centraliser tous les événements des salles de réunion et de l’agenda personnel dans un seul document Google Docs, offrant ainsi une vue d’ensemble hebdomadaire de l’occupation des salles et des événements personnels.
Code pour collecter les événements des salles et de l’agenda personnel
function obtenirEvenementsSallesEtPersonnel() { const calendrierSalles = [ "salle1@exemple.com", // Remplacez par l'ID du calendrier de la salle de réunion 1 "salle2@exemple.com", // Remplacez par l'ID du calendrier de la salle de réunion 2 // Ajoutez les autres ID de calendrier de salle ici ]; const calendrierPersonnel = Session.getEffectiveUser().getEmail(); // Votre calendrier personnel const dateDebut = new Date(); // Aujourd'hui const dateFin = new Date(); dateFin.setDate(dateDebut.getDate() + 6); // Jusqu'à 6 jours plus tard let listeEvenements = []; // Récupère les événements des salles de réunion calendrierSalles.forEach(idSalle => { const evenementsSalle = CalendarApp.getCalendarById(idSalle) .getEvents(dateDebut, dateFin) .map(evenement => ({ debut: evenement.getStartTime(), fin: evenement.getEndTime(), titre: evenement.getTitle(), description: evenement.getDescription() })); listeEvenements.push({ nomSalle: `Salle de réunion - ${idSalle}`, evenements: evenementsSalle }); }); // Récupère les événements du calendrier personnel const evenementsPersonnel = CalendarApp.getCalendarById(calendrierPersonnel) .getEvents(dateDebut, dateFin) .map(evenement => ({ debut: evenement.getStartTime(), fin: evenement.getEndTime(), titre: evenement.getTitle(), description: evenement.getDescription() })); listeEvenements.push({ nomSalle: `Agenda personnel`, evenements: evenementsPersonnel }); // Génère le rapport avec les événements récupérés creerRapportReservationSalles(listeEvenements, dateDebut, dateFin); }
Explications du code
- Définition des ID de Calendriers des Salles de Réunion :
- La liste calendrierSalles contient les identifiants (IDs) des calendriers des salles de réunion. Vous devez remplacer « salle1@exemple.com » et « salle2@exemple.com » par les IDs réels des calendriers de vos salles dans Google Agenda.
- Récupération de l’Agenda Personnel :
- La variable calendrierPersonnel utilise l’adresse e-mail de l’utilisateur actuel (via Session.getEffectiveUser().getEmail()) pour identifier son agenda personnel.
- Définition de la Période (Semaine en Cours) :
- La période est définie à partir de la date d’aujourd’hui (dateDebut) et s’étend sur 6 jours supplémentaires (dateFin). Cela couvre une semaine complète.
- Collecte des Événements des Salles :
- Pour chaque ID de salle de réunion, nous utilisons CalendarApp.getCalendarById(idSalle).getEvents(dateDebut, dateFin) pour récupérer tous les événements dans la période définie.
- Les événements sont ensuite formatés dans un tableau d’objets contenant debut, fin, titre, et description, et ajoutés à la liste listeEvenements.
- Collecte des événements de l’Agenda Personnel :
- Les événements de l’agenda personnel sont récupérés et formatés de la même manière que ceux des salles de réunion.
- Génération du rapport :
- La fonction creerRapportReservationSalles est ensuite appelée avec listeEvenements, dateDebut, et dateFin pour générer le rapport dans un document Google Docs. Cela crée un document unique contenant tous les événements pour la semaine en cours, regroupés par salle de réunion et par agenda personnel.
Utilisation
Pour utiliser cette fonctionnalité, il vous suffit d’exécuter la fonction obtenirEvenementsSallesEtPersonnel(). Cela produira un rapport dans Google Docs avec tous les événements de vos salles de réunion et de votre agenda personnel pour la semaine en cours. Cette extension rend le script particulièrement utile pour les gestionnaires de bureaux et pour toute personne souhaitant suivre l’occupation des salles et son propre emploi du temps de manière consolidée.
Ce script est un excellent exemple de la manière dont Google Apps Script peut simplifier la gestion des rapports. En générant automatiquement un document bien formaté, cette solution vous permet de gagner du temps tout en assurant une présentation professionnelle. N’hésitez pas à adapter ce code pour répondre à vos besoins spécifiques, en ajoutant par exemple des filtres pour ne sélectionner que certaines salles ou des options pour personnaliser le style du document.
Si vous souhaitez en savoir plus sur l’automatisation avec Google Apps Script, explorez nos autres articles dédiés à l’automatisation des tâches bureautiques.