You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非表单所有者用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授权头:

  1. 当表单允许公开提交(即使开启收集邮箱),formResponse端点仅需要正确的表单参数,不需要OAuth Token验证
  2. 你添加的Authorization头会触发Google权限校验,但你的令牌没有操作该表单的权限(非所有者),因此被拒绝
  3. 浏览器提交成功是因为使用了当前登录用户的会话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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:49:58