列出文件的应用程序脚本功能只扫描任何给定文件夹的第一个子文件夹



我一直在整个互联网上寻找如何或代码来列出我的共享驱动器文件。一开始,我发现了一个似乎有效的,但经过进一步测试,它在扫描文件夹的方式上存在重大缺陷。

现在,我显然又找到了一些代码,为了使其与共享驱动器配合使用,我不得不对其进行调整,但我还是做到了。我唯一的问题是,它似乎只列出了它找到的第一个文件夹/子文件夹中的文件,而不循环。我的问题是,它对我来说诊断太快了,在整个周末的电子表格设置之后,我没有时间也没有知识自己修复它。

以下是我为使用共享驱动器而修改的代码:

function ListarTodo() {
/* Adapted from Adapted Code written by @Andres Duarte and Adapted by @Eric Aya in this link:
https://stackoverflow.com/a/63267959/18311037
*/
// Lista todos los archivos de una carpeta y de sus sub carpetas, y toma el nombre de la carpeta a analizar del nombre de la hoja activa.
// List all files and sub-folders in a single folder on Google Drive, and get the name of the activesheet to know the folder desired.
var parentFolder = DriveApp.getFolderById("INSERT YOUR FOLDER ID HERE");
// Declaramos la hoja // declare this sheet
var sheet = SpreadsheetApp.getActive().getSheetByName('INSERT YOUR SHEET NAME HERE');
// Borramos los datos de la hoja // clear any existing contents
sheet.clear();
// Agregamos una linea con los titulos // append a header row
sheet.appendRow(["Carpeta","Nombre Archivo", "Fecha ultima modificacion", "Tamaño MB", "URL", "ID", "Descripción", "Tipo archivo"]);
// getFoldersByName = obtener una coleccion de todas las carpetas en la unidad Drive que tienen el nombre buscado "foldername".
// folders es un "iterador de carpetas" pero hay solo una carpeta para llamar por el nombre, por eso tiene un solo valor (next)
// getFoldersByName = Gets a collection of all folders in the user's Drive that have the given name.
// folders is a "Folder Iterator" but there is only one unique folder name called, so it has only one value (next)
var folders = parentFolder.getFolders();
var foldersnext = folders.next();
var lintotal = 2;
//Iniciamos la funcion recursiva // Initiate recursive function
lintotal = SubCarpetas(foldersnext, parentFolder.getName(), lintotal);  
}
function SubCarpetas(folder, path, cantlineas) {
cantlineas = ListarArchivos(folder, path, cantlineas);
var subfolders = folder.getFolders();
while (subfolders.hasNext()) {
var mysubfolders = subfolders.next();
var mysubfolderName = mysubfolders.getName(); 
var newpath = "";
newpath = path + "/" + mysubfolderName;
cantlineas = SubCarpetas(mysubfolders, newpath, cantlineas);
}
return(cantlineas) 
}
function ListarArchivos(mifoldersnext, mipath, milintotal) {
var datos = []; //array temporal que vamos a usar para grabar en la hoja
var files = []; //array con todos los archivos que encontramos en la carpeta que estamos evaluando
var file = []; //array que usamos para volcar los datos de cada archivo antes de guardarlo
var total = 0;
var sheet = SpreadsheetApp.getActiveSheet();
var myfiles = mifoldersnext.getFiles();
// Creamos un array con los datos de cada archivo y guardamos el total de archivos
while (myfiles.hasNext()) {
files.push(myfiles.next());
total++;
}
//ordenamos el array por nombre de archivo alfabeticamente  //sorts the files array by file names alphabetically
files = files.sort(function(a, b){
var aName = a.getName().toUpperCase();
var bName = b.getName().toUpperCase();
return aName.localeCompare(bName);
});
////
var vuelta = 0;
var bulk = 10; //Definimos la cantidad de lineas a grabar cada vez, en la hoja de la planilla GoogleDoc
var linea = milintotal; //definimos en que linea vamos a grabar en la planilla
for (var i = 0; i < files.length; i++) { //recorremos el array de archivos y formateamos la informacion que necesitamos para nuestra planilla
file = files[i];
var fname = file.getName(); //nombre del archivo
var fdate = file.getLastUpdated(); //fecha y hora ultima modificacion
var fsize = file.getSize(); //tamaño del archivo, lo pasamos de byte a Kbyte y luego a Mb
fsize = +fsize.toFixed(2); //lo formateamos a dos decimales
var furl = file.getUrl(); //url del archivo
var fid = file.getId(); //id del archivo
var fdesc = file.getDescription(); //descripcion
var ftype = file.getMimeType(); //tipo de archivo
datos[vuelta] = [mipath+" ("+total+")", fname, fdate, fsize, furl, fid, fdesc, ftype]; //ponemos todo dentro de un array temporal
vuelta++;
if (vuelta == bulk) {//cuando alcanza la cantidad definida, guarda este array con 10 lineas y lo vacía
linea = milintotal;
//      Logger.log("linea = "+linea); //DEBUG
//      Logger.log("vuelta = "+vuelta); //DEBUG
//      Logger.log("total = "+total); //DEBUG
//      Logger.log("lintotal = "+milintotal); //DEBUG
//      Logger.log("registros en datos = "+datos.length); //DEBUG
//      Logger.log("data = "+datos); //DEBUG
sheet.getRange(linea, 1, bulk,8).setValues(datos); //guardamos los datos del array temporal en la hoja
SpreadsheetApp.flush(); //forzamos que aparezcan los datos en la hoja - sin esto los datos no aparecen hasta terminar (genera mucha impaciencia)
milintotal = milintotal + vuelta;
datos = []; //vaciamos el array temporal
vuelta = 0;
}
}
if (datos.length>0) {//Al salir del bucle grabamos lo que haya quedado en el array datos
linea = milintotal;
//      Logger.log("linea = "+linea); //DEBUG
//      Logger.log("vuelta = "+vuelta); //DEBUG
//      Logger.log("total = "+total); //DEBUG
//      Logger.log("lintotal = "+milintotal); //DEBUG
//      Logger.log("registros en datos = "+datos.length); //DEBUG
//      Logger.log("data = "+datos); //DEBUG
sheet.getRange(linea, 1, datos.length,8).setValues(datos);
SpreadsheetApp.flush(); //ansiolítico
milintotal = milintotal + datos.length;
datos = [];
vuelta = 0;
}
return (milintotal)
}

这是原始注释/代码的链接。

我是StackOverflow的新手,所以我会尽我所能标记解决方案并对答案给出反馈。

根据您的评论,我相信您的目标如下。

  • 您想要从特定文件夹中检索文件和文件夹列表
  • 您想要检索"的元数据;名称"尺寸"添加日期"修改日期"url">
  • 你想使用谷歌应用程序脚本来实现这一点
  • 为了实现这一点,您希望降低脚本的处理成本

当我看到您的显示脚本时,循环中使用了setValues。在这种情况下,处理成本变高。那么,在这种情况下,下面的示例脚本如何?

在这个示例脚本中,使用了一个GoogleApps脚本库。Ref我创建了这个库,用于使用谷歌应用程序脚本以低处理成本检索文件和文件夹列表。

用法:

1.安装谷歌应用程序脚本库

您可以在此处查看安装库的方法。

2.启用驱动器API

此库使用驱动器API。因此,请在高级谷歌服务中启用Drive API。

3.示例脚本

function sample() {
const folderId = "###"; // Please set the top folder ID.
// 1. Retrieve file and folder list under the specific folder.
const { files } = FilesApp.createTree(folderId, null, "files(name,modifiedTime,createdTime,size,quotaBytesUsed,webViewLink,description)");
// 2. Parse the list and create an array for putting to Spreadsheet.
if (files.length == 0) return;
const header = ["Name", "size", "added date", "modification date", "url", "description"];
const values = [header, ...files.flatMap(({ filesInFolder }) => filesInFolder.map(e => [e.name, Number(e.quotaBytesUsed || e.size), new Date(e.createdTime), new Date(e.modifiedTime), e.webViewLink, e.description]))];
// 3. Put the values to the Spreadsheet.
const sheetName = "Sheet2"; // Please set the sheet nane.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
sheet.clearContents();
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
  • 在此脚本中,folderId可以使用您的驱动器和共享驱动器
  • 运行此脚本时,将从folderId检索文件和文件夹列表,并将"Name", "size", "added date", "modification date", "url"的值放入电子表格中

参考:

  • 谷歌应用程序脚本库的FilesApp

相关内容

  • 没有找到相关文章

最新更新