Obtenez les ID des fichiers dans différents dossiers
Ceci est une question complémentaire pour ce fil .
Existe-t-il un moyen pour moi d'obtenir les ID du fichier dans un autre dossier? Ci-dessous le répertoire de ce sur quoi je travaille.

Et c'est le code que j'utilise.
function myFunction() {
const ss = SpreadsheetApp.getActive();
var SSID = ss.getId(); //sheet id
var spreadsheetFile = DriveApp.getFileById(SSID);
var folderId = spreadsheetFile.getParents().next().getId();
const sh = ss.getSheetByName('Sheet4'); // change that to the name of your sheet
const filenames = sh.getRange('B3:B').getValues().flat().filter(r=>r!='');
const IDs = [];
const Folder = DriveApp.getFolderById(folderId);
filenames.forEach(fn=>{
let Files = Folder.getFilesByName(fn);
while(Files.hasNext()){
let file = Files.next();
IDs.push([file.getId()]);
}
});
sh.getRange(3,3,IDs.length,1).setValues(IDs);
}
Ce code fonctionne bien si les fichiers sont situés dans un dossier, mais il ne fonctionne pas pour les sous-dossiers ou un autre dossier.
Ci-dessous, la feuille sur laquelle je travaille.

Réponses
Dans ce cas, pour atteindre votre objectif, qu'en est-il du flux suivant?
- Récupérez la liste de tous les fichiers dans
folderId
. - Créez un tableau pour mettre des valeurs dans la feuille de calcul.
Lorsque votre script est modifié, il devient comme suit.
Script modifié:
De:const IDs = [];
const Folder = DriveApp.getFolderById(folderId);
filenames.forEach(fn=>{
let Files = Folder.getFilesByName(fn);
while(Files.hasNext()){
let file = Files.next();
IDs.push([file.getId()]);
}
});
À:
const Folder = DriveApp.getFolderById(folderId);
// 1. Retrieve the file list of all files in `folderId`.
const getFileList = (f, folders = [], fileList = {}) => {
const fs = f.getFiles();
while (fs.hasNext()) {
const file = fs.next()
fileList[file.getName()] = file.getId();
}
const fols = f.getFolders();
const folderObjs = [];
while (fols.hasNext()) folderObjs.push(fols.next());
if (folderObjs.length > 0) {
folders.push(folderObjs);
folderObjs.forEach(fol => getFileList(fol, folders, fileList));
}
return fileList;
};
const fileList = getFileList(Folder);
// 2. Create an array for putting values to Spreadsheet.
const IDs = filenames.map(fn => [fileList[fn] || ""]);
Remarque:
- Dans ce cas, cela suppose que les mêmes noms de fichiers n'existent pas dans la colonne "B" de la feuille de calcul. Veuillez faire attention à cela.
Il y a quelques options ici. Il y a d'abord la DriveApp.getFoldersByName(name)méthode qui retournera la liste de tous les dossiers de votre lecteur qui correspondent au nom donné Vous aurez bien sûr besoin de connaître le nom du dossier avant l'exécution et vous ne pouvez pas avoir d'autres dossiers avec le même nom, ou vous risquez prendre l'identifiant du mauvais dossier.
Si vous connaissez l'id d'un dossier plus haut dans l'arborescence des dossiers (comme les scripts parent direct comme vu dans l'exemple ci-dessus, voir File.getParents()), vous pouvez limiter l'impact de la méthode ci-dessus en utilisant Folder.getFoldersByName(name). Les mêmes restrictions que ci-dessus s'appliquent ici, mais seront plus rapides (moins de fichiers à parcourir), mais vous oblige à avoir l'ID d'un dossier parent.
Vous pouvez également simplement copier l'identifiant du dossier à partir de l'URL si vous savez à quel fichier accéder et restera constant à travers les exécutions de script, et le stocker comme une variable constante. Cette méthode est bien sûr plus rigide car vous aurez besoin de construire le fichier avant l'exécution; cependant, vous n'aurez pas besoin de parcourir l'arborescence des répertoires et serez donc plus rapide.