【问题标题】:Is there a way to Archive files and folders to a specific folder in Google Drive and keep folder path?有没有办法将文件和文件夹存档到 Google Drive 中的特定文件夹并保留文件夹路径?
【发布时间】:2019-11-29 01:04:49
【问题描述】:

我正在使用 Google 云端硬盘,我想归档所有与我的计算机同步且超过一定时间的文件。 因此,存档文件将在下次同步时从我的计算机中消失。

我找到了几个脚本来执行文件移动,但移动文件并保持路径结构就像在计算机上本地使用 robocopy/powershell 命令移动一样似乎具有挑战性。

知道 Google Apps 脚本是否可以实现此类功能?

到目前为止,我还没有集成复制/删除功能。我正在检索文件夹路径,我想一定有办法检查目标中是否已经存在路径,如果不存在,创建子文件夹?

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);
  }
}

补充一点,它是一种从搜索中排除存档文件夹的方法吗? :)

【问题讨论】:

  • 您能否澄清一下“保留文件夹路径”是什么意思?它应该保存在哪里?
  • 嗨,我的意思是,如果要移动的文件位于 My Compter/LambdaFolder/AlphaSubFolder/Myfile.pdf 下,我想将此文件存储在 Archive/LambdaFolder/AlphaSubFolder/ 下我的文件.pdf
  • 可以在Folder类的实例上调用getFoldersByName(name)方法来获取所有子文件夹。如果此方法返回的FolderIterator 在调用hasNext() 后返回true,则该文件夹已经存在,如果不存在,则必须创建它(这也意味着整个路径不存在)。您可以对整个路径重复此过程,然后将文件移动到最后一个文件夹并将其从前一个父文件夹中删除。这将允许您在不复制文件的情况下移动文件。这就是你要找的吗?

标签: google-apps-script flysystem-google-drive


【解决方案1】:

您可以使用Advanced Drive Services 和代码中的一个额外函数来实现此目的。

我们将使用Patch command 添加和删除父文件夹。

可选查询参数

addParents string 要添加的父 ID 的逗号分隔列表。

removeParents string 要删除的父 ID 的逗号分隔列表。

代码是这样的:

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()) {
    //...

删除空文件夹

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

【讨论】:

  • 不得不改变://... placeFileInFolders(file, folder); ...// 否则,就像一个魅力! 2 分: - 有没有机会在初始搜索中排除存档文件夹? - 如您所述,不会删除空文件夹。考虑到整个路径,添加此功能会很困难吗?与我分享的好主意! :)
  • @poypoy 您可以使用custom properties,然后使用“and (not(properties has 'archived')”在搜索查询中排除它们。要删除空文件夹,您必须在移动一个文件,检查之前的父文件夹是否为空。
  • 感谢您的意见。我尝试了非属性设置,但在 files.HasNext() 上出现 q 错误。我猜在搜索属性中有一些引号没有正确设置。这是使用它的正确方法吗? var search = '(trashed = true or tramped = false) and (modifiedDate > "' + startTime + '") and (not(properties has "archived"))';
  • 当你想在字符串中使用引号时,记得转义它们。这意味着,把“变成\”。这只需要对内部报价进行。 var search = "(trashed = true or trashed = false) and (modifiedDate &gt; \"" + startTime + "\") and (not(properties has \"archived\"))";
  • 感谢您的洞察力。但是,仍然存在相同的错误。我已经修改了查询,现在,它可以满足我的要求:) var search = "(trashed = true or trashed = false) and (modifiedDate &gt; \"" + startTime + "\") and (not \"root\" in parents)"; Cheers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2023-01-16
相关资源
最近更新 更多