如何将Google Sheets作为Android应用数据库,配置AppScript谷歌账号权限
关于Google Apps Script部署权限与Android应用适配的问题解答
一、「任何人」权限的风险
- 完全公开访问:只要获取到部署URL的用户,无论是否拥有谷歌账号,都能直接请求并获取你的Sheet数据,存在极高的数据泄露风险,恶意用户可批量爬取或滥用数据。
- 扩展风险:若后续脚本新增写入/修改数据的逻辑,公开权限会导致数据被恶意篡改的风险。
二、能否切换为「任何拥有谷歌账号的用户」权限?
完全可以。该权限既能将访问范围限制在持有谷歌账号的用户群体内,大幅降低公开泄露风险,又能满足多用户跨设备访问数据的需求,是更安全的替代方案。
三、切换权限后的部署与应用端适配步骤
1. 重新部署Apps Script
- 打开你的Apps Script项目,点击右上角「部署」→「新建部署」。
- 部署类型选择「Web应用」。
- 执行权限选择「我自己」(确保脚本以你的身份访问Sheet,避免普通用户因权限不足无法读取数据)。
- 谁可以访问选择「任何拥有Google账号的用户」。
- 点击「部署」,复制新生成的部署URL,替换应用中原有的旧URL。
2. Android应用端代码调整
切换权限后,直接用原请求方式会返回401未授权错误,需要添加谷歌账号身份验证:
- 先在Android应用中集成Google Sign-In:在Google Cloud Console启用Google Sign-In服务,配置应用的SHA-1指纹与OAuth客户端ID,完成基础集成。
- 获取用户登录后的ID Token,在Volley请求中添加授权请求头:
String getMember_url = 新部署URL + "action=getMember"; StringRequest stringRequest = new StringRequest(Request.Method.GET, getMember_url, new Response.Listener<String>() { @Override public void onResponse(String response) { findMemberandShow(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 处理授权失败或请求错误 } } ); // 添加授权请求头 stringRequest.setHeaders(new HashMap<String, String>() {{ put("Authorization", "Bearer " + 用户的ID Token); }}); // 原有超时与请求队列逻辑保留 int socketTimeOut = 50000; RetryPolicy policy = new DefaultRetryPolicy(socketTimeOut, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); stringRequest.setRetryPolicy(policy); RequestQueue queue = Volley.newRequestQueue(this); queue.add(stringRequest);
四、Apps Script端代码优化
你的现有脚本存在一处冗余:member_sheet.activate;缺少括号,且activate()方法并非必要操作,直接操作数据范围即可,建议删除该行,优化后代码:
function doGet(e) { var action = e.parameter.action; if (action == 'getMember') { return getUsers(member_sheet); } } function getUsers(member_sheet) { var jo = {}; var dataArray = []; var rows = member_sheet.getRange(2, 1, member_sheet.getLastRow()-1, member_sheet.getLastColumn()).getValues(); for (var i=0, l=rows.length; i<l; i++) { var dataRow = rows[i]; var record = {}; record['id'] = dataRow[0]; record['date'] = Utilities.formatDate(dataRow[1],"IST","dd/MMM/YYYY"); record['name'] = dataRow[2]; record['age'] = dataRow[3]; record['gender'] = dataRow[4]; record['mobile'] = dataRow[5]; record['life'] = dataRow[6]; record['status'] = dataRow[7]; dataArray.push(record); } jo.user = dataArray; var result = JSON.stringify(jo); return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON); }
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

