Projet Liste Fichiers

Bonjour,

Je sollicite les codeurs pour checker mon code ci-dessous (il fonctionne)

En somme j'ai un classeur avec 2 feuilles 'TempListFiles' et 'Paramètres'

Dans Paramètres

- en D3 je saisie l'url d'un répertoire

- en D5 une liste de validation 'Google Sheets | Tous les fichiers'

- en D7 une case à cocher. Si VRAI alors on inclut les sous-dossiers, sinon on ne visualise que les fichiers du dossier saisi en D3

Débutant en AppScript, je voudrai savoir s'il y a moyen de l'optimiser d'avantage et si je n'ai pas fait d'erreurs d'écriture.

De même j'ai accès au sous-dossier de 1er niveau (Dossier/Sous-dossiers) mais pas (Dossier/sous-dossiers/sous-dossiers/....)

function listFiles() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetParam = ss.getSheetByName("Paramètres");
  const sheetTemp = ss.getSheetByName("TempListFiles");
  const folderUrl = sheetParam.getRange("D3").getValue();
  const folderId = folderUrl.split("/")[5];
  const folder = DriveApp.getFolderById(folderId);
  const fileType = sheetParam.getRange("D5").getValue();
  const includeSubFolders = sheetParam.getRange("D7").getValue();
  const data = [["Nom de dossier", "Nom de fichier", "Lien", "Auteur", "Date de création", "Dernière modification"]];
  let files = folder.searchFiles("trashed = false");

  // Lister tous les sous-dossiers à partir du dossier déclaré en Paramètre!D3
  if (includeSubFolders === true) {
    // Ajouter les fichiers des sous-dossiers à la liste de données
    const folders = folder.getFolders();
    while (folders.hasNext()) {
      const subFolder = folders.next();
      let subFiles = subFolder.getFiles();

      if (fileType == "Google Sheets") {
        subFiles = subFolder.getFilesByType(MimeType.GOOGLE_SHEETS);
        files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
      } else {
        files = folder.getFiles(); //Dossier
        subFiles = subFolder.getFiles(); // Sous-dossiers
      }
      while (files.hasNext()) {
        const file = files.next();
        const fileInfo = [folder.getName(), file.getName(), file.getUrl(), file.getOwner(), file.getDateCreated(), file.getLastUpdated()];
        data.push(fileInfo);
      }

      while (subFiles.hasNext()) {
        let subFile = subFiles.next();
        const subFileInfo = [subFolder.getName(), subFile.getName(), subFile.getUrl(), subFile.getOwner(), subFile.getDateCreated(), subFile.getLastUpdated()];
        data.push(subFileInfo);
      }
    }
  } else {
      if (fileType == "Google Sheets") {
        files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
      } else {
        files = folder.getFiles();
      }
    // Ajouter les fichiers à la liste de données
    while (files.hasNext()) {
      const file = files.next();
      const fileInfo = [folder.getName(), file.getName(), file.getUrl(), file.getOwner(), file.getDateCreated(), file.getLastUpdated()];
      data.push(fileInfo);
    }
  }

  // Trier le tableau par date de création décroissante
  data.sort(function(a, b) {return b[4] - a[4];});

  // Ajouter les données triées dans la feuille de calcul
  sheetTemp.clearContents();
  sheetTemp.getRange(1, 1, data.length, data[0].length).setValues(data);
}

Je sais que Steelson en a fait un mais j'ai voulu travailler une autre approche et le tout en une fonction unique.

MAJ : j'ai ajouté si Pramaètres!D3 est vide alors on quitte la fonction

function listFiles() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetParam = ss.getSheetByName("Paramètres");
  const sheetTemp = ss.getSheetByName("TempListFiles");

  // Vérifier si la cellule D3 dans la feuille "Paramètres" est vide
  if (sheetParam.getRange("D3").getValue() === "") {
    return; // Quitter la fonction sans rien faire
  }else{

    const folderUrl = sheetParam.getRange("D3").getValue();
    const folderId = folderUrl.split("/")[5];
    const folder = DriveApp.getFolderById(folderId);
    const fileType = sheetParam.getRange("D5").getValue();
    const includeSubFolders = sheetParam.getRange("D7").getValue();
    const data = [["Nom de dossier", "Nom de fichier", "Lien", "Auteur", "Date de création", "Dernière modification"]];
    let files = folder.searchFiles("trashed = false");

    // Lister tous les sous-dossiers à partir du dossier déclaré en Paramètre!D3
    if (includeSubFolders === true) {
      // Ajouter les fichiers des sous-dossiers à la liste de données
      const folders = folder.getFolders();
      while (folders.hasNext()) {
        const subFolder = folders.next();
        let subFiles = subFolder.getFiles();

        if (fileType == "Google Sheets") {
          subFiles = subFolder.getFilesByType(MimeType.GOOGLE_SHEETS);
          files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
        } else {
          files = folder.getFiles(); //Dossier
          subFiles = subFolder.getFiles(); // Sous-dossiers
        }
        while (files.hasNext()) {
          const file = files.next();
          const fileInfo = [folder.getName(), file.getName(), file.getUrl(), file.getOwner(), file.getDateCreated(), file.getLastUpdated()];
          data.push(fileInfo);
        }

        while (subFiles.hasNext()) {
          let subFile = subFiles.next();
          const subFileInfo = [subFolder.getName(), subFile.getName(), subFile.getUrl(), subFile.getOwner(), subFile.getDateCreated(), subFile.getLastUpdated()];
          data.push(subFileInfo);
        }
      }
    } else {
        if (fileType == "Google Sheets") {
          files = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
        } else {
          files = folder.getFiles();
        }
      // Ajouter les fichiers à la liste de données
      while (files.hasNext()) {
        const file = files.next();
        const fileInfo = [folder.getName(), file.getName(), file.getUrl(), file.getOwner(), file.getDateCreated(), file.getLastUpdated()];
        data.push(fileInfo);
      }
    }

    // Trier le tableau par date de création décroissante
    data.sort(function(a, b) {return b[4] - a[4];});

    // Ajouter les données triées dans la feuille de calcul
    sheetTemp.clearContents();
    sheetTemp.getRange(1, 1, data.length, data[0].length).setValues(data);
  }
}

Dans le cas d'un drive partagé, l'auteur va apparaître comme étant "DriveUser". En remplaçant

file.getOwner()

par

file.getOwner().getmail()

Le mail de l'auteur apparait...

Je ne suis pas très avancé en App script non plus (et encore moins en Drive App) mais le code semble correct ; juste au début, pourquoi créer ta liste data en constante et non pas en variable (vu que tu push des données à l'intérieur après) ?

Bonjour Pierre,

Question pertinente, à la base c'est une "erreur" de ma part, j'aurai dû mettre let, mais quand j'ai lancé le code, ça à fonctionner sans que je comprenne pourquoi.

Je me suis dit que quelqu'un avait surement une explication...

Ce qui manque dans ce code c'est l'affichage de tous les sous-dossiers, la seul ceux de 1er niveau sont pris en compte et du coup je ne sais pas comment faire pour inclure aussi tous les sous dossiers de 2nd, 3ème, etc... niveau.

Si tu créé une variable "nombre de sous-dossier", tu fais ensuite une boucle qui vérifie le nombre de sous dossier de ton dossier cible et ajoute 1 à cette variable à chaque étage.

Tu utilises ensuite cette variable pour itérer X fois ?

Rechercher des sujets similaires à "projet liste fichiers"