如何通过 Python 复制 Google 驱动器中的文件?

How can I make a copy of a file in Google Drive via Python?

我在 Google Apps 脚本中编写了一个简短的函数,可以复制存储在 Google 驱动器上的特定文件。它的目的是这个文件是一个模板,每次我想为工作创建一个新文档时,我都会复制这个模板并只更改文档的标题。我编写的复制文件并将其存储在我想要的特定文件夹中的代码非常简单:

function copyFile() {
  var file = DriveApp.getFileById("############################################");
  var folder = DriveApp.getFolderById("############################");
  var filename = "Copy of Template";
  file.makeCopy(filename, folder);
}

此函数根据 ID 获取特定文件,并根据 ID 获取特定文件夹,并将副本授权 "Copy of Template" 放入该文件夹。

我找遍了,似乎找不到这个。有没有办法做完全相同的事情,但使用 Python 代替?或者,至少有没有办法让 Python 以某种方式将该函数调用到 运行 这个函数?我需要在 Python 中完成这项工作,因为我正在编写一个脚本,每当我开始一个新的工作项目时,它都会同时执行许多功能,例如从 Google Drive 中的模板创建一个新文档与 Google 驱动器完全无关的其他事情,因此无法在 Google Apps 脚本中完成。

来自https://developers.google.com/drive/v2/reference/files/copy

from apiclient import errors
# ...

def copy_file(service, origin_file_id, copy_title):
  """Copy an existing file.

  Args:
    service: Drive API service instance.
    origin_file_id: ID of the origin file to copy.
    copy_title: Title of the copy.

  Returns:
    The copied file if successful, None otherwise.
  """
  copied_file = {'title': copy_title}
  try:
    return service.files().copy(
        fileId=origin_file_id, body=copied_file).execute()
  except errors.HttpError, error:
    print 'An error occurred: %s' % error
  return None

网络上有一些教程给出了部分答案。这是您需要执行的操作的分步指南。

  1. 打开命令提示符并键入(不带引号)"pip install PyDrive"
  2. 按照此处的说明第一步 - https://developers.google.com/drive/v3/web/quickstart/python 设置帐户
  3. 完成后,单击“下载”JSON,将下载一个文件。确保将其重命名为 client_secrets.json,而不是快速入门所说的 client_secret.json。
  4. 接下来,确保将该文件放在与 python 脚本相同的目录中。如果您 运行 从控制台运行脚本,该目录可能是您的用户名目录。
  5. 我假设您已经知道要放置此文件的文件夹 ID 和要复制的文件 ID。如果您不知道,可以使用 python 找到它,或者您可以在文档中打开它,它会在文件的 URL 中。基本上输入文件夹的 ID 和文件的 ID,当您 运行 这个脚本时,它会复制所选文件并将其放在所选文件夹中。
  6. 需要注意的一件事是,当 运行ning 时,您的浏览器 window 将打开并请求许可,只需单击接受,然后脚本将完成。
  7. 为了使其正常工作,您可能必须启用 Google 驱动器 API,它位于 API 部分。

Python 脚本:

## Create a new Document in Google Drive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
folder = "########"
title = "Copy of my other file"
file = "############"
drive.auth.service.files().copy(fileId=file,
                           body={"parents": [{"kind": "drive#fileLink",
                                 "id": folder}], 'title': title}).execute()

与 API v3:

将文件复制到不同名称的目录。

service.files().copy(fileId='PutFileIDHere', body={"parents": ['ParentFolderID'], 'name': 'NewFileName'} ).execute()

对我来说,@Rashi 的回答稍作修改即可。

而不是:

'name': 'NewFileName'

这有效:

'title': 'NewFileName'