0

I am relatively new to JavaScript and I am trying to recursively find folders in my Google Drive and add the contents of the files into a Google Sheets document. I am using an Apps Script so it Googles version of JS. I have two problems with the attached code: 1. It only executes two iterations and stops. and 2. The second iteration looks at the same two folders as the first. Thank you for any insight anybody can provide.

 var newSpreadSheet = SpreadsheetApp.create("Merged Sheets");

    function processRootFolder(rootFolder) {
      var MAX_RUNNING_TIME_MS = 5 * 1000;
      var RECURSIVE_ITERATOR_KEY = "RECURSIVE_ITERATOR_KEY";
      var startTime = (new Date()).getTime();

       //[{folderName: String, fileIteratorContinuationToken: String?, folderIteratorContinuationToken: String}]
      var recursiveIterator = JSON.parse(PropertiesService.getDocumentProperties().getProperty(RECURSIVE_ITERATOR_KEY));
       
        if (recursiveIterator !== null) {
        // verify that it's actually for the same folder]
        
        if (rootFolder.getName() !== recursiveIterator[0].folderName){ 
          console.warn("Looks like this is a new folder. Clearing out the old iterator.");
          
recursiveIterator = null;
        } 
        else {
          console.info("Resuming session.");
        }
      }

      if (recursiveIterator === null) {
        console.info("Starting new session.");
        recursiveIterator = [];
        recursiveIterator.push(makeIterationFromFolder(rootFolder));
      }

      while (recursiveIterator.length > 0) {
        recursiveIterator = nextIteration(recursiveIterator, startTime);

        var currTime = (new Date()).getTime();
        var elapsedTimeInMS = currTime - startTime;
        var timeLimitExceeded = elapsedTimeInMS >= MAX_RUNNING_TIME_MS;

        if (timeLimitExceeded) {
          PropertiesService.getDocumentProperties().setProperty(RECURSIVE_ITERATOR_KEY, JSON.stringify(recursiveIterator));
          console.info("Stopping loop after '%d' milliseconds. Please continue running.", elapsedTimeInMS);
          
          return;
        }
      }

      console.info("Done running");
      PropertiesService.getDocumentProperties().deleteProperty(RECURSIVE_ITERATOR_KEY);
    }

    // process the next file or folder
    function nextIteration(recursiveIterator) {
      var currentIteration = recursiveIterator[recursiveIterator.length-1];

      if (currentIteration.fileIteratorContinuationToken !== null) {
        var fileIterator = DriveApp.continueFileIterator(currentIteration.fileIteratorContinuationToken);
        if (fileIterator.hasNext()) {
          // process the next file
          var path = recursiveIterator.map(function(iteration) { return iteration.folderName; }).join("/");
          processFile(fileIterator.next(), path);
          currentIteration.fileIteratorContinuationToken = fileIterator.getContinuationToken();
          recursiveIterator[recursiveIterator.length-1] = currentIteration;
          return recursiveIterator;
        } else {
          // done processing files
          currentIteration.fileIteratorContinuationToken = null;
          recursiveIterator[recursiveIterator.length-1] = currentIteration;
          return recursiveIterator;
        }
      }

      if (currentIteration.folderIteratorContinuationToken !== null) {
        var folderIterator = DriveApp.continueFolderIterator(currentIteration.folderIteratorContinuationToken);

        if (folderIterator.hasNext()) {
          // process the next folder
          var folder = folderIterator.next();
          recursiveIterator[recursiveIterator.length-1].folderIteratorContinuationToken = folderIterator.getContinuationToken();
          recursiveIterator.push(makeIterationFromFolder(makeIterationFromFolder(folder)));
          return recursiveIterator;
        } else {
          // done processing subfolders
          recursiveIterator.pop();
          return recursiveIterator;
        }
      }

      throw "should never get here";
    }

    function makeIterationFromFolder(folder) {
      return {
        folderName: folder.getName(), 
        fileIteratorContinuationToken: folder.files.getContinuationToken(),
        folderIteratorContinuationToken: folder.getFolders().getContinuationToken()
      };
    }

    function processFile(file, path) {
      console.log(path + "/" + file.getName());
      var parentFolder = DriveApp.getFolderById("name");
      var childFolder = parentFolder.getFolders();

     // Create the new spreadsheet that you store other sheets 
        //var newSpreadSheet = SpreadsheetApp.create("Merged Sheets");
        var csvFolder = childFolder.next();
        var spreadSheets = csvFolder.getFilesByType(MimeType.CSV);
        
        // Iterate over the spreadsheets over the folder
          var sheet = spreadSheets.next();
          var file = DriveApp.getFileById(sheet.getId());
          var created = file.getDateCreated();
          var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
          //var newSheet = newSpreadSheet.getActiveSheet();

            // output data to new spreadsheet
            /*newSheet.getRange(newSpreadSheet.getLastRow() + 1, newSpreadSheet.getLastColumn.length + 1, csvData.length, csvData[0].length).setValues(csvData);*/
            
        
      }

    processRootFolder(DriveApp.getFoldersByName("name"));
Andy Ray
  • 28,150
  • 13
  • 92
  • 132

0 Answers0