Google apps script 删除团队驱动器中的空文件夹
在迁移到Team Drive的过程中,我们有一个文件夹被迁移了两次。第一次被中断,我们现在有数千个重复的文件夹,其中没有任何内容。我想删除或至少删除特定团队驱动器上完全为空的任何文件夹。我在下面找到了一个我试图修改的旧脚本:Google apps script 删除团队驱动器中的空文件夹,google-apps-script,google-drive-api,google-drive-shared-drive,Google Apps Script,Google Drive Api,Google Drive Shared Drive,在迁移到Team Drive的过程中,我们有一个文件夹被迁移了两次。第一次被中断,我们现在有数千个重复的文件夹,其中没有任何内容。我想删除或至少删除特定团队驱动器上完全为空的任何文件夹。我在下面找到了一个我试图修改的旧脚本: function delEmptyFolders() { var folders = DriveApp.getFolders(); var ss = SpreadsheetApp.create("folderslist"); while (folders.has
function delEmptyFolders() {
var folders = DriveApp.getFolders();
var ss = SpreadsheetApp.create("folderslist");
while (folders.hasNext()) {
var folder = folders.next();
var files = folder.getFiles();
var childfolders = folder.getFolders();
var filecount = 0;
var foldercount = 0;
while (childfolders.hasNext()){
var childfolder = childfolders.next();
foldercount ++;
}
while (files.hasNext()){
var file = files.next();
filecount ++;
}
ss.appendRow([folder.getId(),folder.getName(),filecount, foldercount]);
if (filecount == 0 && foldercount == 0){
folder.setTrashed(true);
}
}
}
我的问题是如何让这个脚本在特定的团队驱动器上运行,或者更好的是,在团队驱动器上的特定文件夹中运行
评论中回答的原始问题-下面的新脚本-评论中的后续问题
提前感谢您的帮助和我的道歉,因为我没有很好的编码或脚本经验
function starEmptyFolders() {
var folders = DriveApp.getFolderById('ID').getFolders();
var ss = SpreadsheetApp.create("test");
while (folders.hasNext()) {
var folder = folders.next();
var files = folder.getFiles();
var childfolders = folder.getFolders();
var filecount = 0;
var foldercount = 0;
while (childfolders.hasNext()){
var childfolder = childfolders.next();
foldercount ++;
}
while (files.hasNext()){
var file = files.next();
filecount ++;
}
////////////////////
var child = childfolders;
var subFolders = child.getFolders();
while(subFolders.hasNext()) {
var subFolder = subFolders.next();
var subfoldercount = 0;
subfoldercount ++}
///////////////////////////
}
ss.appendRow([folder.getId(),folder.getName(),filecount, foldercount, subfoldercount,]);
if (filecount == 0 && foldercount == 0){
folder.setStarred(true);
这是一个修改过的函数,它将递归删除空文件夹并将它们记录到电子表格中
function deleteEmptyFolders() {
var parentFolder = DriveApp.getFolderById('<folder ID goes here>');
var folders = parentFolder.getFolders();
var ss = SpreadsheetApp.create("ScriptDeletes");
while (folders.hasNext()) {
var childfolder = folders.next();
recurseFolder(parentFolder, childfolder, ss);
}
}
function recurseFolder(parentFolder, folder, ss) {
var filecount = 0;
var foldercount = 0;
var files = folder.getFiles(); // get the list of files in the root of that folder
var childfolders = folder.getFolders(); // get the list of sub folders in the root of that folder
while (childfolders.hasNext()) { // count the sub folders
var childfolder = childfolders.next();
recurseFolder(folder, childfolder, ss);
foldercount++;
}
while (files.hasNext()) { // count the files in the root of the folder
var file = files.next();
filecount++;
}
if (filecount == 0 && foldercount == 0) {
parentFolder.removeFolder(folder);
ss.appendRow([folder.getId(),folder.getName(),filecount, foldercount]);
}
}
函数deleteEmptyFolders(){
var parentFolder=DriveApp.getFolderById(“”);
var folders=parentFolder.getFolders();
var ss=SpreadsheetApp.create(“脚本删除”);
while(folders.hasNext()){
var childfolder=folders.next();
递归文件夹(parentFolder、childfolder、ss);
}
}
函数recurseFolder(父文件夹、文件夹、ss){
var filecount=0;
var foldercount=0;
var files=folder.getFiles();//获取该文件夹根目录中的文件列表
var childfolders=folder.getFolders();//获取该文件夹根目录中的子文件夹列表
while(childfolders.hasNext()){//count子文件夹
var childfolder=childfolders.next();
递归文件夹(文件夹,子文件夹,ss);
foldercount++;
}
while(files.hasNext()){//计算文件夹根目录中的文件
var file=files.next();
filecount++;
}
如果(filecount==0&&foldercount==0){
parentFolder.removeFolder(文件夹);
appendRow([folder.getId(),folder.getName(),filecount,foldercount]);
}
}
我对@Brett的答案做了一点修改,因为它以自顶向下的顺序而不是自下而上的顺序遍历目录树。我有很多嵌套的空子目录,希望将它们全部删除,因此最好在递归之后(重新)检查filecount/foldercount,以便考虑更深层次的删除。我还通过不关心filecount或foldercount(只要存在文件或不存在文件)加快了速度
另外,如果您想删除文件夹,我认为最好使用.setTrashed
将其删除,而不是.removeFolder
将其移动到一个隐藏的顶级目录
function deleteEmptyFolders() {
var parentFolder = DriveApp.getFolderById('FOLDER_ID');
var folders = parentFolder.getFolders();
var ss = SpreadsheetApp.openById("SPREADSHEET_ID")
while (folders.hasNext()) {
var childfolder = folders.next();
recurseFolder(parentFolder, childfolder, ss);
}
}
function recurseFolder(parentFolder, folder, ss) {
var childfolders = folder.getFolders(); // get the list of sub folders in the root of that folder
while (childfolders.hasNext()) { // count the sub folders
var childfolder = childfolders.next();
recurseFolder(folder, childfolder, ss);
}
var hasFile = folder.getFiles().hasNext(); // get the list of files in the root of that folder
var hasFolder = folder.getFolders().hasNext(); // get the list of files in the root of that folder
if (!hasFile && !hasFolder) {
folder.setTrashed(true)
ss.appendRow([folder.getId(),folder.getName()]);
}
}
看我的。这可能对你有帮助。非常感谢!在您的帮助下,我可以为那些可能正在搜索相同内容的人编写上述脚本(在原始帖子的底部,注释中没有字符):我的后续问题(不确定是否应该创建新主题)是,在我的///////标记之间,我试图使脚本获得子文件夹(第二级),但是它一直告诉我:TypeError:在对象FolderIterator中找不到函数getFolders。有没有更好的方法让它在电子表格中列出子文件夹?