使用gspread_asyncio创建的Google Sheets无访问权限,求解决方案
解决Google Sheets创建后无访问/编辑权限的问题
你遇到的问题根源是:通过服务账号创建的Google Sheets文档,默认只有该服务账号本身拥有访问权限,普通Google账号无法直接打开或编辑。不需要在Cloud Console反复调整权限,直接在代码中添加权限分配逻辑即可解决。
修改后的完整代码
from gspread_asyncio import AsyncioGspreadClientManager import io import csv from google.oauth2 import service_account from gspread.exceptions import SpreadsheetNotFound async def upload_file_to_gsheets(credentials_path, csv_string, spreadsheet_name, target_email): try: credentials = service_account.Credentials.from_service_account_file( credentials_path, scopes=[ 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/spreadsheets' ] ) agcm = AsyncioGspreadClientManager(lambda: credentials) gc_client = await agcm.authorize() try: spreadsheet = await gc_client.open(spreadsheet_name) # 若打开已有表格,也可添加权限确保访问正常 await spreadsheet.share( target_email, perm_type='user', role='writer', notify=False ) except SpreadsheetNotFound: spreadsheet = await gc_client.create(spreadsheet_name) # 给目标邮箱添加编辑权限 await spreadsheet.share( target_email, perm_type='user', role='writer', notify=False # 设为True会发送权限通知邮件 ) worksheet = await spreadsheet.get_worksheet(0) csv_file = io.StringIO(csv_string) reader = csv.reader(csv_file) values_list = list(reader) await worksheet.update('A1', values_list) spreadsheet_url = spreadsheet.url return spreadsheet_url except Exception as error: print(error) return
关键修改说明
- 新增参数
target_email:传入需要赋予权限的个人Google邮箱(比如your-name@gmail.com) - 添加权限分配逻辑:无论是新建还是打开已有表格,都调用
spreadsheet.share()方法给指定邮箱分配writer(编辑)权限 - 优化权限范围:将原scopes调整为更精准的
drive和spreadsheets权限,避免不必要的全权限请求
额外注意事项
- 确保你的Google Cloud项目已经启用了Google Drive API和Google Sheets API(可在Cloud Console的API库中搜索启用)
- 调用函数时需传入
target_email参数,示例:await upload_file_to_gsheets('credentials.json', csv_data, '测试表格', 'your-email@gmail.com')
内容的提问来源于stack exchange,提问作者newbee12345
相关产品推荐
相关产品推荐

