python - Excel 文件未显示在 Google 云端硬盘中
问题描述
我正在尝试使用 Python 中的 API 从 CSV 创建一个新的 Google Sheets 电子表格,并且我的代码运行,但创建的 Sheet 没有出现在我的 Google Drive 中的任何地方。知道我做错了什么吗?
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
#Set up a credentials object I think
creds =
ServiceAccountCredentials.from_json_keyfile_name('client_secret.json',
['https://www.googleapis.com/auth/drive'])
#Now build our api object, thing
drive_api = build('drive', 'v3', credentials=creds)
folder_id = "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"
file_name = "1505"
mimeType = "application/vnd.google-apps.spreadsheet"
print("Uploading file " + file_name + "...")
file_metadata = {
'name': file_name,
'mimeType': mimeType
}
#We have to make a request hash to tell the google API what we're giving it
body = {'name': file_name, 'mimeType': mimeType}
body['parents'] = [{'id':folder_id}]
#Now create the media file upload object and tell it what file to upload,
#in this case 'test.html'
media = MediaFileUpload('1505.csv', mimetype = 'text/csv')
#Now we're doing the actual post, creating a new file of the uploaded type
fiahl = drive_api.files().create(body=body, media_body=media).execute()
#Because verbosity is nice
print("Created file '%s' id '%s'." % (fiahl.get('name'), fiahl.get('id')))
解决方案
这个答案怎么样?
问题:
我认为你的脚本有效。但是从您的脚本来看,如果您在运行脚本时没有发生错误并且client_secret.json
是创建服务帐户时的文件,我认为您正在尝试使用服务帐户上传文件。服务帐户不是您的帐户。因此,当您使用服务帐户将文件上传到 Google Drive 时,该文件将创建到服务帐户的 Drive。这样,您的 Google Drive 上就无法看到上传的文件。
解决方案
如果您想在 Google 云端硬盘中使用服务帐户查看上传的文件,请与您的帐户共享文件。这样,当使用服务帐户上传文件时,您可以看到上传的文件
修改点:
- 您使用 Drive API v3。所以请修改
body['parents'] = [{'id':folder_id}]
为body['parents'] = [folder_id]
. - 如果文件夹 ID
folder_id = "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"
在您的 Google Drive 上,请将其修改为 Service Account 上的文件夹 ID。作为测试用例,我用作root
文件夹 ID。 - 文件由服务帐户上传后,所有者将更改为您的帐户。这样,您可以在 Google Drive 的根目录中看到上传的文件。
修改后的脚本:
在运行脚本之前,请将您的 Google 帐户的电子邮件地址设置为'emailAddress': '### Email address of your Google account ###'
.
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
# Set up a credentials object I think
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', ['https://www.googleapis.com/auth/drive'])
# Now build our api object, thing
drive_api = build('drive', 'v3', credentials=creds)
folder_id = "root" # Modified from "1g3q1OelKXDJF8H_Kc0IpgFSxz77NQobc"
file_name = "1505"
mimeType = "application/vnd.google-apps.spreadsheet"
print("Uploading file " + file_name + "...")
file_metadata = {
'name': file_name,
'mimeType': mimeType
}
# We have to make a request hash to tell the google API what we're giving it
body = {'name': file_name, 'mimeType': mimeType}
body['parents'] = [folder_id] # Modified
# Now create the media file upload object and tell it what file to upload,
# in this case 'test.html'
media = MediaFileUpload('1505.csv', mimetype='text/csv')
# Now we're doing the actual post, creating a new file of the uploaded type
fiahl = drive_api.files().create(body=body, media_body=media).execute()
# Because verbosity is nice
print("Created file '%s' id '%s'." % (fiahl.get('name'), fiahl.get('id')))
# I added below script.
user_permission = {
'type': 'user',
'role': 'owner',
'emailAddress': '### Email address of your Google account ###'
}
drive_api.permissions().create(
fileId=fiahl.get('id'),
body=user_permission,
transferOwnership=True,
).execute()
笔记:
- 在这种情况下,您不能将文件放到您的 Google 帐户的特定文件夹中。因为使用了服务帐户。
- 如果您想直接将文件上传到您的 Google Drive 上的特定文件夹,请使用 OAuth2 而不是服务帐户。
- 这是一个简单的修改脚本。因此,请根据您的情况进行修改。
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
推荐阅读
- python - 在 Python 中加权调查变量?
- python - 基于连接键的重复数据框行
- php - PHP 会话仅在 GET 存在时才有效
- rust - 是否可以表示一些对类型的简单包装的引用,就好像它是该类型的包装拥有值一样?
- c# - 如何从单个位(表示 value1)和 23 位(表示 value2)组成 uint 值?
- python - on_message() 事件仅通过存储时间每 x 分钟做出反应
- excel - Vlookup 行列,软码 col_index_num
- parallel-processing - Julia 中的多线程问题
- node.js - typeorm 将 EntitySchema 转换为 Entity
- java - 无法执行 Maven 目标 chekstyle/pmd:检查