使用 Apps 脚本将文件从一个文件夹复制到另一个文件夹时,被复制的任何“Apps 脚本”文件最终都会出现在 MyDrive 中,而不是指定的文件夹中 - 为啥?

Posted

技术标签:

【中文标题】使用 Apps 脚本将文件从一个文件夹复制到另一个文件夹时,被复制的任何“Apps 脚本”文件最终都会出现在 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 脚本将文件从一个文件夹复制到另一个文件夹时,被复制的任何“Apps 脚本”文件最终都会出现在 MyDrive 中,而不是指定的文件夹中 - 为什么? 【发布时间】:2018-05-10 18:34:10 【问题描述】:

我使用这个 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 脚本”文件,它不会将其复制到备份文件夹,而是将其复制到“我的云端硬盘”。

然后,我必须将其从“我的云端硬盘”移至所需文件夹。我可以用一个脚本来做到这一点,但我不知道为什么它首先会这样做。

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

有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

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

    尝试使用addFile()removeFile() 将复制的GAS 文件从“我的驱动器”移动到备份文件夹。 可以添加备份文件夹的父 ID。但“我的云端硬盘”的父 ID 无法删除。 失败 尝试使用高级 Google 服务的 Drive.Files.copy 复制 GAS 文件。 复制的 GAS 文件被创建到“我的驱动器”。这与makeCopy() 相同。 失败 尝试使用高级 Google 服务的Drive.Files.update 将复制的 GAS 文件从“我的驱动器”移动到备份文件夹。 可以将父 ID 从“我的驱动器”更改为备份文件夹。 成功

修改后的脚本:

在此修改后的脚本中,Google Apps 脚本文件使用Drive.Files.update 从“我的云端硬盘”移动到备份文件夹。

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
  

注意:

为了使用这个修改后的脚本,请在 Advanced Google Services 和 API 控制台中启用 Drive API,如下所示。

在高级 Google 服务中启用 Drive API v2

在脚本编辑器上 资源 -> 高级 Google 服务 开启 Drive API v2

Enable Drive API at API console

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

参考资料:

Advanced Google Services Drive API

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

【讨论】:

嗨。这是一个很好的解决方法。我正在使用遍历所有 MyDrive 文件并使用 .addFile 和 .removeFile 但你的更整洁。我很高兴这不仅仅是我 - 大概是一个错误。 @MrPea 我可以从您的问题中了解这种情况,就像一个错误一样。谢谢。 您对使用此更新方法在团队驱动器文件夹中创建 google docs 文件有任何建议吗?我已经在 API Explorer 中尝试过,但我不明白如何在 Google Apps 脚本中实现语法。

以上是关于使用 Apps 脚本将文件从一个文件夹复制到另一个文件夹时,被复制的任何“Apps 脚本”文件最终都会出现在 MyDrive 中,而不是指定的文件夹中 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Windows 批处理文件或 vbs 脚本一次将多个文件 1 从 2 个文件夹复制到另一个文件夹

Google Apps 脚本 - 将一行数据从一个电子表格移动到另一个电子表格

GCP 存储 - 如何创建一个脚本,将所有文件/文件夹从一个存储桶复制到另一个存储桶,但文件夹结构不同

用于复制整个 Google Drive 文件结构的 Google Apps 脚本;如何避免超时?

使用 Python 从一个文本文件复制到另一个文本文件

按日期将文件从一个目录复制到另一个目录