【问题标题】:Search Files inside Sub-folders in Google Drive在 Google Drive 的子文件夹中搜索文件
【发布时间】:2016-04-12 15:00:46
【问题描述】:

与仅在直接文件夹中搜索文件的 DriveApp.getFilesByType() 方法不同,我也在尝试搜索子文件夹中的文件。

找到了关于它的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 != "admin.fileshare@domain.com"){
      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;
}

批量文件

function bulkFile(ownerEmail, fileIds) {
  var ts = tokenService(ownerEmail);
  LibDrive.Init(ts);
  var dSA = LibDrive.ServiceAccount(ownerEmail);
 return dSA.batchPermissionChange(fileIds, "admin.fileshare@domain.com"); //<-- This is the user that recieves the folder/file
}

【问题讨论】:

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


    【解决方案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 != "admin.fileshare@domain.com"){
          files.push({'id': id, 'owner': owner});
        }
      }
      var folderIt = folder.getFolders();
      while (folderIt.hasNext()) {
        files = files.concat(GetDriveFiles(folderIt.next()));
      }
      return files;
    }
    

    convertToObj 函数与 Google Drive 无关;这只是对 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;
    }
    

    【讨论】:

    • 感谢您的评论,我包含批处理/批量功能只是为了表明您建议的方法不起作用,因为我需要像这样传递它“function bulkFile(ownerEmail , fileIds) ".
    • 输出现在看起来像这样:[{owner=adam.aden@domain.com, id=1aYF62ynb8BYut7mbfrVFHC2GYfxhM0W8}, {owner=adam.aden@domain.com, id=1C5xhapMROPb3FZoSTRzcafDyZxYUWGpnh0}, {owner =adam.aden@domain.com, id=1UgGC9u2xxPlhbEQ4G1UIz1ktJxdDPqbzOvo}]。
    • 我写了输出可以从数组格式转换为你想要的对象格式。现在我包含了执行此操作的函数convertToObj
    猜你喜欢
    • 2017-06-04
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多