当使用 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 脚本无法复制到备份文件夹。我认为这可能是一个错误。所以我想到了这种情况的解决方法。我测试的模式如下
- 尝试使用
addFile()
和 removeFile()
将复制的 GAS 文件从 "My Drive" 移动到备份文件夹。
- 可以添加备份文件夹的父ID。但是"My Drive"的父ID无法删除。
- 失败
- 尝试使用高级 Google 服务的
Drive.Files.copy
复制 GAS 文件。
- 复制的 GAS 文件创建到 "My Drive"。这与
makeCopy()
相同。
- 失败
- 尝试使用高级 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已经启用,请不要关闭。
参考资料:
如果我误解了你的问题,我很抱歉。
我使用此 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 脚本无法复制到备份文件夹。我认为这可能是一个错误。所以我想到了这种情况的解决方法。我测试的模式如下
- 尝试使用
addFile()
和removeFile()
将复制的 GAS 文件从 "My Drive" 移动到备份文件夹。- 可以添加备份文件夹的父ID。但是"My Drive"的父ID无法删除。
- 失败
- 可以添加备份文件夹的父ID。但是"My Drive"的父ID无法删除。
- 尝试使用高级 Google 服务的
Drive.Files.copy
复制 GAS 文件。- 复制的 GAS 文件创建到 "My Drive"。这与
makeCopy()
相同。- 失败
- 复制的 GAS 文件创建到 "My Drive"。这与
- 尝试使用高级 Google 服务的
Drive.Files.update
将复制的 GAS 文件从 "My Drive" 移动到备份文件夹。- 父 ID 可以从 "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已经启用,请不要关闭。
参考资料:
如果我误解了你的问题,我很抱歉。