es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando una vista en árbol de las carpetas de Google Drive

Quiero crear una base de datos JSON de carpetas (solamente) de Google Drive para un panel de vista en árbol. He intentado extraer la base de datos utilizando Google Sheets utilizando este código:

var level=0;
getFnF()

function getFnF(folder) {
  var folder= folder || DriveApp.getFolderById("ID AQUÍ");
  var sh=SpreadsheetApp.getActiveSheet();
  var subfolders=folder.getFolders() 
  while(subfolders.hasNext()) {
    var subfolder=subfolders.next();
    var forg=sh.getRange(sh.getLastRow() + 1,level + 1);
    forg.setValue(Utilities.formatString(subfolder.getName() + "      "+ subfolder.getId()));
    level++;
    getFnF(subfolder);
  }
  level--;
}

pero me quedé atascado en cómo transformarlo en una base de datos con este formato:

export const treeMenu = [
  {
    key: "ID de la carpeta",
    label: "carpeta1",
    nodes: [
      {
        key: "ID de la carpeta",
        label: "sub-carpeta",
        nodes: [
          {
            key: "ID de la carpeta",
            label: "sub-sub-carpeta",
            nodes: [],
          },
        ],
      },
    ],
  },
  {
    key: "ID de la carpeta",
    label: "carpeta",
  },
];
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para transformar los datos extraídos al formato deseado, puedes modificar el código existente de la siguiente manera:

    var treeMenu = [];
    getFnF();
    
    function getFnF(carpeta) {
      var carpeta = carpeta || DriveApp.getFolderById("ID AQUÍ");
    
      var objetoCarpeta = {
        key: carpeta.getId(),
        label: carpeta.getName(),
        nodes: []
      };
    
      var subcarpetas = carpeta.getFolders();
      while (subcarpetas.hasNext()) {
        var subcarpeta = subcarpetas.next();
        var objetoSubcarpeta = {
          key: subcarpeta.getId(),
          label: subcarpeta.getName(),
          nodes: []
        };
    
        agregarSubcarpetas(subcarpeta, objetoSubcarpeta);
        objetoCarpeta.nodes.push(objetoSubcarpeta);
      }
    
      treeMenu.push(objetoCarpeta);
    }
    
    function agregarSubcarpetas(carpeta, objetoCarpeta) {
      var subcarpetas = carpeta.getFolders();
      while (subcarpetas.hasNext()) {
        var subcarpeta = subcarpetas.next();
        var objetoSubcarpeta = {
          key: subcarpeta.getId(),
          label: subcarpeta.getName(),
          nodes: []
        };
    
        agregarSubcarpetas(subcarpeta, objetoSubcarpeta);
        objetoCarpeta.nodes.push(objetoSubcarpeta);
      }
    }
    

    Este código crea un arreglo vacío llamado treeMenu, llama a la función getFnF sin ningún argumento para iniciar la recursión con la carpeta raíz y luego modifica la recursión para construir la estructura de objeto requerida.

    La función getFnF crea un objeto objetoCarpeta para la carpeta actual, con su key establecido en el ID de la carpeta, label establecido en el nombre de la carpeta y nodes establecido como un arreglo vacío. Luego, itera sobre las subcarpetas de la carpeta actual, creando un objeto objetoSubcarpeta para cada subcarpeta y llamando a la función agregarSubcarpetas con esa subcarpeta y objeto de subcarpeta como argumentos. El arreglo nodes del objetoCarpeta se rellena luego con los objetos de subcarpeta y el objetoCarpeta se agrega al arreglo treeMenu.

    La función agregarSubcarpetas hace lo mismo que getFnF, pero para las subcarpetas. Se llama recursivamente para cada subcarpeta para construir los arreglos de nodes anidados.

    Después de que se complete la recursión, el arreglo treeMenu debería contener la estructura de objeto deseada, que luego puedes utilizar según sea necesario.

Comments are closed.