如何使用Flutter连接登录用户各自的Google Spreadsheet?
核心实现方案
你目前遇到的限制是因为默认gsheet方案用了开发者的服务账号密钥发起请求,所有操作都以你自己的账号身份执行,只要切换为已登录用户的账号身份调用Google Sheets API即可解决问题,你已经完成的Firebase Google登录能力可以直接复用,不需要额外对接第三方服务。
问题1:如何将数据上传至已登录账号各自的Google Spreadsheet中
按以下步骤实现即可:
- 第一步:调整Google登录的授权范围,新增Sheets操作权限,常用scope有两种:只需要访问用户给应用授权过的表格用
https://www.googleapis.com/auth/spreadsheets.file,需要访问用户所有表格用https://www.googleapis.com/auth/spreadsheets,权限越窄用户授权时的安全提示越友好。 - 第二步:获取用户登录后的身份令牌,不要用你之前配置的开发者服务账号密钥,Google登录完成后可以直接从
GoogleSignInAccount实例中获取用户的有效认证头。 - 第三步:用用户身份调用Sheets API执行写入,推荐直接用官方
googleapis包操作,示例代码如下:
import 'package:googleapis/sheets/v4.dart' as sheets; import 'package:google_sign_in/google_sign_in.dart'; // 已完成Google登录后执行写入操作 final GoogleSignInAccount? currentUser = googleSignIn.currentUser; if (currentUser != null) { // 构造用户身份的认证客户端 final authHeaders = await currentUser.authHeaders; final authClient = GoogleAuthClient(authHeaders); final sheetsApi = sheets.SheetsApi(authClient); // 要写入的目标表格ID,可提前存在用户的Firestore文档中,或者由用户手动输入 final targetSpreadSheetId = "用户绑定的表格ID"; // 要写入的内容 final writeData = sheets.ValueRange(values: [ ["第一行第一列内容", "第一行第二列内容"], ["第二行第一列内容", "第二行第二列内容"] ]); // 执行写入 await sheetsApi.spreadsheets.values.append( writeData, targetSpreadSheetId, "Sheet1!A:B", // 写入的工作表和列范围 valueInputOption: "USER_ENTERED", ); }
问题2:如何让已登录账号在应用内新建Google Spreadsheet并完成访问操作
还是基于用户身份认证的Sheets API实例,直接调用创建接口即可:
// 沿用上面构造的sheetsApi实例 // 配置新建表格的属性 final newSheet = sheets.Spreadsheet( properties: sheets.SpreadsheetProperties( title: "你的应用名自动生成的表格", ), ); // 执行创建 final createdSheet = await sheetsApi.spreadsheets.create(newSheet); // 获取新表格的ID,可存储到当前用户的Firebase文档中,后续读写直接调用该ID即可 final userOwnSheetId = createdSheet.spreadsheetId;
新建的表格默认归属当前登录用户所有,开发者没有权限直接访问,完全符合用户数据隔离的要求。
注意事项
- 你需要先在自己的Google Cloud项目控制台中开启Google Sheets API,否则调用会返回接口未启用的报错
- 如果你的应用要公开发布,需要完成Google的OAuth敏感权限审核,提交你使用Sheets权限的场景说明,审核通过后才能给外部用户正常使用
- 不要将开发者的服务账号密钥打包到客户端安装包中,存在严重的泄露风险,所有用户侧的表格操作都使用用户自己的授权令牌执行
内容的提问来源于stack exchange,提问作者minegrammer
相关产品推荐
相关产品推荐

