如何更改 Google 表格电子表格的所有者?
How can I change the owner of a Google Sheets spreadsheet?
使用以下代码,我可以在 Google sheet 秒内以编程方式创建价差 sheet,但 sheet 的所有者是开发者帐户(一个疯狂的以 "gserviceaccount.com" 结尾的字符串),我的普通账户无法查看点差 sheet。我还需要做什么才能将 Google 用户添加到 read/write 权限?
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient import discovery
# ... json_key is the json blob that has the credentials
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_dict(json_key, scope)
service = discovery.build('sheets', 'v4', credentials=credentials)
spreadsheet = {
"properties": {"title": "my test spreadsheet"}
}
service.spreadsheets().create(body=spreadsheet).execute()
编辑:
我尝试将范围更改为 ['https://www.googleapis.com/auth/drive']
但下面的答案仍然对我不起作用。当我运行
print [xx for xx in dir(service) if not xx.startswith('_')]
我明白了
['new_batch_http_request', u'spreadsheets']
换句话说,permissions()
不是 service
中的方法,因为我已经定义了服务。我应该怎么做?
尝试使用方法Permissions: insert from the documentation。您将能够为文件或团队云端硬盘插入权限。
这是文档中提供的sample code:
from apiclient import errors
# ...
def insert_permission(service, file_id, value, perm_type, role):
"""Insert a new permission.
Args:
service: Drive API service instance.
file_id: ID of the file to insert permission for.
value: User or group e-mail address, domain name or None for 'default'
type.
perm_type: The value 'user', 'group', 'domain' or 'default'.
role: The value 'owner', 'writer' or 'reader'.
Returns:
The inserted permission if successful, None otherwise.
"""
new_permission = {
'value': value,
'type': perm_type,
'role': role
}
try:
return service.permissions().insert(
fileId=file_id, body=new_permission).execute()
except errors.HttpError, error:
print 'An error occurred: %s' % error
return None
使用 Try it now 测试实时数据并查看 API 请求和响应。
如需进一步阅读,请查看此 。
服务只是 discovery.build 调用结果的通用名称。在这种情况下,没有 'permissions' 方法只是因为它在同一服务上不可用。如果不需要更改所有者,则以下代码应该足够了。要添加具有读写权限的人,以下对我有用:
def grant_permissions(spreadsheet_id, writer):
drive_service = discovery.build('drive', 'v3')
permission = drive_service.permissions().create(
fileId=spreadsheet_id,
body={
'type': 'user',
'role': 'writer',
'emailAddress': writer,
}
).execute()
drive_service.files().update(
fileId=spreadsheet_id,
body={'permissionIds': [permission['id']]}
).execute()
要真正更改所有者,必须设置转让所有权标志:
def change_owner(spreadsheet_id, writer):
drive_service = discovery.build('drive', 'v3')
permission = drive_service.permissions().create(
fileId=spreadsheet_id,
transferOwnership=True,
body={
'type': 'user',
'role': 'owner',
'emailAddress': writer,
}
).execute()
drive_service.files().update(
fileId=spreadsheet_id,
body={'permissionIds': [permission['id']]}
).execute()
正在使用的服务帐户必须具有正确的权限。我相信对我有用的是在第一次创建服务帐户时选中 g 套件框。
我是通过阅读 Chris 留下的评论才知道的。他的评论中所缺少的只是你实际上需要在他的 drive_service
中使用特定的范围。请注意我用来构建不同对象的范围的变化:
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.discovery import build
key = '/path/to/service_account.json'
# Build 'Spreadsheet' object
spreadsheets_scope = [ 'https://www.googleapis.com/auth/spreadsheets' ]
sheets_credentials = ServiceAccountCredentials.from_json_keyfile_name(key, spreadsheets_scope)
sheets_service = build('sheets', 'v4', credentials=sheets_credentials)
# returns 'Spreadsheet' dict
# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#resource-spreadsheet
spreadsheet = sheets_service.spreadsheets().create(
body={
"properties": {
'title': 'spreadsheets test',
},
"sheets": [],
}
).execute()
# id for the created file
spreadsheetId = spreadsheet['spreadsheetId']
# url of your file
spreadsheetUrl = spreadsheet['spreadsheetUrl']
# Build 'Permissions' object
drive_scope = [ 'https://www.googleapis.com/auth/drive' ]
drive_credentials = ServiceAccountCredentials.from_json_keyfile_name(key, drive_scope)
drive_service = build('drive', 'v3', credentials=drive_credentials)
# returns 'Permissions' dict
permissions = drive_service.permissions().create(
fileId=spreadsheetId,
transferOwnership=True,
body={
'type': 'user',
'role': 'owner',
'emailAddress': 'example@email.com',
}
).execute()
# apply permission
drive_service.files().update(
fileId=spreadsheetId,
body={'permissionIds': [permissions['id']]}
).execute()
print ('\nOpen me:\n\n%s\n' % spreadsheetUrl)
所以逻辑是,'Spreadsheet Resource' 由 build
及其所有属性和 sheet 数据组成,所有者设置为 您的服务帐户。接下来,制作一个'Drive Resource',这是带有permissions()
方法的Resource。 execute()
returns 新创建的权限 id 用于 update()
传播 sheet 文件。
使用以下代码,我可以在 Google sheet 秒内以编程方式创建价差 sheet,但 sheet 的所有者是开发者帐户(一个疯狂的以 "gserviceaccount.com" 结尾的字符串),我的普通账户无法查看点差 sheet。我还需要做什么才能将 Google 用户添加到 read/write 权限?
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient import discovery
# ... json_key is the json blob that has the credentials
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_dict(json_key, scope)
service = discovery.build('sheets', 'v4', credentials=credentials)
spreadsheet = {
"properties": {"title": "my test spreadsheet"}
}
service.spreadsheets().create(body=spreadsheet).execute()
编辑:
我尝试将范围更改为 ['https://www.googleapis.com/auth/drive']
但下面的答案仍然对我不起作用。当我运行
print [xx for xx in dir(service) if not xx.startswith('_')]
我明白了
['new_batch_http_request', u'spreadsheets']
换句话说,permissions()
不是 service
中的方法,因为我已经定义了服务。我应该怎么做?
尝试使用方法Permissions: insert from the documentation。您将能够为文件或团队云端硬盘插入权限。
这是文档中提供的sample code:
from apiclient import errors
# ...
def insert_permission(service, file_id, value, perm_type, role):
"""Insert a new permission.
Args:
service: Drive API service instance.
file_id: ID of the file to insert permission for.
value: User or group e-mail address, domain name or None for 'default'
type.
perm_type: The value 'user', 'group', 'domain' or 'default'.
role: The value 'owner', 'writer' or 'reader'.
Returns:
The inserted permission if successful, None otherwise.
"""
new_permission = {
'value': value,
'type': perm_type,
'role': role
}
try:
return service.permissions().insert(
fileId=file_id, body=new_permission).execute()
except errors.HttpError, error:
print 'An error occurred: %s' % error
return None
使用 Try it now 测试实时数据并查看 API 请求和响应。
如需进一步阅读,请查看此
服务只是 discovery.build 调用结果的通用名称。在这种情况下,没有 'permissions' 方法只是因为它在同一服务上不可用。如果不需要更改所有者,则以下代码应该足够了。要添加具有读写权限的人,以下对我有用:
def grant_permissions(spreadsheet_id, writer):
drive_service = discovery.build('drive', 'v3')
permission = drive_service.permissions().create(
fileId=spreadsheet_id,
body={
'type': 'user',
'role': 'writer',
'emailAddress': writer,
}
).execute()
drive_service.files().update(
fileId=spreadsheet_id,
body={'permissionIds': [permission['id']]}
).execute()
要真正更改所有者,必须设置转让所有权标志:
def change_owner(spreadsheet_id, writer):
drive_service = discovery.build('drive', 'v3')
permission = drive_service.permissions().create(
fileId=spreadsheet_id,
transferOwnership=True,
body={
'type': 'user',
'role': 'owner',
'emailAddress': writer,
}
).execute()
drive_service.files().update(
fileId=spreadsheet_id,
body={'permissionIds': [permission['id']]}
).execute()
正在使用的服务帐户必须具有正确的权限。我相信对我有用的是在第一次创建服务帐户时选中 g 套件框。
我是通过阅读 Chris 留下的评论才知道的。他的评论中所缺少的只是你实际上需要在他的 drive_service
中使用特定的范围。请注意我用来构建不同对象的范围的变化:
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.discovery import build
key = '/path/to/service_account.json'
# Build 'Spreadsheet' object
spreadsheets_scope = [ 'https://www.googleapis.com/auth/spreadsheets' ]
sheets_credentials = ServiceAccountCredentials.from_json_keyfile_name(key, spreadsheets_scope)
sheets_service = build('sheets', 'v4', credentials=sheets_credentials)
# returns 'Spreadsheet' dict
# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#resource-spreadsheet
spreadsheet = sheets_service.spreadsheets().create(
body={
"properties": {
'title': 'spreadsheets test',
},
"sheets": [],
}
).execute()
# id for the created file
spreadsheetId = spreadsheet['spreadsheetId']
# url of your file
spreadsheetUrl = spreadsheet['spreadsheetUrl']
# Build 'Permissions' object
drive_scope = [ 'https://www.googleapis.com/auth/drive' ]
drive_credentials = ServiceAccountCredentials.from_json_keyfile_name(key, drive_scope)
drive_service = build('drive', 'v3', credentials=drive_credentials)
# returns 'Permissions' dict
permissions = drive_service.permissions().create(
fileId=spreadsheetId,
transferOwnership=True,
body={
'type': 'user',
'role': 'owner',
'emailAddress': 'example@email.com',
}
).execute()
# apply permission
drive_service.files().update(
fileId=spreadsheetId,
body={'permissionIds': [permissions['id']]}
).execute()
print ('\nOpen me:\n\n%s\n' % spreadsheetUrl)
所以逻辑是,'Spreadsheet Resource' 由 build
及其所有属性和 sheet 数据组成,所有者设置为 您的服务帐户。接下来,制作一个'Drive Resource',这是带有permissions()
方法的Resource。 execute()
returns 新创建的权限 id 用于 update()
传播 sheet 文件。