我一直在整個互聯網上尋找如何列出我的共享驅動器檔案的方法或代碼。一開始,我發現一個似乎可以作業,但經過進一步測驗后,它掃描檔案夾的方式存在重大缺陷。
現在我顯然又發現了一些我必須適應使用的代碼才能使其與共享驅動器一起使用,但我設法做到了。我唯一的問題是它似乎只列出了它找到的第一個檔案夾/子檔案夾中的檔案并且不回圈。我的問題是,我的診斷速度太快了,在我設定了整個周末的電子表格后,我沒有時間也沒有知識自己修復它。
這是我為使用共享驅動器而改編的代碼:
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)
}
這是原始評論/代碼的鏈接。
I'm new to StackOverflow so I'll do my best to mark the solutions and give feedback on the answers.
uj5u.com熱心網友回復:
根據您的評論,我相信您的目標如下。
- 您想從特定檔案夾中檢索檔案和檔案夾串列。
- 您要檢索“名稱”、“大小”、“添加日期”、“修改日期”、“url”的元資料。
- 您想使用 Google Apps 腳本實作此目的。
- 您希望減少腳本的處理成本以實作此目的。
當我看到你的展示腳本時,setValues是在回圈中使用的。在這種情況下,處理成本變高。那么,在這種情況下,下面的示例腳本怎么樣?
在此示例腳本中,使用了 Google Apps 腳本庫。參考我創建了這個庫,用于使用 Google Apps 腳本以低處理成本檢索檔案和檔案夾串列。
用法:
1. 安裝 Google Apps 腳本庫。
您可以在此處查看安裝庫的方法。
2.啟用驅動API。
該庫使用 Drive API。所以請在 Advanced Google services 中啟用 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"電子表格中。
參考:
- Google Apps 腳本庫的 FilesApp
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/434954.html
