服务账号创建的Google Spreadsheet无法共享至企业账号问题排查
问题核心原因
- 你调用的
sh.share()方法不支持直接传入邮箱列表作为第一个参数,该参数要求为单个邮箱字符串,传入列表会导致共享逻辑执行异常,这是无报错但共享失效的最主要原因。 - 你同时将服务账号自身和个人邮箱都设置为
owner角色,Google Drive的所有权转移逻辑要求:当从服务账号向普通Google账号转移所有权时,需要先给普通账号授予writer权限,再单独发起所有权转移,直接设置owner会被接口静默拒绝。 - 服务账号创建的表格默认归属服务账号的私有云盘空间,未成功完成共享操作时,个人账号的Sheets列表自然无法检索到该文件。
修复方案
调整create_insert_sheets函数里的共享逻辑,遍历邮箱列表逐个添加权限,个人邮箱先授予编辑权限再升级为所有者:
def create_insert_sheets(nm_sheet, email_share, type_role, df): gc = create_credentials() sh = gc.create(nm_sheet) # 遍历邮箱列表逐个共享 for email in email_share: # 服务账号本身是创建者,不需要重复赋权 if email == gc.auth.service_account_email: continue # 普通账号如果要设置为所有者,需先给编辑权限再转移所有权 if type_role == 'owner' and not email.endswith('iam.gserviceaccount.com'): sh.share(email, perm_type='user', role='writer') # 转移所有权必须加transfer_ownership参数 sh.share(email, perm_type='user', role='owner', transfer_ownership=True) else: sh.share(email, perm_type='user', role=type_role) update_spreadsheet(0, sh.id, df) return sh # 调用时可直接移除服务账号邮箱,不需要重复共享给创建者 create_insert_sheets("api_test_create", ["myemail@domain.com"], "owner", df_grade)
内容的提问来源于stack exchange,提问作者RCarmody
相关产品推荐
相关产品推荐

