Page 1 sur 1

Inventorier l'arborescence d'un drive partagé

Publié : 09 nov. 2023 09:33
par Sophie
Bonjour à tous, je cherche à répertorier l'ensemble des documents présents sur un drive partagé en vue de constituer une base documentaire (chemin, nom du document, URL, date de dernière mise à jour, propriétaire...). J'avais trouvé un script pour se faire mais celui-ci ne fonctionne que sur les drives individuels. Existe-t-il un autre moyen pour inventorier un drive partagé svp ? Dans l'attente de votre retour et vous remerciant pour votre aide, bien à vous.

Re: Inventorier l'arborescence d'un drive partagé

Publié : 09 nov. 2023 16:06
par Sophie
voici le script que j'avais trouvé qui ne marche que pour mon drive et non le drive partagé :/** @OnlyCurrentDoc */

function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('[Découvrir G Suite]')
.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:',
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", "Type", "Date", "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.getMimeType(),
fichierEnfant.getDateCreated(),
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.getMimeType(),
fichierEnfant.getDateCreated(),
fichierEnfant.getUrl(),
fichierEnfant.getLastUpdated(),
fichierEnfant.getOwner().getName(),
fichierEnfant.getSize()
];
// Ecriture dans la feuille
feuille.appendRow(data);
}

}

Re: Inventorier l'arborescence d'un drive partagé

Publié : 11 nov. 2023 15:14
par Patrick_Té
Bonjour Sophie,

Ce script peut fonctionner pour un drive partagé :

Il faut juste supprimer les lignes 61,79 et 106     ou mettre // en tête de ligne pour qu'elles soient ignorées (et considérées comme commentaire)

En effet ces lignes contiennent l'instruction : getOwner().getName()    or dans un drive partagé le propriétaire est le domaine et getOwner() renvoie la valeur NULL ce qui plante la fonction getName() dans  le script.

Bien cordialement

Re: Inventorier l'arborescence d'un drive partagé

Publié : 11 nov. 2023 17:34
par Patrick_Té
Attention au temps d'exécution : d'après mes tests la limite est de 5 000 fichiers et dossiers.   (5 110 répertoriés en 30 minutes)

Au delà de 5 000 fichiers et dossier , il faut optimiser le script. Ou le compléter pour une exécution par étapes en plus de 30 minutes.

Bon courage 

Re: Inventorier l'arborescence d'un drive partagé

Publié : 11 nov. 2023 19:19
par Sophie
Bonjour Patrick, c'est absolument génial !!!! Merci infiniment pour votre aide, le script fonctionne en ayant retiré ces lignes. Je suis en train de l'exécuter mais cela ne fait aucun doute, il y aura plus 5000 documents...est-ce une question de temps ou le système est capable de tout inventorier quand même (en prenant un bon moment) ? Merci encore, vous allez me faire gagner un temps fou !!!

Re: Inventorier l'arborescence d'un drive partagé

Publié : 11 nov. 2023 20:25
par Sophie
Patrick, je viens d'avoir le message "durée d'exécution autorisée dépassée" à 6822 documents inventoriés. Ma solution serait de retirer de l'inventaire certains dossiers contenant énormément de documents dont je n'ai pas besoin d'avoir le détail et cela réduirait de plusieurs milliers de lignes l'inventaire. Serait-ce possible, svp, d'ajouter cette consigne au script (je ne sais malheureusement pas faire...). Merci par avance, bien à vous