在Google Drive中,我正在搜索特定文件"验证访问">和"completed">其中文件类型需要是一个电子表格(.xlsx)类型文件。搜索将通过父文件夹,然后进入子文件夹。因此,特定的文件将存储在一些子文件夹(Google Drive ->父文件夹->子文件夹)。
代码如下:
function getChildFolders(parentName, parent, sheet, voidFolder, excluded) {
var childFolders = parent.getFolders();
var folder = childFolders.next();
var failIter = folder.searchFiles('title contains "completed"');
while (failIter.hasNext()) {
var fail = failIter.next();
var failWithTitle = fail.getName();
var files = folder.getFilesByType(MimeType.MICROSOFT_EXCEL);
var output = [];
var path;
var Url;
var fileID;
while (files.hasNext()) {
var childFile = files.next();
var fileName = childFile.getName();
path = parentName + ' |--> ' + fileName;
fileID = childFile.getId();
Url = 'https://drive.google.com/open?id=' + fileID;
output.push([fileID, fileName, path, Url]);
}
if (output.length) {
var last_row = sheet.getLastRow();
sheet.getRange(last_row + 1, 1, output.length, 4).setValues(output);
}
getChildFolders(
parentName + ' |--> ' + fileName,
folder,
sheet,
voidFolder,
excluded
);
}
}
我已经成功实现了两个条件(包含特定名称的文件)以及文件类型)在此函数中。这里的问题是子文件夹中文件的搜索过程只对第一个子文件夹进行搜索,而不会继续搜索到下一个子文件夹。它只列出第一个子文件夹中的文件,而不列出其他子文件夹中的文件。
我得到一个错误消息告诉"Exception: Cannot retrieve the next object: iterator has reached the end.">
问题:
- 您没有检查parent.getFolders()是否返回任何文件夹,因此当您到达层次结构的末尾并且在该级别上没有进一步的子文件夹时,childFolders.next();
- 你没有遍历FolderIterator(例如,
while (folderIter.hasNext()) {
),所以你只得到迭代器中的第一个文件夹。 - 您正在遍历包含
completed
的文件,但在每个文件迭代中,您将再次迭代folder.getFilesByType
以检查MIME类型(检查可用的搜索查询项)。也就是说,您将遍历该文件夹中的文件两次,这很可能会返回重复的结果。
建议工作流:
- 对于每个文件夹,使用folder查找所需的文件。搜索文件与你想要的两个条件(标题包含
completed
和mime类型对应于MS Excel),并通过FileIterator.hasNext()
在while
循环的结果迭代。 - 对于每个文件夹,通过
Folder.getFolders()
查找相应的子文件夹,并使用FolderIterator.hasNext()
和while
循环遍历结果。对于这些子文件夹中的每一个,递归地调用函数。 - SpreadsheetApp使用。刷新以确保每次使用
setValues
时都更新工作表,这样以前的数据就不会被覆盖。
代码示例:
function getChildFiles(folderName, folder, sheet) {
var fileIter = folder.searchFiles("title contains 'completed' and mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'");
var folderId = folder.getId();
var output = [];
while (fileIter.hasNext()) { // Iterate through files in folder
var file = fileIter.next();
var fileName = file.getName();
var path = folderName + ' |--> ' + fileName;
var fileID = file.getId();
var Url = 'https://drive.google.com/open?id=' + fileID;
output.push([fileID, fileName, path, Url, folderId]);
}
if (output.length) {
var last_row = sheet.getLastRow();
sheet.getRange(last_row + 1, 1, output.length, output[0].length).setValues(output);
SpreadsheetApp.flush();
}
var childFolders = folder.getFolders();
while (childFolders.hasNext()) { // Iterate through folders in folder
var childFolder = childFolders.next();
var childFolderName = childFolder.getName();
getChildFiles(
folderName + ' |--> ' + childFolderName,
childFolder,
sheet
);
}
}