Home > Software engineering >  How to speed up Script to return all files from drive
How to speed up Script to return all files from drive

Time:11-09

i use a script to take all my files from drive to a google spreadsheet with name, url...

My problem is there are a lot of files and the script run during ~30 min and exceed during time permission for apps script.

How can i speed this script please ?

function listFilesAndFolders() {
  var folderid = " "; // change FolderID
  var sh = SpreadsheetApp.getActiveSheet();
  sh.clear();
  sh.appendRow(["parent","folder", "name", "update", "Size", "URL", "ID", "description", "type"]);
  try {
    var parentFolder =DriveApp.getFolderById(folderid);
    listFiles(parentFolder,parentFolder.getName())
    listSubFolders(parentFolder,parentFolder.getName());
  } catch (e) {
    Logger.log(e.toString());
  }
}

function listSubFolders(parentFolder,parent) {
  var childFolders = parentFolder.getFolders();
  while (childFolders.hasNext()) {
    var childFolder = childFolders.next();
    Logger.log("Fold : "   childFolder.getName());
    listFiles(childFolder,parent)
    listSubFolders(childFolder,parent   "|"   childFolder.getName());
  }
}

function listFiles(fold,parent){
  var sh = SpreadsheetApp.getActiveSheet();
  var data = [];
  var files = fold.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    data = [ 
      parent,
      fold.getName(),
      file.getName(),
      file.getLastUpdated(),
      file.getSize(),
      file.getUrl(),
      file.getId(),
      file.getDescription(),
      file.getMimeType()
      ];
    sh.appendRow(data);
  }
}

CodePudding user response:

Rather then use Sheet.appendRow() collect each row in an array rows and when all done looping use .getRange().setValues().

function listFilesAndFolders() {
  var folderid = " "; // change FolderID
  var sh = SpreadsheetApp.getActiveSheet();
  sh.clear();
  let rows = [["parent","folder", "name", "update", "Size", "URL", "ID", "description", "type"]];
  try {
    var parentFolder =DriveApp.getFolderById(folderid);
    listFiles(parentFolder,parentFolder.getName(),  rows  )
    listSubFolders(parentFolder,parentFolder.getName());
    sh.getRange(sh.getLastRow() 1,1,rows.length,rows[0].length).setValues(rows);
  } catch (e) {
    Logger.log(e.toString());
  }
}

function listSubFolders(parentFolder,parent) {
  var childFolders = parentFolder.getFolders();
  while (childFolders.hasNext()) {
    var childFolder = childFolders.next();
    Logger.log("Fold : "   childFolder.getName());
    listFiles(childFolder,parent)
    listSubFolders(childFolder,parent   "|"   childFolder.getName());
  }
}

function listFiles(fold,parent,  rows  ){
  var sh = SpreadsheetApp.getActiveSheet();
  var files = fold.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    rows.push([ 
      parent,
      fold.getName(),
      file.getName(),
      file.getLastUpdated(),
      file.getSize(),
      file.getUrl(),
      file.getId(),
      file.getDescription(),
      file.getMimeType()
      ]);
  }
}

CodePudding user response:

This will list all of the files and folders in your drive into Sheet1

function getFnF1(folder = DriveApp.getRootFolder()) {
  let tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
  //Logger.log(JSON.stringify(tree));
  if (tree.level < level) {
    tree.level = level;
    PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  }
  const files = folder.getFiles();
  let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = folder.getName(); } else { x = ''; } return x; }));
  tree.txt.push(row);
  row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'bold'; } else { x = 'normal'; } return x; }));
  tree.fwt.push(row);
  PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  if (files.hasNext()) {
    let row = Array.from([...Array(level).keys()], ((x, i) => { if (i == level - 1) { x = 'Files:'; } else { x = ''; } return x; }));
    tree.txt.push(row);
    tree.fwt.push(['normal']);
    PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  }
  while (files.hasNext()) {
    let file = files.next();
    let row = Array.from([...Array(level   1).keys()], ((x, i) => { if (i == level) { x = file.getName(); } else { x = ''; } return x; }));
    tree.txt.push(row);
    tree.fwt.push(['normal']);
    PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify(tree));
  }
  const subfolders = folder.getFolders()
  while (subfolders.hasNext()) {
    let subfolder = subfolders.next();
    level  ;
    getFnF1(subfolder);
  }
  level--;
}

function getFilesAndFolders1() {
  const fldr = null;
  const ss = SpreadsheetApp.getActive();
  ss.toast("Entry");
  const sh = ss.getSheetByName('Sheet1');
  sh.clearContents();
  SpreadsheetApp.flush();
  PropertiesService.getScriptProperties().setProperty('FnF', JSON.stringify({ txt: [], fwt: [], level: 0 }));
  getFnF1();
  //Logger.log(PropertiesService.getScriptProperties().getProperty('FnF'));
  let tree = JSON.parse(PropertiesService.getScriptProperties().getProperty('FnF'));
  const l = tree.level   1
  tree.txt.forEach(r => {
    if (r.length < l) {
      //Array.from(Array(l - r.length).keys()).forEach(e => r.push(''));
      r.splice(r.length, 0, ...Array(l - r.length).fill(''));
    }
  });
  tree.fwt.forEach(r => {
    if (r.length < l) {
      //Array.from(Array(l - r.length).keys()).forEach(e => r.push('normal'));
      r.splice(r.length, 0, ...Array(l - r.length).fill('normal'));
    }
  });
  //Logger.log(JSON.stringify(tree));
  sh.getRange(1, 1, tree.txt.length, tree.level   1).setValues(tree.txt);
  sh.getRange(1, 1, tree.fwt.length, tree.level   1).setFontWeights(tree.fwt);
  PropertiesService.getScriptProperties().deleteProperty('FnF');
  ss.toast("EOF");
}

It takes about 3 minutes on my drive. I keep my drive pretty clean and I don't list as many parameters as you desired.

  • Related