Automatisation des notifications de dossiers Google Drive avec Google Apps Script

Dans le monde professionnel, il est essentiel de rester à jour sur les documents partagés au sein de votre équipe. Les notifications automatiques peuvent jouer un rôle crucial pour vous assurer de ne rien manquer. Grâce à Google Apps Script, il est possible de créer un système qui surveille vos dossiers Google Drive et vous envoie des notifications par email chaque fois qu’un nouveau fichier est ajouté ou qu’un fichier est supprimé.

Pourquoi automatiser les notifications de Google Drive ?

Gérer manuellement les notifications peut devenir une tâche fastidieuse, surtout si vous avez plusieurs dossiers à surveiller. Avec un script automatisé, vous pouvez :

  • Gagner du temps : Plus besoin de vérifier manuellement les dossiers pour voir s’il y a du nouveau.
  • Ne rien manquer : Vous serez toujours informé des derniers ajouts ou suppressions de fichiers.
  • Améliorer la collaboration : Vos collègues seront également informés en temps réel des changements, améliorant ainsi la communication au sein de l’équipe.

Fonctionnalités du script

Le script que nous avons développé possède les fonctionnalités suivantes :

  • Surveillance de dossiers spécifiques : Le script peut surveiller plusieurs dossiers définis dans une feuille de calcul Google Sheets.
  • Notifications par email : Chaque fois qu’un nouveau fichier est ajouté ou qu’un fichier est supprimé, un email est envoyé aux personnes concernées.
  • Historique des fichiers : Le script garde une trace des fichiers déjà notifiés, ce qui permet de ne pas répéter les notifications pour les mêmes fichiers.
  • Gestion des suppressions : Si un fichier est supprimé, le script le détecte et en informe les utilisateurs.

Mise en oeuvre du script

Le script utilise Google Apps Script, qui est un outil puissant intégré à Google Workspace. Voici un aperçu du code que nous avons utilisé :

/**
 * Script Google Apps Script pour surveiller des dossiers Google Drive, notifier par email 
 * les nouveaux fichiers ajoutés, et gérer un historique des fichiers déjà notifiés.
 * 
 * Auteur : Fabrice Faucheux
 * Date : Août 2024
 * 
 * Fonctionnalités :
 * - Vérification automatique des dossiers listés dans la feuille "Paramètres".
 * - Envoi de notifications par email lorsqu'un nouveau fichier est détecté.
 * - Historique des fichiers déjà notifiés stocké dans les propriétés utilisateur.
 * - Menu personnalisé pour mettre à jour les dossiers suivis ou forcer l'envoi de notifications.
 * - Ajout de liens hypertexte dans l'email pour accéder directement aux fichiers ajoutés.
 * - Détection précise des fichiers grâce à l'utilisation de leur ID unique.
 * - Gestion de la suppression des fichiers pour maintenir un historique à jour.
 */

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('Notifications')
    .addItem('Mettre à jour les dossiers suivis', 'mettreAJourDossiersSuivis')
    .addItem('Forcer l\'envoi de notifications', 'forcerEnvoiNotifications')
    .addToUi();
}

function mettreAJourDossiersSuivis() {
  const feuille = obtenirFeuilleParametres();
  if (!feuille) return;

  verifierEtAjouterEnTete(feuille);
  const notificationsEnvoyees = verifierDossiersEtNotifier(feuille, false);

  const ui = SpreadsheetApp.getUi();
  ui.alert(notificationsEnvoyees ? 'Les dossiers suivis ont été mis à jour et les notifications envoyées.' : 'Les dossiers suivis ont été mis à jour. Aucun nouveau fichier détecté.');
}

function forcerEnvoiNotifications() {
  const feuille = obtenirFeuilleParametres();
  if (!feuille) return;

  verifierEtAjouterEnTete(feuille);
  const notificationsEnvoyees = verifierDossiersEtNotifier(feuille, true);

  const ui = SpreadsheetApp.getUi();
  ui.alert(notificationsEnvoyees ? 'Les notifications ont été envoyées.' : 'Aucun nouveau fichier détecté. Aucune notification envoyée.');
}

function obtenirFeuilleParametres() {
  const feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Paramètres');
  if (!feuille) {
    SpreadsheetApp.getUi().alert('La feuille "Paramètres" n\'existe pas. Veuillez la créer et réessayer.');
  }
  return feuille;
}

function verifierEtAjouterEnTete(feuille) {
  const enTete = feuille.getRange(1, 1, 1, 3).getValues()[0];

  if (enTete[0] !== 'Dossier (nom)' || enTete[1] !== 'Dossier (ID)' || enTete[2] !== 'Email (destinataire du mail)') {
    const valeursEnTete = [['Dossier (nom)', 'Dossier (ID)', 'Email (destinataire du mail)']];
    feuille.getRange(1, 1, 1, 3).setValues(valeursEnTete);
  }
}

function verifierDossiersEtNotifier(feuille, forcerEnvoi) {
  const donnees = feuille.getDataRange().getValues();
  const userProperties = PropertiesService.getUserProperties();
  let notificationsEnvoyees = false;

  for (let i = 1; i < donnees.length; i++) {
    const [nomDossier, idDossier, emailDestinataire] = donnees[i];
    const dossier = DriveApp.getFolderById(idDossier);
    const fichiers = dossier.getFiles();
    const fichiersActuels = [];

    while (fichiers.hasNext()) {
      const fichier = fichiers.next();
      fichiersActuels.push({ id: fichier.getId(), nom: fichier.getName(), url: fichier.getUrl() });
    }

    const propertyKey = `notifiedFiles_${idDossier}`;
    let fichiersNotifies = [];

    // Essayer de parser les données JSON stockées
    try {
      fichiersNotifies = JSON.parse(userProperties.getProperty(propertyKey) || '[]');
    } catch (e) {
      // Si une erreur se produit, réinitialiser les données
      fichiersNotifies = [];
      userProperties.setProperty(propertyKey, JSON.stringify(fichiersNotifies));
    }

    const nouveauxFichiers = fichiersActuels.filter(fichier => !fichiersNotifies.some(notified => notified.id === fichier.id));
    const fichiersSupprimes = fichiersNotifies.filter(notified => !fichiersActuels.some(fichier => fichier.id === notified.id));

    if (nouveauxFichiers.length > 0 || fichiersSupprimes.length > 0 || forcerEnvoi) {
      const sujet = `Changements dans le dossier : ${nomDossier}`;
      let message = `
      <div style="font-family: 'Roboto', 'Helvetica Neue', Arial, sans-serif; font-size: 14px; color: #333;">
        <p>Bonjour,</p>
        <p>Pour information et action.</p>
        <p>Le dossier <strong>${nomDossier}</strong> ou l'un de ses sous-dossiers a subi des modifications :</p>`;

      if (nouveauxFichiers.length > 0) {
        message += `<p>Nouveaux fichiers ajoutés :</p>
        <ul style="list-style-type: none; padding-left: 0;">
          ${nouveauxFichiers.map(fichier => `<li style="margin-bottom: 10px;"><a href="${fichier.url}" style="color: #1a73e8; text-decoration: none;">${fichier.nom}</a></li>`).join('')}
        </ul>`;
      }

      if (fichiersSupprimes.length > 0) {
        message += `<p>Fichiers supprimés :</p>
        <ul style="list-style-type: none; padding-left: 0;">
          ${fichiersSupprimes.map(notified => `<li style="margin-bottom: 10px;">${notified.nom}</li>`).join('')}
        </ul>`;
      }

      message += `<p style="color: #888;">Cordialement,</p></div>`;

      MailApp.sendEmail({
        to: emailDestinataire,
        subject: sujet,
        htmlBody: message
      });

      const updatedNotifiedFiles = fichiersActuels.map(fichier => ({ id: fichier.id, nom: fichier.nom }));
      userProperties.setProperty(propertyKey, JSON.stringify(updatedNotifiedFiles));

      notificationsEnvoyees = true;
    }
  }

  return notificationsEnvoyees;
}

Comment fonctionne le script ?

  • 1. Récupération des données : Le script commence par récupérer les informations des dossiers surveillés à partir d’une feuille Google Sheets.
  • 2. Comparaison avec l’historique : Il compare les fichiers actuels avec ceux précédemment notifiés.
  • 3. Envoi des notifications : S’il détecte un ajout ou une suppression, il envoie un email aux destinataires définis.
  • 4. Mise à jour de l’historique : L’historique des fichiers est mis à jour pour les prochaines exécutions du script.

L’automatisation des notifications pour les dossiers Google Drive est une manière efficace d’améliorer la gestion documentaire et la communication au sein d’une équipe. Ce script simple mais puissant vous permettra de rester informé des changements sans avoir à vérifier manuellement chaque dossier.