2013-04-04 101 views
0

我想知道是否可以遍歷包含其他文件夾的文件夾,而其他文件夾包含其他文件夾文件夾等以動態的方式。我不知道有多少個子文件夾有子文件夾,並且想找出一種方法來檢查這一點,而不用硬編碼。很容易就可以降低兩級,但在此之後,我很難理解如何處理多分支並將其存儲起來,以便以後可以對其進行處理。有小費嗎?最後,文件夾結構將用於創建動態的Google網站佈局。找出一個文件夾是否有一個子文件夾,如果該子摺疊在Docslist中有一個子文件夾等等

這裏是我到目前爲止的例子:

function myFunction() { 
//Get the folder 
var topFolders = DocsList.getFolder('TestFolder'); 
var lvlOneFolders = topFolders.getFolders(); 
var num1Folders = lvlOneFolders.length; 
var someArray = []; 

for (var i = 0; i < num1Folders; i++){ 

someArray[i] = lvlOneFolders[i].getFolders(); 
    } 

Logger.log(someArray); 

} 

問候,

肖恩

function myFunctionTest() { 
    var site = SitesApp.getSite('finance-in-motion.com', 'test-site'); 
    //Get the folder 
    var rootFolder = DocsList.getFolder('TestFolder'); 
    var rootName = rootFolder.getName(); 
    var files = rootFolder.getFiles(); 
    var page; 

    site.createWebPage(rootName, rootName,"<h1>What evs21</h1>"); 

    page = site.getChildByName(rootName); 

    createFiles(page,files); 

    recursTest(rootFolder); 

    } 

function recursTest (currentFolder){ 

    var curLength=currentFolder.getFolders().length; 

    for(var i = curLength; i > 0; i --){ 

    var folders = currentFolder.getFolders(); 
    var parentName = currentFolder.getName(); 
    var foldername = folders[i-1].getName(); 
    var files = folders[i-1].getFiles(); 
    getSiteTest(foldername,parentName,files); 

    if(folders[i-1].getFolders().length != 0){ 
     recursTest(folders[i-1]); 
    } 
    } 


} 

function getSiteTest(title,parent,files) { 

    var site = SitesApp.getSite('finance-in-motion.com', 'test-site'); 

    var matches = site.search(parent); 

    var page = matches[0]; 

    var child; 

    //create the sibling page 
    page.createWebPage(title, title,"<h1>What evs21</h1>"); 

    child = page.getChildByName(title); 

    createFiles(child,files); 

    } 

function createFiles(page,files){ 

    var name; 

    if (files.length !=0){ 

     for (i in files){ 

     name = files[i].getName(); 
     page.createWebPage(name,name,"<h1>What evs21</h1>"); 

    } 

     } 


} 

回答

3

巧合我有類似的問題。我正在收集從屬文件夾和文件的文件夾名稱和編號。這可能有幫助。

function listFolders() { 
    var start = new Date(); 
    var topFolder = DocsList.getFolderById(TOP) ; // start point 
    var foldersArray = []; 
    foldersArray = getFolders(topFolder.getName(),topFolder,foldersArray); 
    // do what you want with array of folder data 
    } 
    function getFolders(path, container,arrayin) { 
    Logger.log(arrayin) 

    var folders = container.getFolders(0, 300); 
    var folderCount = folders.length; 
     var fileCount = container.getFiles().length; 
      arrayin.push([container.getId(),path,fileCount,folderCount]); 
       Logger.log(path + " #files= "+fileCount+ " #folders = "+folderCount); 
    for (var i=0;i<folders.length;i++) { 


    var thisFolder = folders[i].getName(); 
    var thisPath = path+"/"+thisFolder; 



    getFolders(thisPath,folders[i],arrayin) 
    } 
return arrayin; 
} 

我不是最偉大的JavaScript的人如此改進遞歸的東西歡迎

+0

作品很好,謝謝。這是一個更好的方法。+ 1 – 2013-04-05 20:56:11

+0

感謝您的迴應。我想到我也需要使用遞歸。我將不得不比較你寫的和我寫的內容。你的看起來更清潔一些。我正在做的是獲取所有的文件夾/文件,並使用它創建帶有嵌入式鏈接的網頁,因爲它很難在文檔列表中找到有些東西。通過這種方式,我們將創建一個樹形結構來創建一個反映它的Google網站,並且可以由部門中的任何人動態更新。這是我到目前爲止: – user1682683 2013-04-09 11:23:10

+0

我將附加代碼添加到原始帖子。它還有很長的路要走,但它的工作。 – user1682683 2013-04-09 11:29:21

2

編輯:使用DavidF更好地回答我寫了這個電子表格綁定的腳本,用不同f的列獲得結果的精美外觀類型和總數。

只是爲了說明;-)

EDIT2:我替換網址的ID,所以我可以直接到來自SS該文件夾和添加的執行時間顯示+位格式和公式的。 (注:container.getUrl()沒有根文件夾正常工作,這就是爲什麼我在IF條件的直接鏈接替換它)

這裏是代碼:

function onOpen() { 
    var menuEntries = [ {name: "Update data", functionName: "listFolders"} 
        ]; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    ss.addMenu("ListFolders",menuEntries);// 
} 

function listFolders() { 
    var start = new Date(); 
    var dateString = Utilities.formatDate(new Date(),Session.getTimeZone(), 'MMM-dd-yyyy'); 
    var topFolder = DocsList.getRootFolder() ; // start point 
    var foldersArray = []; 
    foldersArray = getFolders(topFolder.getName().replace('Root','MyDrive'),topFolder,foldersArray); 
    foldersArray.unshift(['Folders url','path','# SubFolders','# Spreadsheets','# Docs','# Forms','# Drawings','# Presentations','# others',]) 
// Logger.log(foldersArray) 
    var l = foldersArray.length 
    var duration = (new Date().getTime()-start.getTime())/1000; 
    var durationString = Utilities.formatString("%01.1f", duration) 
    var sh = SpreadsheetApp.getActiveSheet().clear(); 
    sh.getRange(1,1,1,foldersArray[0].length).setBackground('#ffffaa').setBorder(true,true,true,true,true,true).setFontWeight('bold'); 
    sh.getRange(1,1,l,foldersArray[0].length).setValues(foldersArray).setVerticalAlignment('middle').setWrap(false); 
    sh.getRange(l+1,2,1,foldersArray[0].length-1) 
    .setFormulas([['="Situation on '+dateString+' ..............Total = "&SUM(C'+(l+1)+':I'+(l+1)+')','=SUM(C2:C'+l+')','=SUM(D2:D'+l+')','=SUM(E2:E'+l+')','=SUM(F2:F'+l+')','=SUM(G2:G'+l+')','=SUM(H2:H'+l+')','=SUM(I2:I'+l+')']]) 
    .setBackground('#ffffaa').setBorder(true,true,true,true,true,true).setFontWeight('bold').setVerticalAlignment('middle').setHorizontalAlignment('right'); 
    sh.getRange(l+1,1).setFontColor('grey').setFontSize(9).setVerticalAlignment('middle').setHorizontalAlignment('center').setValue('execution time: '+durationString+' Seconds'); 
    sh.setFrozenRows(1); 
} 

function getFolders(path, container,arrayin) { 
    var folders = container.getFolders(0, 300); 
    var folderCount = folders.length; 
     var ssCount = container.getFilesByType(DocsList.FileType.SPREADSHEET).length; 
     var docCount = container.getFilesByType(DocsList.FileType.DOCUMENT).length; 
     var formCount = container.getFilesByType(DocsList.FileType.FORM).length; 
     var drawCount = container.getFilesByType(DocsList.FileType.DRAWING).length; 
     var presCount = container.getFilesByType(DocsList.FileType.PRESENTATION).length; 
     var otherCount = container.getFilesByType(DocsList.FileType.OTHER).length; 

     if(path=='MyDrive'){arrayin.push(['https://drive.google.com/?hl=fr&tab=wo#my-drive',path,folderCount,ssCount,docCount,formCount,drawCount,presCount,otherCount])} 
     else{arrayin.push([container.getUrl(),path,folderCount,ssCount,docCount,formCount,drawCount,presCount,otherCount])} 

    for (var i=0;i<folders.length;i++) { 
     var thisFolder = folders[i].getName(); 
     var thisPath = path+"/"+thisFolder; 
     getFolders(thisPath,folders[i],arrayin) 
     } 
    return arrayin; 
} 

enter image description here


以前的答案:

他重新走了。

它可以從根目錄掃描到3個級別,但您可以輕鬆地通過遵循相同的結構來增強其更深入。

結果與設置在以經典的方式 (文件夾/子文件夾/ subsubfolder)表示所有文件夾的數組,因爲我不知道你是怎麼想到要利用it.3

function folderTree() { 
var result = [] 
var foldersL1 = DocsList.getRootFolder().getFolders() 
    for(n=0;n<foldersL1.length;++n){ 
result.push(foldersL1[n].getName()) 
    var foldersL2 = foldersL1[n].getFolders() 
     for(m=0;m<foldersL2.length;++m){ 
result.push(foldersL1[n].getName()+'/'+foldersL2[m].getName())  
     var foldersL3 = foldersL2[m].getFolders() 
      for(o=0;o<foldersL3.length;++o){ 
result.push(foldersL1[n].getName()+'/'+foldersL2[m].getName()+'/'+foldersL3[o].getName()+'/') 
      } 
      } 
     } 
Logger.log(result)  
} 
相關問題