2016-04-12 3 views
1

В отличие от метода DriveApp.getFilesByType(), который будет искать файлы только в непосредственной папке, я также пытаюсь выполнить поиск файлов внутри подпапок.Поиск файлов внутри подпапок в Google Диске

Обнаружил это bloggpost об этом, и это работает как есть. Однако мой скрипт должен подтолкнуть результат к массиву. Пока я могу передавать файлы в массив, но я не получаю файлы подпапки.

У меня есть 3 функции:

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 (раздел из комментируются, где он не)

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 
} 

ответ

1

Проблема в несогласованных структурах данных. Прокомментированная часть кода обрабатывает files как массив, используя files.push. В остальной части кода это объект с ключами, являющимися владельцами писем.

Другая проблема с files, являющаяся таким объектом, заключается в том, что функции должны были бы объединить свойства объекта, то есть messy. Я предлагаю изменить структуру на files, являясь массивом объектов {id: id, file: file}. Это легко конкатенация, и после завершения работы результирующий массив может быть затем преобразован в объект с ключами, являющимися владельцами. В конце я включаю бит преобразования convertToObj.

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; 
} 

Функция convertToObj не имеет ничего общего с Google Диском; это просто манипуляция с объектами и массивами JS.

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; 
} 
+0

Спасибо за комментарий, я включил/объемную функцию пакетного только чтобы показать, что подход, вы предлагаете не работает из-за мне нужно передать его как это «функция bulkFile (ownerEmail, fileIds) ". –

+0

Результат выглядит следующим образом: [{[email protected], id = 1aYF62ynb8BYut7mbfrVFHC2GYfxhM0W8}, {[email protected], id = 1C5xhapMROPb3FZoSTRzcafDyZxYUWGpnh0}, {[email protected] com, id = 1UgGC9u2xxPlhbEQ4G1UIz1ktJxdDPqbzOvo}]. –

+1

Я написал, что вывод можно преобразовать из формата массива в формат объекта, который вы хотите. И теперь я включил функцию 'convertToObj', которая делает это. –