有没有办法将文件和文件夹存档到 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()) {
    //...

删除空文件夹

此脚本不会删除已将所有内容移至存档的文件夹。