2014-05-20 90 views
3

我正在嘗試創建一個Google Apps腳本,該腳本允許用戶獲取文件夾內的所有文件,包括連接到主文件夾的子文件夾內的文件。 (請注意,在我的代碼中,我是誰給了folderid,這將成爲主文件夾)列出文件夾中的所有文件,包括子文件夾中的文件

我設法從一個文件夾中獲取所有文件,但我也想要這些文件在要提取的子文件夾內。

查看下面我到目前爲止所做的代碼。

function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var searchMenuEntries = [ {name: "Search in all files", functionName: "search"}]; 
    //ss.addMenu("Search Document List", searchMenuEntries); 
    ss.addMenu("Import Data from Google Drive",searchMenuEntries); 
} 

function search() { 
    // Prompt the user for a search term 
    var searchTerm = Browser.inputBox("Enter the folder ID of the files that you want to import:"); 
    //var folder = DocsList.getFolder(searchTerm); 
    var folder = DocsList.getFolderById(searchTerm) 
    var contents = folder.getFiles(); 

    var file; 
    var data; 

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

    sheet.appendRow(["FileName","File name (with link)", "Revision Date", "File Type", "DocumentID", "Meta Data"]); 

    sheet.appendRow(["StringFilter - Hidden", "StringFilter", "DateFilter", "StringFilter - Hidden","StringFilter - Hidden", "csvFilter - Hidden"]); 

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

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

    data = [ 
    file.getName(), 
     "<a href= " + file.getUrl() + " target= '_blank'>" + file.getName() + "</a>", 
     file.getLastUpdated(), 
     file.getFileType(), 
     file.getId(), 
     file.getDescription() 
    ]; 

    sheet.appendRow(data); 
    } 
}; 

現在,使用此代碼的結果將是這樣的。

http://i.stack.imgur.com/aFke0.png

但它只會顯示文件是主文件夾下,我也想循環內,並且檢查是否有因此一個子文件夾檢查是否有內這樣的文件,並得到它。

此外,我想添加一個列名「文件夾/子文件夾」,其中我想顯示該文件的文件夾名稱和該文件的主文件夾(如果適用),請參閱下面的示例,我已經完成手動。 (例如主文件夾= Folder1中和子文件夾= SubFolder1)

http://i.stack.imgur.com/2fETk.png

請告知。

回答

3

最簡單的解決方案(恕我直言)是使用搜索文件夾和子文件夾的遞歸函數。就像這樣:

function search() { 
    // Prompt the user for a search term 
    var searchTerm = Browser.inputBox("Enter the folder ID of the files that you want to import:"); 
    var folder = DocsList.getFolderById(searchTerm); 

    var data = [["FileName","File name (with link)", "Revision Date", "File Type", "DocumentID", "Meta Data", "Folder/Sub-folder"], 
       ["StringFilter - Hidden", "StringFilter", "DateFilter", "StringFilter - Hidden","StringFilter - Hidden", "csvFilter - Hidden",""] 
      ]; 
    searchFolder(folder, data, ""); 

    var sheet = SpreadsheetApp.getActiveSheet(); 
    sheet.clear().getRange(1,1,data.length,data[0].length).setValues(data); 
} 

function searchFolder(folder, matrix, path) { 
    path += folder.getName(); 
    addFiles(folder.getFiles(), matrix, path); 
    path += ','; 
    var folders = folder.getFolders(); 
    for(var i = 0; i < folders.length; ++i) 
    searchFolder(folders[i], matrix, path); 
} 

function addFiles(files, matrix, path) { 
    for (var i = 0; i < files.length; i++) { 
    var file = files[i]; 

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

    matrix.push([ 
    file.getName(), 
     "<a href= " + file.getUrl() + " target= '_blank'>" + file.getName() + "</a>", 
     file.getLastUpdated(), 
     file.getFileType(), 
     file.getId(), 
     file.getDescription(), 
     path 
    ]); 
    } 
} 

顯然,這個函數假設你沒有,可以在腳本的單次運行來處理多個文件(你知道的最大6分鐘執行時間,對吧?)。如果您需要一個可以稍後(自動或手動)恢復的腳本,則必須使用DriveApp而不是DocsList。看看this other answer,我將展示如何去做。

相關問題