搜索Google云端硬盘中子文件夹内的文件

时间:2016-04-12 15:00:47

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

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

找到关于它的bloggpost,并且按原样运行。 但是我的脚本需要将结果推送到数组中。到目前为止,我可以将文件推送到阵列,但我没有获取子文件夹的文件。

我有3个功能:

trigger_GetDriveFiles

byte

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]));
    } 
  }
}

bulkFile

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;
}

1 个答案:

答案 0 :(得分:1)

问题在于数据结构不一致。代码注释部分使用filesfiles.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云端硬盘无关;它只是对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;
}