¿Cómo saber el tamaño total de una carpeta en Google Drive? La pregunta parece sencilla, pues en nuestra computadora lo podemos saber con un simple click derecho. Pero en realidad Google Drive no nos provee este dato directamente, y estar sumando manualmente es muy tedioso. Hoy, aprenderemos a calcular el tamaño de una carpeta de Google Drive listando todos sus archivos en Google Sheets.

¿Por qué no se muestra el tamaño de las carpetas?

Si analizamos la interfaz de usuario de Google Drive, por ningún lado en los detalles o en las columnas de información encontramos un número específico. Podemos ver el tamaño por archivo, pero incluso si seleccionamos todo, no hace el cálculo por nosotros. Tampoco podemos ordenar los archivos por tamaño para darnos una vaga idea de qué archivos son los que más ocupan espacio en nuestra nube.

Interfaz de Google Drive no muestra el tamaño total

Una razón técnica de por qué esto es así tiene que ver con la forma en que funcionan los permisos propiedad de archivo en Google Drive. Un archivo solamente cuenta para el cálculo del tamaño total de nuestra cuenta si somos propietarios del mismo. Ya que podemos tener compartidos archivos de diversos propietarios en una sola carpeta, este cálculo no es tan sencillo como sumar el tamaño de todos los archivos, sino que debe estar acompañado del contexto del tamaño total de la carpeta para cada usuario que puede interactuar con ella.

Aun así el cálculo del tamaño total de todos los archivos de Drive es muy relevante y útil. Es un problema que definitivamente podemos resolvernos nosotros mismos si combinamos un poco de código de Apps Script y hojas de Cálculo de Google Sheets 😉

Listar archivos de una carpeta de Google Drive en Google Sheets

Entonces, para resolver el problema de calcular el tamaño de una carpeta, primero debemos resolver el problema de listar todos los archivos que contiene la misma, junto con algunos metadatos que nos ayudarán a cumplir nuestro objetivo.

Para lograrlo, vamos a preparar un documento de Google Sheets con una estructura específica. Primero tendremos una hoja llamada Archivos y otra llamada config. Como usaremos código después, debemos asegurarnos de que este nombre sea exactamente así.

Pestañas necesarias Archivos y config

En la hoja Archivos tendremos las siguientes columnas:

  • ID archivo
  • Nombre
  • Fecha de creación
  • Fecha de última modificación
  • Tamaño
  • Propietario
  • URL
  • Descripción
  • Tipo
  • Carpeta
  • ID carpeta
  • URL carpeta
Datos en columnas correspondientes a metadatos de cada archivo

En la hoja config solo tendremos el dato Link carpeta en A1 y la URL a la carpeta que queramos analizar en B1 . Esta hoja solo la usaremos para poder cambiar de carpeta fácilmente y no tener que escribirla directamente en el código que veremos después.

Configuración de carpeta a analizar tamaño

Como puedes ver, ya tenemos preparado el formato para recibir la información de los archivos de una carpeta. Cuando la obtengamos solamente nos quedará hacer algunas sumas y agrupaciones para lograr el objetivo.

Código para listar archivos y calcular el tamaño de una carpeta de Google Drive en Google Sheets

Lo que sigue es usar un poco de código de Apps Script para obtener todos los datos necesarios. No te preocupes, no es mucho y lo explicaremos paso a paso 😃 .

Entonces vamos al menú Extensiones – Apps Script. Una vez ahí, borramos el código que nos aparece por default y lo reemplazamos por este.

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Carpetas')
    .addItem('Leer información de carpeta', 'leer_carpeta_drive')
    .addToUi();
}

function leer_carpeta_drive() {
  var sheet_config = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("config");
  var url_carpeta = sheet_config.getRange("B1").getValue();
  var id_carpeta = getFileIdFromUrl(url_carpeta);

  var sheet_archivos = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archivos");

  // Limpiamos la hoja después de los encabezados
  sheet_archivos.getRange("A2:L").clear();

  // Obtenemos la carpeta
  // Si no se pudo obtener el id desde la URL, usar la carpeta raíz de Drive
  var carpeta_principal = id_carpeta !== "" ? DriveApp.getFolderById(id_carpeta): DriveApp.getRootFolder();

  procesar_carpeta(carpeta_principal);

  function procesar_carpeta(carpeta) {

    // Obtenemos los archivos
    var archivos = carpeta.getFiles();
    // Agregamos la información de los archivos a la hoja
    while (archivos.hasNext()) {
      var archivo = archivos.next();
      var datos = [
        archivo.getId(),
        archivo.getName(),
        archivo.getDateCreated(),
        archivo.getLastUpdated(),
        archivo.getSize(),
        archivo.getOwner().getName(),
        archivo.getUrl(),
        archivo.getDescription(),
        archivo.getMimeType(),
        carpeta.getName(),
        carpeta.getId(),
        carpeta.getUrl(),
      ];
      sheet_archivos.appendRow(datos);
    }

    // Procesamos recursivamente subcarpetas
    var subcarpetas = carpeta.getFolders();
    while (subcarpetas.hasNext()) {
      var siguiente_carpeta = subcarpetas.next();
      procesar_carpeta(siguiente_carpeta);
    }
  }
}

function getFileIdFromUrl(url) {
  let file_id = "";

  // Variantes de la URL
  const rx1 = /https:\/\/drive\.google\.com\/open\?id=([\w\-_]*).*/;
  const rx2 = /https:\/\/drive\.google\.com\/file\/d\/([\w\-_]*)\/.*/;
  const rx3 = /https:\/\/drive\.google\.com\/drive\/folders\/([\w\-_]*).*/;
  const rx4 =
    /https:\/\/drive\.google\.com\/drive\/u\/\d+\/folders\/([\w\-_]*).*/gi;

  if (url.match(rx1)) {
    file_id = url.replace(rx1, "$1");
  } else if (url.match(rx2)) {
    file_id = url.replace(rx2, "$1");
  } else if (url.match(rx3)) {
    file_id = url.replace(rx3, "$1");
  } else if (url.match(rx4)) {
    file_id = url.replace(rx4, "$1");
  }

  return file_id;
}
Lenguaje del código: JavaScript (javascript)

Primero, como acostumbramos en estos pequeños proyectos, creamos un sencillo menú con onOpen, para llamar fácilmente desde la interfaz de Sheets a la función leer_carpeta_drive

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Carpetas')
    .addItem('Leer información de carpeta', 'leer_carpeta_drive')
    .addToUi();
}
Lenguaje del código: JavaScript (javascript)

En esta función de leer_carpeta_drive() primero establecemos algunas variables y valores necesarios para utilizarlos después, como son la hoja config, el valor la URL de la carpeta que escribimos en B1 y la hoja Archivos.

Usamos la función que definimos más abajo getFileIdFromUrl() para obtener el identificador de la carpeta a partir de la URL y guardarlo en id_carpeta, pues las funciones de Google Drive trabajan con estos identificadores únicos de archivos o carpeta.

function leer_carpeta_drive() {
  var sheet_config = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("config");
  var url_carpeta = sheet_config.getRange("B1").getValue();
  var id_carpeta = getFileIdFromUrl(url_carpeta);

  var sheet_archivos = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Archivos");
Lenguaje del código: JavaScript (javascript)

Luego limpiamos la hoja de Archivos a partir de la segunda fila para que cuando ejecutemos de nuevo el proceso, no queden datos de la ejecución anterior y nos ensucien la hoja.

  // Limpiamos la hoja después de los encabezados
  sheet_archivos.getRange("A2:L").clear();
Lenguaje del código: JavaScript (javascript)

Ahora sí, cargamos la información de la carpeta que queremos analizar mediante su identificador con el método getFolderById que nos provee DriveApp, que es la interfaz que nos permite integrarnos con Drive mediante Apps Script. Si por alguna razón no pudimos obtener un ID válido de carpeta o está vacío, usamos la carpeta raíz del usuario.

  // Obtenemos la carpeta
  // Si no se pudo obtener el id desde la URL, usar la carpeta raíz de Drive
  var carpeta_principal = id_carpeta !== "" ? DriveApp.getFolderById(id_carpeta): DriveApp.getRootFolder();
Lenguaje del código: JavaScript (javascript)

Ejecutamos la función procesar_carpeta(), que estamos definiendo después, con la carpeta principal.

procesar_carpeta(carpeta_principal);
Lenguaje del código: JavaScript (javascript)

Con el método getFiles cargamos la lista de archivos y sus propiedades en el objeto archivos, el cual recorremos con un ciclo para poder guardar los metadatos de cada archivo en arreglo que después escribimos en una fila nueva de la hoja con appendRow.

  function procesar_carpeta(carpeta) {

    // Obtenemos los archivos
    var archivos = carpeta.getFiles();
    // Agregamos la información de los archivos a la hoja
    while (archivos.hasNext()) {
      var archivo = archivos.next();
      var datos = [
        archivo.getId(),
        archivo.getName(),
        archivo.getDateCreated(),
        archivo.getLastUpdated(),
        archivo.getSize(),
        archivo.getOwner().getName(),
        archivo.getUrl(),
        archivo.getDescription(),
        archivo.getMimeType(),
        carpeta.getName(),
        carpeta.getId(),
        carpeta.getUrl(),
      ];

      sheet_archivos.appendRow(datos);
    }

    // Procesamos recursivamente subcarpetas
    var subcarpetas = carpeta.getFolders();
    while (subcarpetas.hasNext()) {
      var siguiente_carpeta = subcarpetas.next();
      procesar_carpeta(siguiente_carpeta);
    }
  }
Lenguaje del código: JavaScript (javascript)

Ahora, fíjate muy bien cómo, esta función de procesar_carpeta() es una función recursiva, lo que significa que se llama a sí misma una y otra vez hasta que su propia lógica la hace detenerse. Esto lo debemos hacer así porque no sabemos cuántas carpetas y subcarpetas pueden estar anidadas dentro de nuestra carpeta principal, y queremos procesar todos los archivos que contiene, entonces cada vez que nos encontremos una nueva subcarpeta, debe llamarse a sí misma de nuevo para realizar el proceso de obtener la información de los archivos que contiene.

    // Procesamos recursivamente subcarpetas
    var subcarpetas = carpeta.getFolders();
    while (subcarpetas.hasNext()) {
      var siguiente_carpeta = subcarpetas.next();
      procesar_carpeta(siguiente_carpeta);
    }
Lenguaje del código: JavaScript (javascript)

OK, guardamos nuestro código y ejecutamos una vez la función onOpen para que nos aparezca la usual pantalla en la que le damos permiso a nuestro propio código de acceder a nuestros archivos de Google Drive. Así también deberemos ver ya el menú que creamos en la hoja principal.

Ejecutar código de Apps Script

Si usamos este menú para ejecutar el código, veremos cómo mágicamente empieza a llenarse la hoja de filas que contienen la información de cada archivo al que tengamos acceso en la carpeta configurada. ¡Genial! ¿no? 😃

Menú para ejecutar función para leer información de carpeta
Lista de archivos con su tamaño en bytes

NOTA: Si utilizas unidades compartidas (shared drives), además deberás de agregar el servicio de Drive API en el editor de Apps Script para que funcione el código. Si solo estás analizando carpetas en tu propia unidad de Drive, puedes omitir este paso.

Añadir servicios avanzados Apps Script
Añadir servicio avanzado de Google Drive API a proyecto

Formato de bytes a KB, MB y GB

Ahora, como puedes ver en la hoja, la unidad del tamaño que nos devuelve el método getFiles es bytes, que no es tan fácil de dimensionar cuando tenemos archivos grandes. Este es un caso de uso perfecto para usar el formato de número personalizado del que hablamos en una guía pasada, porque podemos hacer operaciones precisas con los números originales sin sacrificar la usabilidad del formato, ya que podemos visualizarlo fácilmente como KB, MB o GB sin tener que modificar el número original de la celda ni convertirla a texto.

Solo elegimos los datos de la columna, y vamos al menú Formato – Número – Formato de número personalizado y pegamos este código de formato:

[<1000000]0.00," KB";[<1000000000]0.00,," MB";0.00,,," GB"

Formato de número personalizado

Calcular el tamaño de la carpeta con fórmulas

La verdad es que a partir de aquí ya tenemos toda la información necesaria para hacer el cálculo final del tamaño total de la carpeta. Y sin usar fórmulas ya podrías hacer cálculos rápidos usando filtros rápidos, pero si quieres tener un dato calculado siempre, vamos a revisar algunos métodos útiles para lograrlo.

Vamos a crear una hoja nueva, y en la primera celda usaremos la fórmula QUERY para sumarizar el tamaño de los archivos (que está en la columna E) por usuario (propietario), que es la columna F:

=QUERY(Archivos!A:L,"SELECT F, sum(E) group by F", TRUE)

Suma de tamaño agrupada por usuario

Esto nos será útil para saber cuánto nos ocupa a nosotros cada carpeta.

Si en vez de calcular el tamaño por propietario queremos hacerlo por subcarpeta, solo tenemos que cambiar la fórmula QUERY para agrupar por la columna J

=QUERY(Archivos!A:L,"SELECT J, sum(E) group by J", TRUE)

Suma de tamaño agrupada por usuario

La fila vacía es un efecto secundario de la manera en que funciona QUERY al agrupar filas, pero para efectos de nuestro objetivo puedes ignorarla.

Como pequeña nota, si quisieras hacer cálculos precisos convirtiendo de bytes a kilobytes, megabytes, etc., técnicamente tendrías que hacerlo basado en potencias de 2 y no de 10.

Con esta fórmula que te comparto puedes hacerlo fácilmente si quieres y percatarte de la diferencia de hacerlo con una y otra que es muy evidente una vez que aplicamos el formato de número personalizado:

=LET(bytes,B3,bytes*10^(3*FLOOR(LOG(bytes,2)/10))/2^(10*FLOOR(LOG(bytes,2)/10)))

Suma de tamaño en bytes precisa para bytes, kilobytes, megabytes, etc.

Calcular el tamaño de la carpeta con tabla dinámica (tabla pivote)

El segundo método para calcular el tamaño por carpeta y por propietario es usar una tabla dinámica, también llamada tabla pivote en Excel.

En el curso que ofrecemos puedes aprender más a detalle cómo funcionan, pues son infinitamente prácticas si sabes sacarles provecho.

Por ahora vamos a ir un poco más rápido para que veas a lo que me refiero. En la hoja de Archivos y situados en la primera celda, vamos al menú Insertar – Tabla dinámica y elegimos crearla en una hoja nueva.

Ya en la hoja de la tabla dinámica, la configuramos de la siguiente manera. En el apartado de Filas añadimos el campo de Propietario y también el de Carpeta. En el apartado de Valores añadimos Tamaño.

(img tabla dinámica tamaño)

Configuración tabla dinámica
Tabla dinámica suma de tamaño de carpeta

Ojo, recuerda lo que comentamos hace unos momentos sobre convertir de bytes en base 10 o base 2, pues es algo que debes considerar si tus cálculos deben ser precisos.

Si quieres también puedes agregar un campo calculado en el apartado de Valores para contar el número de archivos usando la fórmula =COUNTA(Carpeta) y eligiendo la opción Sumar por ‘Personalizado’

(img campo calculado)

Tabla dinámica suma de tamaño de carpeta con cuenta de archivos por usuario

Finalmente, si quisieras tener esta tabla agrupada por carpeta, solo debes cambiar el orden del campo de Carpeta para que vaya antes de Propietario

Tabla dinámica suma de tamaño de carpeta con cuenta de archivos por carpeta

Solo recuerda que si cambia la información de la hoja de Archivos también deberás asegurarte de que el intervalo de la hoja dinámica coincida.

Ahora sí ya podemos ver el total del tamaño de cualquier carpeta a la que tengamos acceso y también el de cada subcarpeta fácilmente.

¡Y listo! Ahora ya sabes cómo obtener una lista completa de los archivos contenidos en una carpeta de Google Drive para así calcular su tamaño fácilmente. Esto también te puede servir para llevar un mejor control de tus archivos en cierto momento del tiempo pues es una fotografía exacta de cómo estaban organizados al ejecutar el código.

Plantilla terminada para descargar

¡Espero que te haya sido útil esta guía! No olvides seguirnos en YouTube para más tips, trucos y guías de productividad.

Aprende Sheets: Curso práctico de Hojas de cálculo de Google
Aprende Sheets: Curso práctico de Hojas de cálculo de Google