如何使用 Google 脚本在多个子文件夹的 Google Drive 文件夹中一起搜索特定文件名和文件类型
How to search a Specific File Name and File Type together in Google Drive folder from multiple sub folders using Google Script
在 Google 驱动器中,我正在搜索一个 特定文件 ,其中包含单词 “验证访问” 和 "completed" 其中 文件类型 需要是 电子表格 (.xlsx) 类型的文件。搜索将通过父文件夹,然后进入子文件夹。因此特定文件将存储在某些子文件夹中(Google Drive -> Parent folder -> Sub folders)。
代码如下:
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
);
}
}
我已经在此函数中成功实现了两个条件(包含特定名称 的文件以及文件类型)。这里的问题是子文件夹中文件的搜索过程只对第一个子文件夹进行,而不会继续搜索到下一个子文件夹。它只列出第一个子文件夹中的文件,而不列出其他子文件夹中的文件。
我收到一条错误消息,告诉我 “异常:无法检索下一个对象:迭代器已到达末尾。”
问题:
- 您没有检查 parent.getFolders() returns any folder, so when you reach the end of the hiearchy and there are no further subfolders on that level, childFolders.next(); 是否因您收到的错误而失败。
- 您没有遍历 FolderIterator(例如,使用
while (folderIter.hasNext()) {
),因此您只会得到迭代器中的第一个文件夹。
- 您正在遍历包含
completed
的文件,但在每个文件迭代中您再次使用 folder.getFilesByType
进行迭代以检查 MIME 类型(检查可用的 search query terms)。也就是说,您正在对该文件夹中的文件进行两次迭代,这很可能会 return 重复结果。
建议的工作流程:
- 对于每个文件夹,使用您想要的两个条件(标题包含
completed
并且 mime 类型对应于 MS Excel)查找带有 Folder.searchFiles 的所需文件并遍历结果 FileIterator.hasNext()
在 while
循环中。
- 对于每个文件夹,通过
Folder.getFolders()
查找相应的子文件夹,并使用 FolderIterator.hasNext()
和 while
循环遍历结果。对于这些子文件夹中的每一个,递归调用您的函数。
- 使用 SpreadsheetApp.flush 确保每次使用
setValues
时 sheet 得到更新,这样以前的数据就不会被覆盖。
代码示例:
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
);
}
}
在 Google 驱动器中,我正在搜索一个 特定文件 ,其中包含单词 “验证访问” 和 "completed" 其中 文件类型 需要是 电子表格 (.xlsx) 类型的文件。搜索将通过父文件夹,然后进入子文件夹。因此特定文件将存储在某些子文件夹中(Google Drive -> Parent folder -> Sub folders)。
代码如下:
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
);
}
}
我已经在此函数中成功实现了两个条件(包含特定名称 的文件以及文件类型)。这里的问题是子文件夹中文件的搜索过程只对第一个子文件夹进行,而不会继续搜索到下一个子文件夹。它只列出第一个子文件夹中的文件,而不列出其他子文件夹中的文件。
我收到一条错误消息,告诉我 “异常:无法检索下一个对象:迭代器已到达末尾。”
问题:
- 您没有检查 parent.getFolders() returns any folder, so when you reach the end of the hiearchy and there are no further subfolders on that level, childFolders.next(); 是否因您收到的错误而失败。
- 您没有遍历 FolderIterator(例如,使用
while (folderIter.hasNext()) {
),因此您只会得到迭代器中的第一个文件夹。 - 您正在遍历包含
completed
的文件,但在每个文件迭代中您再次使用folder.getFilesByType
进行迭代以检查 MIME 类型(检查可用的 search query terms)。也就是说,您正在对该文件夹中的文件进行两次迭代,这很可能会 return 重复结果。
建议的工作流程:
- 对于每个文件夹,使用您想要的两个条件(标题包含
completed
并且 mime 类型对应于 MS Excel)查找带有 Folder.searchFiles 的所需文件并遍历结果FileIterator.hasNext()
在while
循环中。 - 对于每个文件夹,通过
Folder.getFolders()
查找相应的子文件夹,并使用FolderIterator.hasNext()
和while
循环遍历结果。对于这些子文件夹中的每一个,递归调用您的函数。 - 使用 SpreadsheetApp.flush 确保每次使用
setValues
时 sheet 得到更新,这样以前的数据就不会被覆盖。
代码示例:
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
);
}
}