2016-04-12 13 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.pushを使用してfilesを配列として扱います。残りのコードでは、キーがオーナー電子メールであるオブジェクトです。

このようなオブジェクトであるfilesのもう1つの問題は、オブジェクトプロパティをマージする必要があります。これはmessyです。オブジェクトの配列{id: id, file: file}であるfilesに構造を変更することをお勧めします。これは連結するのが簡単で、作業が完了した後、得られた配列をキーが所有者であるオブジェクトに変換することができます。最後に変換ビット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

出力は次のようになります。[{owner = [email protected]、id = 1aYF62ynb8BYut7mbfrVFHC2GYfxhM0W8}、{[email protected]、id = 1C5xhapMROPb3FZoSTRzcafDyZxYUWGpnh0}、{[email protected]。 com、id = 1UgGC9u2xxPlhbEQ4G1UIz1ktJxdDPqbzOvo}]。 –

+1

私は、出力を配列形式から必要なオブジェクト形式に変換できると書いています。そして、これを行う 'convertToObj'関数を追加しました。 –

関連する問題