当使用 Apps 脚本将文件从一个文件夹复制到另一个文件夹时,任何 "Apps Script" 被复制的文件最终都在 MyDrive 而不是指定的文件夹中 - 为什么?

When copying files using Apps Script from one folder to another any "Apps Script" files being copied end up in MyDrive not the specified folder - why?

我使用此 Apps 脚本制作一些文件的备份副本:

var sourceFolderId = "xxxxxx";
var sourceFolder = DriveApp.getFolderById(sourceFolderId);
var latestFiles = sourceFolder.getFiles();
var backupFolderId = "yyyyyy";
var backupFolder = DriveApp.getFolderById(backupFolderId);

while(latestFiles.hasNext()) {
 var file = latestFiles.next();
 file.makeCopy(backupFolder);
}

它工作正常 - 将所有文件从源文件夹复制到备份文件夹 - 除了如果正在复制的任何文件是 "Google Apps script" 文件,它不会将它复制到备份文件夹,而是复制它至 "My Drive".

然后我必须将它从 "My Drive" 移动到所需的文件夹。我可以用脚本来做到这一点,但我无法弄清楚为什么它首先要这样做。

我是所有文件和文件夹的所有者。

知道为什么吗?

谢谢

同样在我的环境中,我确认了与您相同的情况。只有 Google 个 Apps 脚本无法复制到备份文件夹。我认为这可能是一个错误。所以我想到了这种情况的解决方法。我测试的模式如下

  1. 尝试使用 addFile()removeFile() 将复制的 GAS 文件从 "My Drive" 移动到备份文件夹。
    • 可以添加备份文件夹的父ID。但是"My Drive"的父ID无法删除。
      • 失败
  2. 尝试使用高级 Google 服务的 Drive.Files.copy 复制 GAS 文件。
    • 复制的 GAS 文件创建到 "My Drive"。这与 makeCopy() 相同。
      • 失败
  3. 尝试使用高级 Google 服务的 Drive.Files.update 将复制的 GAS 文件从 "My Drive" 移动到备份文件夹。
    • 父 ID 可以从 "My Drive" 更改为备份文件夹。
      • 成功

修改脚本:

在此修改后的脚本中,Google Apps 脚本文件使用 Drive.Files.update 从 "My Drive" 移动到备份文件夹。

var sourceFolderId = "xxxxxx";
var sourceFolder = DriveApp.getFolderById(sourceFolderId);
var latestFiles = sourceFolder.getFiles();
var backupFolderId = "yyyyyy";
var backupFolder = DriveApp.getFolderById(backupFolderId);

while(latestFiles.hasNext()) {
  var file = latestFiles.next();
  var res = file.makeCopy(backupFolder); // Modified
  if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) { // Added
    Drive.Files.update({"parents": [{"id": backupFolderId}]}, res.getId()); // Added
  }
}

注:

为了使用这个修改后的脚本,请在高级 Google 服务和 API 控制台中启用驱动器 API,如下所示。

在高级 Google 服务中启用驱动器 API v2

  • 在脚本编辑器上
    • 资源 -> 高级 Google 服务
    • 打开驱动器 API v2

Enable Drive API at API console

  • 在脚本编辑器上
    • 资源 -> 云平台项目
    • 查看API控制台
    • 在开始时,单击启用 APIs 并获取密钥等凭据。
    • 在左侧,单击“库”。
    • 在搜索 API 和服务时,输入 "Drive"。然后单击驱动器 API。
    • 单击“启用”按钮。
    • 如果API已经启用,请不要关闭。

参考资料:

如果我误解了你的问题,我很抱歉。