Reputation: 397
Unlike the DriveApp.getFilesByType() method that will only search for files in the immediate folder, i'm trying to also search for files inside the sub-folders.
Found this bloggpost about it, and that works as is. However my script needs to push the result into an Array. So far i can push files to the array but i'm not fetching the subfolder's files.
I have 3 functions:
trigger_GetDriveFiles
function trigger_GetDriveFiles(){
var folder = DriveApp.getFolderById("0B2XfBTL5aSGMZTNwTDlwT2JqNjg");
var filesJSObj = GetDriveFiles(folder);
for(var i in filesJSObj){
if(filesJSObj.hasOwnProperty(i)){
Logger.log(bulkFile(i, filesJSObj[i]));
}
}
}
GetDriveFiles (The out-commented section is where it fails)
function GetDriveFiles(folder) {
var files = {};
var fileIt = folder.getFiles();
while (fileIt.hasNext()) {
var f = fileIt.next();
var owner = f.getOwner().getEmail();
var id = f.getId();
if (owner != "[email protected]"){
if (!files[owner]) {
files[owner] = [];
}
// push the file to the owner's array
files[owner].push(id);
}
}
/*
// Get all the sub-folders and iterate, This is the part not wokring!
var folderIt = folder.getFolders();
while(folderIt.hasNext()) {
fs = GetDriveFiles(folderIt.next());
for (var i = 0; i < fs.length; i++) {
files.push(fs[i].id)
}
}*/
return files;
}
bulkFile
function bulkFile(ownerEmail, fileIds) {
var ts = tokenService(ownerEmail);
LibDrive.Init(ts);
var dSA = LibDrive.ServiceAccount(ownerEmail);
return dSA.batchPermissionChange(fileIds, "[email protected]"); //<-- This is the user that recieves the folder/file
}
Upvotes: 1
Views: 1639
Reputation:
The problem is in inconsistent data structures. The commented part of code treats files
as an array, using files.push
. In the rest of the code it's an object with keys being owner emails.
Another problem with files
being such an object is that the function would have to merge object properties, which is messy. I suggest changing the structure to files
being an array of objects {id: id, file: file}
. This is easy to concatenate, and after the work is done, the resulting array can be then converted to an object with keys being owners. I include the conversion bit convertToObj
at the end.
function trigger_GetDriveFiles() {
var folder = DriveApp.getFolderById('your_id');
Logger.log(convertToObj(GetDriveFiles(folder)));
}
function GetDriveFiles(folder) {
var files = [];
var fileIt = folder.getFiles();
while (fileIt.hasNext()) {
var f = fileIt.next();
var owner = f.getOwner().getEmail();
var id = f.getId();
if (owner != "[email protected]"){
files.push({'id': id, 'owner': owner});
}
}
var folderIt = folder.getFolders();
while (folderIt.hasNext()) {
files = files.concat(GetDriveFiles(folderIt.next()));
}
return files;
}
The function convertToObj has nothing to do with Google Drive; it's just a manipulation with JS objects and arrays.
function convertToObj(files) {
var filesObj = {};
for (var i = 0; i < files.length; i++) {
var owner = files[i].owner;
if (!filesObj[owner]) {
filesObj[owner] = [];
}
filesObj[owner].push(files[i].id);
}
return filesObj;
}
Upvotes: 1