Google Agenda et Sheets : synchroniser et mettre à jour des événements d’un agenda dans une feuille de calcul et vice-versa

0
150

La question de la gestion du temps est récurrente dans le suivi de tous les projets menés en même temps. En tant qu’indépendant, je dois gérer une dizaine de projets simultanément, dont certains sont facturés au temps passé, et les clients me demandent un suivi circonstancié des heures passées.

Comment suivre le temps passé sur un projet ? Faut-il saisir les événements dans Sheets (je saisis dans une feuille de calcul le numéro du projet, une date et heure de début et de fin… pff, galère et comment être sûr de ne pas oublier des événements) ? Ou bien faut-il saisir naturellement les événements dans mon agenda et ensuite les recopier dans une feuille de calcul (je récupère facilement le temps passé réel mais c’est compliqué d’associer l’événement à un projet précisément en suivant une règle de nommage stricte et facile à oublier).

Quel dilemme !

Voici une proposition de compromis exploitant les forces de chaque application :

logo Google Agenda
  • Google Agenda pour saisir, modifier, supprimer les événements, créer des rappels, gérer les invitations et les visio-conférences sur Meet.

apercu Agenda
Logo Google Sheets
  • Google Sheets pour recueillir les événements, calculer le temps passé, associer l’événement à un projet et créer des rapports personnalisés à mes clients.
apercu recueil des evenements

J’ai donc créé deux scripts d’interactions entre Agenda et Sheets que je vous soumets ici en version simplifiée.

  • Récupérer automatiquement chaque nuit la liste des événements de mon agenda dans Sheets.
  • Associer dans Sheets l’événement à un projet.
  • Modifier l’événement dans l’agenda en y ajoutant en fin de titre l’ID du projet entre crochets.
  • Extraire l’ID du projet du titre de l’événement pour suivre le temps passé par projet dans un TCD.

Script pour récupérer les événements de Google Agenda vers Sheets

  • Ouvrez une feuille de calcul Sheets listant vos projets.
  • Nommez un onglet « TEMPS PASSÉ ».
  • Créez un script (Outil / Éditeur de script).
  • Supprimez la fonction par défaut et copiez collez le code suivant :
/*****
 * 
 * @authour: antoine.martin@amcms.net 
 * @owner: numericoach 
 * @date: 2021 
 * 
 * tous droits réservés
 * 
 ****/

function listEvents() {

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetTemps = ss.getSheetByName("TEMPS PASSE");

  const agenda = CalendarApp.getDefaultCalendar(); 

  const dateAujourdhui = new Date();

  // Date à partir de laquelle vous souhaitez mettre à jour la liste d’événements de votre agenda : ici le 31/12/2021
 const dateDebut = new Date(2020, 12, 31);

  // Date de fin de mise à jour : ici deux mois après la date d'aujourd'hui
  const dateFin = new Date(dateAujourdhui.getFullYear(),dateAujourdhui.getMonth()+2, dateAujourdhui.getDate());
 
  const events = agenda.getEvents(dateDebut, dateFin);

  let temps = [];
  events.forEach(function (event) {
    const eventId = event.getId();
    const eventTimeDebut = event.getStartTime();
    const eventTimeFin = event.getEndTime();
    const eventTitre = event.getTitle(); 
    let guestListe = [] ;

  // Si je ne suis pas le créateur de l'évenement, indiquer qui c'est
    if (!event.isOwnedByMe()) {
      guestListe = event.getCreators();
    }

  // Recueillir la liste des invités
    const eventInvitations = event.getGuestList();

    eventInvitations.forEach(function (guest) {
      const guestEmail = guest.getEmail();
      let guestName = guest.getName();
      if (guestName == "") { guestName = guestEmail; }
      guestListe.push(guestName + " (" + guest.getStatus() + ")");
    });

    temps.push([eventId, eventTimeDebut, eventTimeFin, eventTitre, guestListe.join("\n") ]);


  }) 

  sheetTemps.getRange(2, 1, sheetTemps.getMaxRows() - 1, sheetTemps.getMaxColumns()).clearContent();

  sheetTemps.getRange(2, 1, temps.length, temps[0].length).setValues(temps);

}
  • Lancez une fois le script pour valider les autorisations.
  • Créez un déclencheur pour actualiser les informations au rythme que vous le souhaitez (une fois par jour, entre 3h et 4h du matin par exemple).

La feuille « TEMPS PASSÉ » affiche les événements issus de votre agenda. Paramétrez les colonnes « Début » et « Fin » pour afficher les dates et heures.

Script pour mettre à jour l’événement de Google Sheets vers Agenda

Ce script permet de renommer l’événement en y insérant l’ID de mon projet pour qu’il y soit lié de façon pérenne.

Ajoutez une colonne dans la feuille de temps listant par validation de données les projets en cours issue de la feuille « PROJETS ».

  • Copiez collez ce script à la suite du précédent script.

Attention : ce script modifie les titres des événements dans l’agenda principal du compte Google. Numeriblog décline toute responsabilité en cas de dommages subits suite à son utilisation.

function onEditDeclencheur() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetTempsPasse = ss.getSheetByName("TEMPS PASSE");
  const sheetTempsPasseId = sheetTempsPasse.getSheetId();

  const rangeEdited = sheetTempsPasse.getActiveCell();
  const rangeEditedSheetId = rangeEdited.getSheet().getSheetId();

  const rangeEditedCol = rangeEdited.getColumn();
  const rangeEditRow = rangeEdited.getRow();

  // Si dans le sheets TEMPS PASSE 
  if (sheetTempsPasseId == rangeEditedSheetId) {

    Logger.log(rangeEditedCol + " " + rangeEditRow)
    // Si c'est la colonne E qui est modifiée
    if (rangeEditedCol == 6) {
      const eventId = sheetTempsPasse.getRange(rangeEditRow, 1).getValue();
      const eventTitle = sheetTempsPasse.getRange(rangeEditRow, 4).getValue();

      const projetId = rangeEdited.getValue().match(/\[(.*)\]/)[1];
      Logger.log(eventTitle + " " + projetId);

      const agenda = CalendarApp.getDefaultCalendar();
      const event = agenda.getEventById(eventId);
      const newTitle = eventTitle + " [" + projetId + "]";
      event.setTitle(newTitle);
      sheetTempsPasse.getRange(rangeEditRow, 4).setValue(newTitle);

      ss.toast("Mise à jour événement " + eventTitle);

      rangeEdited.clearContent();

    }

  }

}
  • Ajoutez un déclencheur « Lors d’une modification ».

À présent, en modifiant le projet dans la colonne E, l’ID du projet est automatiquement inséré dans l’événement.

Vous pouvez calculer la durée de l’événement et afficher le temps global passé par projet dans un TCD.


Conclusion

En mettant en place ces deux scripts, j’ai consolidé la gestion du temps passé sur mes projets, en m’appuyant sur la saisie intuitive des événements dans mon agenda d’une part et la gestion analytique du tableur d’autre part. J’ai pu aussi cadrer la façon de créer des événements en les nommant directement avec l’ID du projet correspondant si je le connais. Cela demande toujours un peu de temps pour associer l’événement au bon projet, mais quelle satisfaction quand le planning est à jour. Le temps passé à tenir à jour son agenda est largement valorisé quand je peux fournir à mes clients un planning détaillé des actions menées sur leurs projets.

Merci pour vos retours sur cette procédure dans les commentaires, avez-vous mis en place d’autres outils de suivi de temps de projets ?

Si vous avez trouvé une faute d’orthographe, veuillez nous en informer en sélectionnant le texte en question et en appuyant sur Ctrl + Entrée .

- Accompagnement professionnel ? -Formation professionnelle et services Google Workspace

LAISSER UN COMMENTAIRE

S'il vous plaît entrez votre commentaire!
S'il vous plaît entrez votre nom ici

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.