非表单所有者用Google App Script提交需验证邮箱的Google表单遇401错误
问题描述
我不是目标Google表单的所有者,尝试用Google App Script自动提交一个要求收集提交者信息的表单时遇到401错误。
- 表单开启了「收集提交者的电子邮件地址」设置
- 浏览器登录状态下,直接访问带参数的formResponse链接可以成功提交,但GAS代码调用返回401
我的测试代码:
function submitToGoogleFormWithEmail() { var formUrl = "https://docs.google.com/forms/d/e/1FAIpQLSdBdRIYCAaxp2FI4n0rVZywcz0Br7n2DOBOIcWSLHP9B67ikA/formResponse"; var email = Session.getActiveUser().getEmail(); var token = ScriptApp.getOAuthToken(); Logger.log(token); var payload = { "entry.1507679348": "lucasdo", "entry.21751216": "dnd", "entry.528181198": "appscript", "emailAddress": email }; var options = { 'method': 'post', "muteHttpExceptions": true, 'payload': payload, 'headers': { 'Authorization': 'Bearer ' + token, 'Accept': 'application/x-www-form-urlencoded' } }; var response = UrlFetchApp.fetch(formUrl, options); Logger.log(response.getResponseCode()); }
解决方案
错误核心原因
401错误是因为你给公开可提交的Google Form请求添加了不必要的OAuth授权头:
- 当表单允许公开提交(即使开启收集邮箱),
formResponse端点仅需要正确的表单参数,不需要OAuth Token验证 - 你添加的
Authorization头会触发Google权限校验,但你的令牌没有操作该表单的权限(非所有者),因此被拒绝 - 浏览器提交成功是因为使用了当前登录用户的会话Cookie,而非OAuth令牌,且表单允许该用户提交
修改后的代码
移除多余的Authorization和Accept头,简化请求配置即可:
function submitToGoogleFormWithEmail() { var formUrl = "https://docs.google.com/forms/d/e/1FAIpQLSdBdRIYCAaxp2FI4n0rVZywcz0Br7n2DOBOIcWSLHP9B67ikA/formResponse"; var email = Session.getActiveUser().getEmail(); var payload = { "entry.1507679348": "lucasdo", "entry.21751216": "dnd", "entry.528181198": "appscript", "emailAddress": email }; var options = { 'method': 'post', "muteHttpExceptions": true, 'payload': payload }; var response = UrlFetchApp.fetch(formUrl, options); Logger.log(response.getResponseCode()); // 正常返回302(重定向到提交成功页)或200 }
额外注意事项
- 确保
emailAddress参数的值是当前GAS脚本运行用户的邮箱,且该邮箱被允许提交表单(表单未限制特定用户/域) - 如果表单设置了「仅限域内用户提交」,需确保脚本运行用户属于该域,仍无需添加OAuth头
- 提交成功后返回302是正常情况(表单默认重定向到完成页面),无需处理成200响应
内容的提问来源于stack exchange,提问作者Đỗ Như Động
相关产品推荐
相关产品推荐

