【发布时间】:2022-10-07 05:53:11
【问题描述】:
我发现一个脚本可以完美地适用于我的驱动器,我想适应它也支持共享驱动器。
function onOpen() {
var SS = SpreadsheetApp.getActiveSpreadsheet();
var ui = SpreadsheetApp.getUi();
ui.createMenu(\'List Files/Folders\')
.addItem(\'List All Files and Folders\', \'listFilesAndFolders\')
.addToUi();
};
function listFilesAndFolders(){
var folderId = Browser.inputBox(\'Enter folder ID\', Browser.Buttons.OK_CANCEL);
if (folderId === \"\") {
Browser.msgBox(\'Folder ID is invalid\');
return;
}
getFolderTree(folderId, true);
};
// Get Folder Tree
function getFolderTree(folderId, listAll) {
try {
// Get folder by id
var parentFolder = DriveApp.getFolderById(folderId);
// Initialise the sheet
var file, data, sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.appendRow([\"Full Path\", \"Name\",\"Type\" ,\"Date\", \"URL\", \"Last Updated\", \"Description\", \"Size\",\"Owner Email\"]);
// Get files and folders
getChildFolders(parentFolder.getName(), parentFolder, data, sheet, listAll);
} catch (e) {
Logger.log(e.toString());
}
};
// Get the list of files and folders and their metadata in recursive mode
function getChildFolders(parentName, parent, data, sheet, listAll) {
var childFolders = parent.getFolders();
// List folders inside the folder
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
var folderId = childFolder.getId();
data = [
parentName + \"/\" + childFolder.getName(),
childFolder.getName(),
\"Folder\",
childFolder.getDateCreated(),
childFolder.getUrl(),
childFolder.getLastUpdated(),
childFolder.getDescription(),
childFolder.getSize()/1024,
childFolder.getOwner().getEmail()
];
// Write
sheet.appendRow(data);
// List files inside the folder
var files = childFolder.getFiles();
while (listAll & files.hasNext()) {
var childFile = files.next();
data = [
parentName + \"/\" + childFolder.getName() + \"/\" + childFile.getName(),
childFile.getName(),
\"Files\",
childFile.getDateCreated(),
childFile.getUrl(),
childFile.getLastUpdated(),
childFile.getDescription(),
childFile.getSize()/1024,
childFile.getOwner().getEmail(),
];
// Write
sheet.appendRow(data);
}
// Recursive call of the subfolder
getChildFolders(parentName + \"/\" + childFolder.getName(), childFolder, data, sheet, listAll);
}
};
老实说,我仍然不完全了解如何
{supportsAllDrives: true}
有效,但我会假设它正是缺少的。
我一直在尝试获取有关它的更多信息,但我发现的内容对我来说并不完全有用,也不是关于如何使用它的完整说明。
我对 Apps 脚本非常陌生,但我正在尽我所能制作完全可操作的代码或至少理解它,所以如果有人能将我链接到任何关于它的好页面,我将不胜感激。
-
您是否尝试过建议的解决方案?
-
是的,我实际上已经回复了 Tanaike,但评论不知何故被删除了。除了所有者电子邮件之外,他的答案有效,并且由于路径的编码方式,子文件夹中的子文件夹路径存在问题。通用代码很好,但是速度很慢,以至于对于超过 800 个文件都无法使用,尤其是如果将这些文件放在子文件夹中,因为它如何循环遍历文件夹和 appendRow。我做了一些相当大的改变,以摆脱未使用的代码并使其更快。我会发布结果,甚至可能看看是否有人有任何建议。
-
出色地。接受正确答案很重要。这样每个人都会看到问题是如何解决的(甚至是部分解决的)。至于其余的,如果有解决方法,直接询问@Tanaike 是有意义的。 (如果您在评论中的昵称前添加
@,它会将评论发送给提及的成员)
标签: google-apps-script google-sheets google-drive-shared-drive