使用Google Drive API创建权限时遇Permission value字段必填错误
我通过Google Sheets API创建谷歌电子表格,再使用Google Drive API修改该表格文件的权限以设置新所有者。尽管已按照官方文档传递参数,仍出现如下错误:
An error occurred while creating permission: <HttpError 400 when requesting https://www.googleapis.com/drive/v2/files/1xVPxNHQmbO2RSbzbTg7K3qLa8fURP3S_xkIStMVIpK8/permissions?alt=json returned "Permission value field required". Details: "[{'domain': 'global', 'reason': 'required', 'message': 'Permission value field required', 'locationType': 'other', 'location': 'permission.value'}]">
我使用的是Google官方文档中的代码片段:
def driveService(fileID, email): drive_service = build('drive', 'v2') insert_permission(drive_service, fileID, email, "user", "owner") def insert_permission(service, file_id, email, 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 = { 'type': perm_type, 'role': role, 'value': email } try: return service.permissions().insert( fileId=file_id, body=new_permission).execute() except errors.HttpError as error: print('An error occurred while creating permission: %s' % error) return None
解决方法
这个错误的核心原因是:在Drive API v2中,当权限类型为user或group时,需要使用emailAddress字段指定用户邮箱,而非代码中使用的value字段。官方旧代码片段未及时更新,导致参数字段不匹配。
修复后的代码
修改insert_permission函数中的权限字典,将'value': email替换为'emailAddress': email:
def driveService(fileID, email): drive_service = build('drive', 'v2') insert_permission(drive_service, fileID, email, "user", "owner") def insert_permission(service, file_id, email, 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 = { 'type': perm_type, 'role': role, 'emailAddress': email # 替换为emailAddress字段 } try: return service.permissions().insert( fileId=file_id, body=new_permission).execute() except errors.HttpError as error: print('An error occurred while creating permission: %s' % error) return None
额外注意事项
设置文件所有者时需满足以下条件:
- 当前操作账号必须是文件的原始所有者,或拥有G Suite/Workspace管理员权限(允许跨域转移所有权)
- 目标邮箱必须对应有效的Google账号,或与当前账号属于同一Workspace域(跨域转移需管理员授权)
内容的提问来源于stack exchange,提问作者soCalJack23

