有没有办法将文件和文件夹存档到 Google 驱动器中的特定文件夹并保留文件夹路径?
Is there a way to Archive files and folders to a specific folder in Google Drive and keep folder path?
我正在使用 Google Drive,我想存档所有与我的计算机同步的超过一定时间的文件。
因此,存档文件将在下次同步时从我的计算机上消失。
我找到了几个执行文件移动的脚本,但似乎很难移动文件并保持路径结构,就好像它是在计算机本地使用 robocopy/powershell 命令移动的一样。
知道 Google Apps 脚本是否可以实现这样的功能吗?
到目前为止,我还没有集成copy/remove功能。我正在检索文件夹路径,我想一定有一种方法可以检查路径是否已存在于目标中,如果不存在,请创建子文件夹?
function FilesModifiedLastWeek(){
// Find files modified last week
var today = new Date();
var oneDayAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
var startTime = oneDayAgo.toISOString();
// The magic search expression
var search = '(trashed = true or trashed = false) and (modifiedDate > "' + startTime + '")';
var files = DriveApp.searchFiles(search);
// Loop through all the files in the search results
while( files.hasNext() ) {
var file = files.next();
var fileName = file.getName();
var parentFolder = file.getParents();
folders = [];
//Get full path
while (parentFolder.hasNext()) {
parentFolder = parentFolder.next();
var title = parentFolder.getName();
folders.push(parentFolder.getName());
parentFolder = parentFolder.getParents();
}
var fileURL = file.getUrl();
var dateCreated = Utilities.formatDate(file.getDateCreated(), "Europe/Zurich", "yyyy-MM-dd HH:mm");
Logger.log("Filename: " + fileName + " Folder path: " + folders.reverse().join("/") + " File creation date:" + dateCreated);
}
}
补充一点,是否有一种方法可以将存档文件夹排除在搜索范围之外? :)
您可以使用 Advanced Drive Services 和代码中的一个额外函数来实现这一点。
我们将使用 Patch command 添加和删除父文件夹。
Optional query parameters
addParents string A comma-separated list of parent IDs to add.
removeParents string A comma-separated list of parent IDs to remove.
代码是这样的:
function placeFileInFolders(file, folders) {
var archiveFolder = DriveApp.getFoldersByName("Archive Folder").next();
var lastFolder = archiveFolder;
for (var i=0; i<folders.length; i++) {
if (lastFolder.getFoldersByName(folders[i]).hasNext()) {
lastFolder = lastFolder.getFoldersByName(folders[i]).next();
} else {
lastFolder = lastFolder.createFolder(folders[i]);
}
}
var newFile = Drive.Files.patch({}, file.getId(), {
addParents: lastFolder.getId(),
removeParents: file.getParents().next().getId()
});
}
你可以这样使用它:
//...
Logger.log("Filename: " + fileName + " Folder path: " + folders.reverse().join("/") + " File creation date:" + dateCreated);
placeFileInFolders(file, folders.reverse());
//...
改进
与我共享
我还添加了一种额外的情况,您的代码将能够处理“与我共享”的文件。
//...
if (!parentFolder.hasNext()) {
folders.push("Shared With Me");
}
while (parentFolder.hasNext()) {
//...
删除空文件夹
此脚本不会删除已将所有内容移至存档的文件夹。
我正在使用 Google Drive,我想存档所有与我的计算机同步的超过一定时间的文件。 因此,存档文件将在下次同步时从我的计算机上消失。
我找到了几个执行文件移动的脚本,但似乎很难移动文件并保持路径结构,就好像它是在计算机本地使用 robocopy/powershell 命令移动的一样。
知道 Google Apps 脚本是否可以实现这样的功能吗?
到目前为止,我还没有集成copy/remove功能。我正在检索文件夹路径,我想一定有一种方法可以检查路径是否已存在于目标中,如果不存在,请创建子文件夹?
function FilesModifiedLastWeek(){
// Find files modified last week
var today = new Date();
var oneDayAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
var startTime = oneDayAgo.toISOString();
// The magic search expression
var search = '(trashed = true or trashed = false) and (modifiedDate > "' + startTime + '")';
var files = DriveApp.searchFiles(search);
// Loop through all the files in the search results
while( files.hasNext() ) {
var file = files.next();
var fileName = file.getName();
var parentFolder = file.getParents();
folders = [];
//Get full path
while (parentFolder.hasNext()) {
parentFolder = parentFolder.next();
var title = parentFolder.getName();
folders.push(parentFolder.getName());
parentFolder = parentFolder.getParents();
}
var fileURL = file.getUrl();
var dateCreated = Utilities.formatDate(file.getDateCreated(), "Europe/Zurich", "yyyy-MM-dd HH:mm");
Logger.log("Filename: " + fileName + " Folder path: " + folders.reverse().join("/") + " File creation date:" + dateCreated);
}
}
补充一点,是否有一种方法可以将存档文件夹排除在搜索范围之外? :)
您可以使用 Advanced Drive Services 和代码中的一个额外函数来实现这一点。
我们将使用 Patch command 添加和删除父文件夹。
Optional query parameters
addParents string A comma-separated list of parent IDs to add.
removeParents string A comma-separated list of parent IDs to remove.
代码是这样的:
function placeFileInFolders(file, folders) {
var archiveFolder = DriveApp.getFoldersByName("Archive Folder").next();
var lastFolder = archiveFolder;
for (var i=0; i<folders.length; i++) {
if (lastFolder.getFoldersByName(folders[i]).hasNext()) {
lastFolder = lastFolder.getFoldersByName(folders[i]).next();
} else {
lastFolder = lastFolder.createFolder(folders[i]);
}
}
var newFile = Drive.Files.patch({}, file.getId(), {
addParents: lastFolder.getId(),
removeParents: file.getParents().next().getId()
});
}
你可以这样使用它:
//...
Logger.log("Filename: " + fileName + " Folder path: " + folders.reverse().join("/") + " File creation date:" + dateCreated);
placeFileInFolders(file, folders.reverse());
//...
改进
与我共享
我还添加了一种额外的情况,您的代码将能够处理“与我共享”的文件。
//...
if (!parentFolder.hasNext()) {
folders.push("Shared With Me");
}
while (parentFolder.hasNext()) {
//...
删除空文件夹
此脚本不会删除已将所有内容移至存档的文件夹。