最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to Make a list on Google SpreadSheet of all files in a Google Drive folder - Stack Overflow

programmeradmin4浏览0评论

I have a Folder With more than 2000 Files.. And i Need to make a List of all these files on google spreadsheet.. I Found online some Scripts.. but they're not pletely working. When i hit "RUN" i just get a list of 250 Files.

Reading on Google Developers page i found some things about enabling Google Drive advanced services (and i did it).. And i think i could solve this problem using something named "tokens"??

I don't know.. i'm not a programmer, and i barely know english.. i Tried editing this script making a fusion of what i found online.. But anything works.. i just get errors that i can't even understand..

So.. is there someone able to fix it?

function listFilesInFolder() {
  var folder = DocsList.getFolder("Film");
  var contents = folder.getFiles();
  var file;
  var data;

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();

  sheet.appendRow(["Nome", "Data", "Dimensione"]);

  for (var i = 0; i < contents.length; i++) {
    file = contents[i];

    if (file.getFileType() == "SPREADSHEET") {
      continue;
    }

    data = [ 
      file.getName(),
      file.getDateCreated(),
      file.getSize(),
    ];

    sheet.appendRow(data);
  }
};

I have a Folder With more than 2000 Files.. And i Need to make a List of all these files on google spreadsheet.. I Found online some Scripts.. but they're not pletely working. When i hit "RUN" i just get a list of 250 Files.

Reading on Google Developers page i found some things about enabling Google Drive advanced services (and i did it).. And i think i could solve this problem using something named "tokens"??

I don't know.. i'm not a programmer, and i barely know english.. i Tried editing this script making a fusion of what i found online.. But anything works.. i just get errors that i can't even understand..

So.. is there someone able to fix it?

function listFilesInFolder() {
  var folder = DocsList.getFolder("Film");
  var contents = folder.getFiles();
  var file;
  var data;

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();

  sheet.appendRow(["Nome", "Data", "Dimensione"]);

  for (var i = 0; i < contents.length; i++) {
    file = contents[i];

    if (file.getFileType() == "SPREADSHEET") {
      continue;
    }

    data = [ 
      file.getName(),
      file.getDateCreated(),
      file.getSize(),
    ];

    sheet.appendRow(data);
  }
};
Share Improve this question asked Sep 5, 2014 at 10:45 Jonathan LivingstonJonathan Livingston 1311 gold badge1 silver badge4 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 7

This Script works for at least 2200 Files :)

function listFilesInFolder(id) {
  var folder = DriveApp.getFolderById('MyFolderID');
  var contents = folder.getFiles();
  var file;
  var name;
  var sheet = SpreadsheetApp.getActiveSheet();
  var date;
  var size;

  sheet.clear();
  sheet.appendRow(["Nome", "Data", "Dimensione"]);


  while(contents.hasNext()) {
    file = contents.next();
    name = file.getName();
    date = file.getDateCreated()
    size = file.getSize()

    data = [name, date, size]
    sheet.appendRow(data);
  }
};

The answer above appends a row in every iteration wich is particularly slow and there is a chance you will exceed the maximum execution time (see best practices)) so here is a version that uses an array to collect data and writes the array using a single setValues() .

The other issue is that it gets all the files in your drive, not in the folder you chose...

so below is a version that gets all files that are not Google documents, ie it counts only files that take space (images, pdf...) with a maximum of 4000 files.

full code below :

function listFilesInFolder() {
  var folder = DocsList.getFolderById('0B3qSFd3iikE3MS0yMzU4YjQ4NC04NjQxLTQyYmEtYTExNC1lMWVhNTZiMjlhMmI');
  var file;
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  var data = [];
  data.push(["Name", "Data", "Size", "url"]);
  var filesresult = folder.getFilesByTypeForPaging(DocsList.FileType.OTHER, 4000);
  var files = filesresult.getFiles();
  Logger.log(files.length);
  for (var i in files) {
    file = files[i];
    data.push([ 
      file.getName(),
      file.getDateCreated(),
      file.getSize(),
      file.getUrl()
    ]);
  }
  sheet.getRange(1,1,data.length,data[0].length).setValues(data);   
}

Paging is what you're looking for. When you have a large number of results (like 2000 files), you generally divide the request into 'pages', either to show the user page by page or in this case, to stay within the API limits.

The 'token' isn't a big deal.. it's just how your script remembers the page number while it's dealing with the current page.

So there's information about this here: https://developers.google./apps-script/reference/docs-list/files-result

The script at the top of the page is quite apt to your situation. Your script bees something like...

function listFilesInFolder() {
  var folder = DocsList.getFolder("Film");
  //var contents = folder.getFiles();
  var file;
  //var data;

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();

  sheet.appendRow(["Nome", "Data", "Dimensione"]);


 var pageSize = 200;
 var files = null;
 var token = null; // use a null token for the first lookup
 do {
   var result = DocsList.getAllFilesForPaging(pageSize, token);
   files = result.getFiles();
   token = result.getToken();
   for (var i = 0; i < files.length; i++) {
    //Logger.log(files[i].getName());
    file = files[i];
    if (file.getFileType() == "SPREADSHEET") {
      continue;
    }
    data = [ 
      file.getName(),
      file.getDateCreated(),
      file.getSize(),
    ];

    sheet.appendRow(data);
   }
 } while (files.length >= pageSize);

};

I'm not promising this will work.. but I'm sure you can sort it out. Basically the "while loop" on that page replaces the "for loop" from your script. The loop on that page just calls Logger.log(), so you swap that with the sheet.appendRow(data)

I've taken the script suggested by Jonathan Livingston and made some edits.

Now it:

  • can take a name of a sheet with future report. It can make a new sheet if it doesn't exist,
  • gives more parameters, including list of editors (e-mails)

Here's the code:

function TESTlistFilesInFolder() {
  listFilesInFolder("0B0pifCWzjn-ib0ZWT2x1ekNOWAY", "Files Report");
  //                 ^^^^^^^^ folder ID ^^^^^^^^^    ^sheet Name^

}


// original script: http://stackoverflow./a/25730522/5372400
function listFilesInFolder(id, sheetName) {

  sheetName = sheetName || id;
  var sheet = createSheetIfNotExists(sheetName);

  var folder = DriveApp.getFolderById(id);
  var contents = folder.getFiles();

  sheet.clear();
  sheet.appendRow(["Name", "CreatedDate", "Last Updated", "Id", "Url", "Editors", "Viewers", "Owner", "Access", "Permission", "Size"]);

  var data = [];
  var file;
  var info = [];

  while(contents.hasNext()) {
    data = [];
    file = contents.next();
    data.push(file.getName());
    data.push(file.getDateCreated());
    data.push(file.getLastUpdated());
    data.push(file.getId());
    data.push(file.getUrl());
    // convert to string: http://www.w3schools./jsref/jsref_join.asp
    data.push(getEmails(file.getEditors()).join());
    data.push(getEmails(file.getViewers()).join());
    data.push(getEmails(file.getOwner()).join());
    data.push(file.getSharingAccess());
    data.push(file.getSharingPermission());
    data.push(file.getSize());        

    info.push(data);
  }

  var rows = info.length;
  var cols = info[0].length;

  var range = sheet.getRange(2,1,rows,cols);

  range.setValues(info);

};



function createSheetIfNotExists(name) { 
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  try {ss.setActiveSheet(ss.getSheetByName(name));}
    catch (e) {ss.insertSheet(name);} 

  var sheet = ss.getSheetByName(name);
  return sheet;
}

// users: https://developers.google./apps-script/reference/base/user
function getEmails(users) {
  var emails = [];
  var user;
  https://developer.mozilla/en/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
  if (!Array.isArray(users)) { users = [users]; }

  for (var i = 0; i < users.length; i++) {
    user = users[i];
    emails.push(user.getEmail());  
  }

  return emails;

}
发布评论

评论列表(0)

  1. 暂无评论