【问题标题】:Google apps script - iterate folder and subfolder谷歌应用脚​​本 - 迭代文件夹和子文件夹
【发布时间】:2015-01-20 02:21:45
【问题描述】:

我想使用 google apps 脚本遍历 Google Drive 中文件夹的树结构。下面的代码列出了一些文件夹,但不是全部。你能建议什么是深入文件夹结构的最佳技术吗?我首先尝试记录所有文件夹名称。

谢谢。

function test() {
 listSubfolders(DriveApp.getFolderById('FOLDER_ID'));
}

function listSubfolders(parentFolder) {
  var childFolders = parentFolder.getFolders();

 while(childFolders.hasNext()) {
   Logger.log(childFolders.next().getName());
   listSubfolders(childFolders.next());   

 }


}

【问题讨论】:

    标签: javascript google-apps-script google-drive-api


    【解决方案1】:

    要访问子文件夹,可以这样,

    function getSubFolders(parent) {
      parent = parent.getId();
      var childFolder = DriveApp.getFolderById(parent).getFolders();
      while(childFolder.hasNext()) {
        var child = childFolder.next();
        Logger.log(child.getName());
        getSubFolders(child);
      }
      return;
    }
    
    function listFolders() {
      var parentFolder = DriveApp.getFolderById("0B1n6YLYwFmK_dUpzRWhDRXNwdWc");
      var childFolders = parentFolder.getFolders();
      while(childFolders.hasNext()) {
        var child = childFolders.next();
        Logger.log(child.getName());
        getSubFolders(child);
      }
    }
    

    【讨论】:

    • 为什么在第 2-3 行中使用 parent = parent.getId();DriveApp.getFolderById(parent).getFolders() 而不是简单的 parent.getFolders()
    【解决方案2】:

    此 Google 脚本将生成包含所有文件和文件夹的 Google Drive Tree。

    将此脚本复制到您的脚本编辑器。从“选择函数”菜单中选择函数“genFolderTree”。在函数 genFolderTree() 中将根文件夹名称“RootDir”更改为您的根目录

    var foldername = 'RootDir';
    

    Google 脚本源代码 -

    function genFolderTree() {
    
      try {
    
      var foldername = 'RootDir';
      var folderlisting = 'TreeView_' + foldername;
    
      var parentFolder = DriveApp.getFoldersByName(foldername).next();
    
    
      var ss = SpreadsheetApp.create(folderlisting);
      var sheet = ss.getActiveSheet();
      var frontCell = [];
      sheet.appendRow([foldername]).getCurrentCell().setFontWeight('bold').setFontColor('red');
      frontCell.push(" ");
      getChildNode(parentFolder,sheet,frontCell);
      var files = parentFolder.getFiles();
      while (files.hasNext()) {
        frontCell.push(files.next().getName());
        sheet.appendRow( frontCell);
        frontCell.pop();
        }
    
      } catch (e) {
    
        Logger.log(e.toString());
    
      }
    
    }
    
    
    function getChildNode(parent,sheet,frontCell) {
    
      var childFolders = parent.getFolders();
      while (childFolders.hasNext()) {
    
        var childFolder = childFolders.next();
    
        frontCell.push(childFolder.getName())
        sheet.appendRow(frontCell);
        sheet.getRange(sheet.getLastRow(), frontCell.length).setFontWeight('bold').setFontColor('red');
        frontCell.pop();
        var files = childFolder.getFiles();
        frontCell.push(" ");
        var start_row = 0;
        var row_no = 0;
        while (files.hasNext()) {
          frontCell.push(files.next().getName());
          sheet.appendRow(frontCell);
          if(row_no==0){
            start_row = sheet.getLastRow();
          }
          row_no=row_no+1;
          frontCell.pop();
        }
        if(row_no>0){
          var range;
          range = sheet.getRange(start_row, frontCell.length,row_no);
          // The row grouping depth is increased by row_no.
          range.shiftRowGroupDepth(1);
        }
    
        // Recursive call for any sub-folders
        getChildNode(childFolder,sheet,frontCell);
        frontCell.pop();
      }
    
    }
    

    你可以从Github link下载源码

    【讨论】:

    • 嗨 Anupam- 你的代码对我来说效果很好。我知道这是一篇旧帖子,有没有办法将links/hyperlinks 插入到谷歌电子表格中的这些文本中?
    【解决方案3】:

    这应该可以解决问题:

    function start() {
     folder = DriveApp.getFolderById("0B_5HSTQXtXmsOHBzcnc2dTlkRFU") 
     listFolders(folder)
    }
    
    function listFolders(folder) {
      //starting point, we come here from start() or from the bottom of this function
    
    
    
      //check the name
      var name = folder.getName();
    
      if (name.match("TITL")) { 
         folder.addEditor("somePerson@gmail.com"); 
      }
    
      //now see if this folder has subfolders
      var subfolders = folder.getFolders();
    
      //if it has, we call this function again
      while (subfolders.hasNext()) {    
        listFolders(subfolders.next());
      }
    
    }
    

    【讨论】:

      【解决方案4】:

      认为这种方法可能不会重复。这会以以下格式输出完整路径名:

      '/根目录/目录/目录/目录/...'

      在“记录器”行所在的位置,您可以访问当前文件夹对象(callingFolder),因此您可以在此时对该文件夹插入任何操作。

      function myFunction() {
        var topFolder = DriveApp.getFolderById("0AMBwhqwkCWBbUk9PVA");
        var topPath = "/";
        iterateSubFolders(topFolder, topPath);
      }
      
      function iterateSubFolders(callingFolder, callingPath) {
      
        var callingFolderName = callingFolder.getName();
        var callingFolderFullPath = callingPath + callingFolderName + "/";
        Logger.log(callingFolderFullPath);
      
        var childSubFolders = callingFolder.getFolders();
        while (childSubFolders.hasNext()) {
            var nextSubFolder = childSubFolders.next();
            iterateSubFolders(nextSubFolder, callingFolderFullPath);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        相关资源
        最近更新 更多