python + google 驱动器:上传 xlsx,转换为 google sheet,可共享 link
python + google drive: upload xlsx, convert to google sheet, get sharable link
我想要的程序流程是:
- 上传 xlsx 传播sheet 到驱动器(它是使用 pandas
to_excel
创建的)
- 将其转换为 Google 表格格式
- 指定任何人都可以使用 link
编辑它
- 获取 link 并与将输入信息的人共享
- 下载完成sheet
我目前正在使用 PyDrive,它解决了步骤 1 和 5,但还有一些未解决的问题。
如何转换为 google sheets 格式?当我创建要使用 PyDrive 上传的文件时,我试图将 mimeType 指定为 'application/vnd.google-apps.spreadsheet'
,但这给了我一个错误。
如何将文件设置为任何拥有 link 权限的人都可以编辑?设置完成后,我可以使用 PyDrive 轻松获得共享 link。
更新:使用 convert=True
标志从 xlsx 到 google sheets 的转换很容易。见下文。我仍在寻找一种方法来将我的新文件的共享设置设置为 "anyone with the link can edit"。
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
test_file = drive.CreateFile({'title': 'testfile.xlsx'})
test_file.SetContentFile('testfile.xlsx')
test_file.Upload({'convert': True})
对于 "INSERT" 和 "COPY" 方法,有一个可选查询参数 "convert";
convert=true,
Whether to convert this file to the corresponding Google Docs format. (Default: false)
这里有一个python例子:
您需要使用 Python 客户端库才能使代码正常工作。
from apiclient import errors
from apiclient.http import MediaFileUpload
# ...
def insert_file(service, title, description, parent_id, mime_type, filename):
"""Insert new file.
Args:
service: Drive API service instance.
title: Title of the file to insert, including the extension.
description: Description of the file to insert.
parent_id: Parent folder's ID.
mime_type: MIME type of the file to insert.
filename: Filename of the file to insert.
Returns:
Inserted file metadata if successful, None otherwise.
"""
media_body = MediaFileUpload(filename, mimetype=mime_type, resumable=True)
body = {
'title': title,
'description': description,
'mimeType': mime_type
}
# Set the parent folder.
if parent_id:
body['parents'] = [{'id': parent_id}]
try:
file = service.files().insert(
body=body,
convert=true,
media_body=media_body).execute()
# Uncomment the following line to print the File ID
# print 'File ID: %s' % file['id']
return file
except errors.HttpError, error:
print 'An error occured: %s' % error
return None
我还没有尝试过,所以你需要测试一下。
为了将文件设置为对 link 的任何人都可编辑,您必须使用以下信息插入新权限:
from apiclient import errors
# ...
def share_with_anyone(service, file_id):
"""Shares the file with anyone with the link
Args:
service: Drive API service instance.
file_id: ID of the file to insert permission for.
Returns:
The inserted permission if successful, None otherwise.
"""
new_permission = {
'type': "anyone",
'role': "writer",
'withLink': True
}
try:
return service.permissions().insert(
fileId=file_id, body=new_permission).execute()
except errors.HttpError, error:
print 'An error occurred: %s' % error
return None
然后要获取 link 你去:文件["alternateLink"]
我想要的程序流程是:
- 上传 xlsx 传播sheet 到驱动器(它是使用 pandas
to_excel
创建的) - 将其转换为 Google 表格格式
- 指定任何人都可以使用 link 编辑它
- 获取 link 并与将输入信息的人共享
- 下载完成sheet
我目前正在使用 PyDrive,它解决了步骤 1 和 5,但还有一些未解决的问题。
如何转换为 google sheets 格式?当我创建要使用 PyDrive 上传的文件时,我试图将 mimeType 指定为 'application/vnd.google-apps.spreadsheet'
,但这给了我一个错误。
如何将文件设置为任何拥有 link 权限的人都可以编辑?设置完成后,我可以使用 PyDrive 轻松获得共享 link。
更新:使用 convert=True
标志从 xlsx 到 google sheets 的转换很容易。见下文。我仍在寻找一种方法来将我的新文件的共享设置设置为 "anyone with the link can edit"。
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
test_file = drive.CreateFile({'title': 'testfile.xlsx'})
test_file.SetContentFile('testfile.xlsx')
test_file.Upload({'convert': True})
对于 "INSERT" 和 "COPY" 方法,有一个可选查询参数 "convert";
convert=true,
Whether to convert this file to the corresponding Google Docs format. (Default: false)
这里有一个python例子:
您需要使用 Python 客户端库才能使代码正常工作。
from apiclient import errors
from apiclient.http import MediaFileUpload
# ...
def insert_file(service, title, description, parent_id, mime_type, filename):
"""Insert new file.
Args:
service: Drive API service instance.
title: Title of the file to insert, including the extension.
description: Description of the file to insert.
parent_id: Parent folder's ID.
mime_type: MIME type of the file to insert.
filename: Filename of the file to insert.
Returns:
Inserted file metadata if successful, None otherwise.
"""
media_body = MediaFileUpload(filename, mimetype=mime_type, resumable=True)
body = {
'title': title,
'description': description,
'mimeType': mime_type
}
# Set the parent folder.
if parent_id:
body['parents'] = [{'id': parent_id}]
try:
file = service.files().insert(
body=body,
convert=true,
media_body=media_body).execute()
# Uncomment the following line to print the File ID
# print 'File ID: %s' % file['id']
return file
except errors.HttpError, error:
print 'An error occured: %s' % error
return None
我还没有尝试过,所以你需要测试一下。
为了将文件设置为对 link 的任何人都可编辑,您必须使用以下信息插入新权限:
from apiclient import errors
# ...
def share_with_anyone(service, file_id):
"""Shares the file with anyone with the link
Args:
service: Drive API service instance.
file_id: ID of the file to insert permission for.
Returns:
The inserted permission if successful, None otherwise.
"""
new_permission = {
'type': "anyone",
'role': "writer",
'withLink': True
}
try:
return service.permissions().insert(
fileId=file_id, body=new_permission).execute()
except errors.HttpError, error:
print 'An error occurred: %s' % error
return None
然后要获取 link 你去:文件["alternateLink"]