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 ?