我正在尝试创建一个Google Apps脚本,允许用户获取文件夹中的所有文件,包括连接到主文件夹的子文件夹中的文件。 (请注意,在我的代码中,我是给出文件夹的人,这将是主文件夹)
我设法从文件夹中获取所有文件,但我也希望提取子文件夹中的文件。
见下面我到目前为止所做的代码。
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);
}
};
现在,使用此代码结果将是这样的。
但是它只显示主文件夹下的文件,我也想循环进去并检查是否有子文件夹,因此检查是否有文件存在,并获取它。
此外,我想添加一个列名&#34;文件夹/子文件夹&#34;其中我想显示该文件的文件夹名称和该文件的主文件夹(如果适用),请参阅下面我手动完成的示例。 (例如主文件夹= Folder1和子文件夹= SubFolder1)
请告知。
答案 0 :(得分:3)
最简单的解决方案(恕我直言)是使用搜索文件夹和子文件夹的递归函数。像这样:
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
]);
}
}
显然,这个函数假设你没有更多的文件可以在一次运行的脚本中处理(你知道6分钟的最大执行时间,对吗?)。如果您需要可以稍后(自动或手动)恢复的脚本,则必须使用DriveApp
而不是DocsList
。看看this other answer我在哪里展示如何做。