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"));