Python Can';t升级使用Google Drive API v3上载的文件的权限

Python Can';t升级使用Google Drive API v3上载的文件的权限,python,google-api,google-drive-api,google-api-client,Python,Google Api,Google Drive Api,Google Api Client,我刚开始使用GoogleDriveAPI,结果发现我无法迁移所创建文件的所有权。 我从一个服务帐户上传了一个文件到驱动器,然后给自己“writer”权限,并尝试将自己更新为所有者,正如api文档中所写的那样 media = MediaFileUpload(filename, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') file = driveService.files().create

我刚开始使用GoogleDriveAPI,结果发现我无法迁移所创建文件的所有权。 我从一个服务帐户上传了一个文件到驱动器,然后给自己“writer”权限,并尝试将自己更新为所有者,正如api文档中所写的那样

media = MediaFileUpload(filename, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
file = driveService.files().create(media_body=media, fields='id').execute()
access = driveService.permissions().create(
    fileId = file['id'],
    body = {'type': 'user', 'role': 'writer', 'emailAddress': my_email},
    fields = 'id'
).execute()
update = driveService.permissions().update(fileId=file.get('id'), 
                                         permissionId=access.get('id'), 
                                         transferOwnership=True,
                                         body = {'role': 'owner', 'emailAddress': my_email }).execute()
--------------------------------------------------------------------------
HttpError: <HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/file_id/permissions/permission_id?transferOwnership=true&alt=json returned "The resource body includes fields which are not directly writable.">
media=MediaFileUpload(文件名,mimetype='application/vnd.openxmlformatsofcedocument.spreadsheetml.sheet')
file=driveService.files().create(media_body=media,fields='id').execute()
access=driveService.permissions().create(
fileId=file['id'],
body={'type':'user','role':'writer','emailAddress':my_email},
字段='id'
).execute()
update=driveService.permissions().update(fileId=file.get('id'),
permissionId=access.get('id'),
转让所有权=真,
body={'role':'owner','emailAddress':my_email}.execute()
--------------------------------------------------------------------------
HttpError:
更新:问题已通过删除“emailAddress”参数得到修复,但随后出现新错误:

HttpError: <HttpError 403 when requesting https://www.googleapis.com/drive/v3/files/fileId/permissions/permissionId?transferOwnership=true&alt=json returned "The user does not have sufficient permissions for this file.">
HttpError:
另一个更新:我重新上传了credetials文件,并修复了第二个错误。

根据更新,主体的可写参数仅为“role”和“expirationTime”,但您试图再次将电子邮件地址分配给现有权限,因此出现错误“资源主体包含不可直接写入的字段”

access
中创建的权限已经有关联的电子邮件,您只能更改“角色”和“过期时间”。另外,
access
中的请求主体没有指定“角色”,而是指定了“writer”属性,因此这是一个输入错误


更新: 将文件插入驱动器时,该文件的所有者是该文件上载到的驱动器的所有者。 所以我假设:

  • 服务帐户(上载文件的初始所有者)模拟的帐户与您在
    访问
    对象中为其创建权限的电子邮件地址不同
  • 在创建用户类型权限的请求中,您需要传递idvalue可选参数来识别用户。(您正确地传递了“id”,但“emailAddress”是多余的)
  • 第一次更新权限时,您可能已经将所有权转移给“writer”权限的用户,该用户现在应该是文件的所有者,因此模拟帐户没有足够的权限访问该文件
  • 您可以在API资源管理器中快速检查文件权限,请求并查看文件的所有者以及所有其他属性。

    根据说明,正文的可写参数仅为“角色”和“过期时间”,但您试图再次将电子邮件地址分配给现有权限,因此出现错误“资源正文包含不可直接写入的字段。”

    access
    中创建的权限已经有一封与之关联的电子邮件,您只能更改“角色”和“过期时间”。而且
    access
    中的请求正文没有指定“角色”,而是指定了“writer”属性,因此这是一个打字错误


    更新: 将文件插入驱动器时,该文件的所有者是该文件上载到的驱动器的所有者。 所以我假设:

  • 服务帐户(上载文件的初始所有者)模拟的帐户与您在
    访问
    对象中为其创建权限的电子邮件地址不同
  • 在创建用户类型权限的请求中,您需要传递id可选参数来标识用户。(您正确地传递了“id”,但“emailAddress”是多余的)
  • 第一次更新权限时,您可能已经将所有权转移给“writer”权限的用户,该用户现在应该是文件的所有者,因此模拟帐户没有足够的权限访问该文件

  • 您可以在API资源管理器中快速检查文件权限,请求并查看所有者文件的属性,以及所有其他属性。

    嗨,Mariia,如果您发现问题中有错误,可以通过编辑来更新。请阅读有关如何提出好问题的提示。同样,这意味着一个问题一个可接受的答案,在评论中提出新问题是一种不好的做法,请尝试编辑您的问题以反映问题你有。:)嗨,Mariia,如果你注意到问题中有错误,你可以通过编辑来更新。请阅读有关如何提出好问题的提示。同样,这意味着一个问题一个被接受的答案,在评论中提出新问题是一种不好的做法,尝试编辑你的问题以反映你的问题。:)太好了!你是你应该接受你问题的答案。检查。太好了!你应该接受你问题的答案。检查。