Partage
  • Partager sur Facebook
  • Partager sur Twitter

Google Sheet (Liste inventaire)

    8 novembre 2022 à 11:05:11

    Bonjour à toutes et tous,

    Aujourd'hui je cherche à modifier une macro qui est bien fonctionnelle et qui réalisait ce dont j'avais besoin.

    Cependant pour un certain confort d'exécution, et afin de limite les problématiques de script qui s'arrête pour des raisons d'expiration de délais j'aurais besoin de limite la macro suivante.

    Que fait la macro aujourd'hui:

    A l'activation, elle liste l'ensemble des dossiers, sous dossiers et fichiers que je défini par l'id de l'URL.

    Vous pouvez réaliser le test avec vos dossiers et voir le rendu sans aucun soucis.

    Mon besoin pour cette macro:

    Limiter l'inventaire à seulement 3 sous dossiers. Si j'en ai plus, il ne les prend pas en compte dans mon inventaire.

    Script 

    /** @OnlyCurrentDoc */
    
    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      ui.createMenu('[Inventaire]')
      .addItem('Inventorier vos fichiers', 'listeInventaire')    
      .addToUi(); 
    }
    
    // Dressez la liste de tous les fichiers et dossiers, et écrire dans la feuille actuelle
    function listeInventaire(){
      var ui = SpreadsheetApp.getUi(); // 
      var resultat = ui.prompt(
        'Inventaire à réaliser',
        'Indiquer l\'ID  du dossier: (Apres https://drive.google.com/drive/folders/XXXXX)',
        ui.ButtonSet.OK_CANCEL);
      var button = resultat.getSelectedButton();
      var idDuDossier = resultat.getResponseText();
      if (button == ui.Button.OK) {
        obtenirArborescenceDossiers(idDuDossier, true);
      }   
    }
    
    // =======================================
    // Obtenir l'arborescence des dossiers
    // =======================================
    
    function obtenirArborescenceDossiers(idDuDossier, listeTotale) {
      try {
        // Récupérer le dossier par identifiant
        var dossierParent = DriveApp.getFolderById(idDuDossier);
        
        // Initialiser la feuille de calcul
        var data;
        var feuille = SpreadsheetApp.getActiveSheet();
        feuille.clear();
        feuille.appendRow(["Chemin", "Nom", "URL", "Dernière mise à jour", "Propriétaire", "Taille"]);
        feuille.getRange(feuille.getLastRow(), 1, 1, feuille.getLastColumn()).setFontWeight("bold");
        
        // Obtenir les fichiers et les dossiers
        obtenirDossiersEnfants(dossierParent.getName(), dossierParent, data, feuille, listeTotale);
        obtenirFichiersRacine(dossierParent.getName(), dossierParent, data, feuille, listeTotale);
        
      } catch (e) {
        Logger.log(e.toString());
      }
    };
    
    // Obtenir la liste des fichiers et dossiers et leurs métadonnées en mode récursif
    function obtenirDossiersEnfants(nomDossierParent, dossierParent, data, feuille, listeTotale) {
      var dossierEnfants = dossierParent.getFolders();
      
      // Liste des dossiers à l'intérieur du dossier
      while (dossierEnfants.hasNext()) {
        var dossierEnfant = dossierEnfants.next();
        data = [
          nomDossierParent + "/" + dossierEnfant.getName(),
          dossierEnfant.getName(),
          ' ',
          dossierEnfant.getDateCreated(),
          dossierEnfant.getUrl(),
          dossierEnfant.getLastUpdated(),
          dossierEnfant.getOwner().getName(),
          dossierEnfant.getSize()
        ];
        // Ecriture dans la feuille
        feuille.appendRow(data);
        feuille.getRange(feuille.getLastRow(), 1, 1, 1).setFontWeight("bold");
        
        // Liste des fichiers contenus dans le dossier
        var fichiers = dossierEnfant.getFiles();
        while (listeTotale & fichiers.hasNext()) {
          var fichierEnfant = fichiers.next();
          data = [
            "  " + nomDossierParent + "/" + dossierEnfant.getName() + "/" + fichierEnfant.getName(),
            fichierEnfant.getName(),
            fichierEnfant.getUrl(),
            fichierEnfant.getLastUpdated(),
            fichierEnfant.getOwner().getName(),
            fichierEnfant.getSize()
          ];
          // Ecriture dans la feuille
          feuille.appendRow(data);
        }
        
        // Appel récursif du sous-dossier
        obtenirDossiersEnfants(nomDossierParent + "/" + dossierEnfant.getName(), dossierEnfant, data, feuille, listeTotale);  
      }
      
    };
    
    // Obtenir la liste des fichiers racine
    function obtenirFichiersRacine(nomDossierParent, dossierParent, data, feuille, listeTotale) {
      
      // Liste des fichiers contenus dans le dossier
      var fichiers = dossierParent.getFiles();
      while (listeTotale & fichiers.hasNext()) {
        var fichierEnfant = fichiers.next();
        data = [
          nomDossierParent,
          fichierEnfant.getName(),
          fichierEnfant.getUrl(),
          fichierEnfant.getLastUpdated(),
          fichierEnfant.getOwner().getName(),
          fichierEnfant.getSize()
        ];
        // Ecriture dans la feuille
        feuille.appendRow(data);
      }
      
    }

    Je vous remercie d'avance pour vos retours.

    Bonne journée.

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2022 à 10:48:26

      quand tu parles de 3 dossiers c'est 3 dossiers principaux avec tous leurs sous-dossiers ? 

      sinon ça se passe vers la ligne 54 sauf erreur de ma part, le while boucle tant qu'il y a un autre dossier dans la collection ( https://developers.google.com/apps-script/reference/drive/folder-iterator ), il faudrait rajouter un compteur dans la boucle de fonction pour s'arrêter à 3 (si il y en a plus de 3); cette valeur limite pourrait même être passer en paramètre de la fonction obtenirDossiersEnfants (attention, elle est récursive et s'appelle en ligne 87 pour explorer les sous-dossiers, donc il ne faudra pas oublier d'y rajouter ce paramètre lors de cet appel)

      (définir une valeur spéciale pour autoriser la lecture de tous les dossiers)

      • Partager sur Facebook
      • Partager sur Twitter
        16 novembre 2022 à 13:57:58

        Umfred,

        Bonjour, désolé pour le retard de réponse.

        Quand je parle de 3 sous dossiers, il faut le voir ainsi:

        Dossier Racine (Niveau 1) / Sous Dossier (Niveau 2) / Sous sous Dossier (Niveau 3) / Sous sous sous Dossier (Niveau 4)

        Il faut donc imaginer un tableau comme celui ci:

        Dossier Racine 1 (Niveau 1) Sous Dossier 1 (Niveau 2) Hyper Lien des fichiers
        Sous Dossier 1 (Niveau 2) Sous sous Dossier 1 (Niveau 3) Hyper Lien des fichiers
        Sous sous Dossier 1 (Niveau 3) Sous sous sous Dossier 1 (Niveau 4) Hyper Lien des fichiers
        Dossier Racine 2 (Niveau 1) Sous Dossier 2 (Niveau 2) Hyper Lien des fichiers
        Dossier Racine 3 (Niveau 1) Sous Dossier 3 (Niveau 2) Hyper Lien des fichiers
        Sous Dossier 3 (Niveau 2) Sous sous Dossier 3 (Niveau 3) Hyper Lien des fichiers
        Sous sous Dossier 3 (Niveau 3) Sous sous sous Dossier 3 (Niveau 4) Hyper Lien des fichiers

        En espérant que cela soit compréhensible ;)

        Bonne journée.

        • Partager sur Facebook
        • Partager sur Twitter
          16 novembre 2022 à 15:28:00

          donc c'est une profondeur de 3 dossiers

          En 1ere idée, je rajouterai 2 paramètres à la fonction obtenirDossiersEnfants(..): un paramètre niveau_actuel et un paramètre niveau_max

          de manière à l'appeler initialement (ligne 41) avec niveau_actuel=0 et niveau_max=3

          et au niveau de l'appel récursif (ligne 89), l'appeler avec niveau_actuel=niveau_actuel+1 et niveau_max=niveau_max 

          et bien sûr, faire cet appel récursif uniquement si niveau_actuel<= niveau_max

          PS: dans les paramètres actuels, je pense que nomDossierParent et dossierParent sont redondants, tu peux récupérer le nom du dossier parent, avec dossierParent.getName() (c'est d'ailleurs ce que tu fais quand tu appelles la fonction); après je me trompe peut-être, puisqu'il semble que tu veux récupérer l'arborescence complète ici et pas juste le nom du répertoire

          • Partager sur Facebook
          • Partager sur Twitter

          Google Sheet (Liste inventaire)

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown