列出文件夹中的所有文件,包括子文件夹中的文件 [英] List all files in a folder, including files in sub folders

查看:127
本文介绍了列出文件夹中的所有文件,包括子文件夹中的文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个Google Apps脚本,允许用户获取文件夹内的所有文件,包括连接到主文件夹的子文件夹中的文件。 (请注意,在我的代码中,我是给予folderid的人,这将成为主文件夹)



我设法让所有人文件夹中的文件,但我也希望提取文件夹内的文件。



请参阅下面的代码。

  function onOpen(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var searchMenuEntries = [{name:在所有文件中搜索,functionName:search}];
//ss.addMenu(搜索文档列表,searchMenuEntries);
ss.addMenu(从Google Drive导入数据,searchMenuEntries);


function search(){
//提示用户输入搜索词
var searchTerm = Browser.inputBox(输入文件的文件夹ID你想要导入:);
// var folder = DocsList.getFolder(searchTerm);
var folder = DocsList.getFolderById(searchTerm)
var contents = folder.getFiles();

var file;
var data;

var sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
$ b sheet.appendRow([文件名,文件名(带链接),修订日期,文件类型,文档ID,元数据]);
$ b sheet.appendRow([StringFilter - 隐藏,StringFilter,DateFilter,StringFilter - 隐藏,StringFilter - 隐藏,csvFilter - 隐藏]);

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

现在,使用此代码的结果将如此。





但它只会显示主文件夹下的文件,我也想循环内部并检查是否有子文件夹,因此检查里面是否有文件并获取它。

此外,我想添加一个列名Folder / Sub-folder,其中我想显示该文件的文件夹名称和该文件的主文件夹(如果适用)看下面的例子,我手动完成。 (例如,主文件夹= Folder1和子文件夹= SubFolder1)



请指教。

$ b

function search(){
//提示用户输入搜索字词
var searchTerm = Browser.inputBox(输入要导入的文件的文件夹ID:);
var folder = DocsList.getFolderById(searchTerm);
$ b var data = [[FileName,文件名(带链接),修订日期,文件类型,DocumentID,元数据,文件夹/文件夹],
[StringFilter - 隐藏,StringFilter,DateFilter,StringFilter - 隐藏,StringFilter - 隐藏,csvFilter - 隐藏,]
];
searchFolder(文件夹,数据,);

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


函数searchFolder(文件夹,矩阵,路径){
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);

$ b $ function addFiles(files,matrix,path){
for(var i = 0; i< files.length; i ++){
var file =文件[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 。看一看这个其他答案,我将展示如何去做。


I'm trying to create a Google Apps Script that will allow user to get all files inside a folder including files inside a sub folder connected to the main folder. (Please take note that In my code, I'm the one who is giving the folderid and this this will be the main folder)

I've managed to get all files from a folder, but I also want the files inside the sub folder to be extracted.

See below code that I have made so far.

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

Now, with this code result will be like this.

But it will only show files that is under the main folder, I also want to loop inside and check if there is a sub-folder hence check whether there are files inside such and get it.

Further, I want to add a column name "Folder/Sub-folder" wherein I want to display the folder name of that file and the main folder of that file (if applicable) see below example that I've done manually. (e.g. Main Folder = Folder1 and Sub-Folder = SubFolder1)

Please advise.

解决方案

The easiest solution (IMHO) is to use a recursive function that search folder and subfolders. Like this:

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

Obviously, this function assumes you don't have more files that can be handled in a single run of the script (you know about the 6 minutes maximum execution time, right?). If you need a script that can be resumed later (automatically or manually), you'll have to use DriveApp instead of DocsList. Take a look at this other answer where I show how to do it.

这篇关于列出文件夹中的所有文件,包括子文件夹中的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆