访问Google Apps Script Web App返回404 NOT_FOUND错误如何解决
核心问题说明
doGet/doPost是Web App专属的请求入口函数,不能通过Apps Script API的scripts.run方法调用,该方法仅支持调用普通自定义全局函数(如你代码里的makeQuestionsForm)。
404错误全量排查项
- 确认
SCRIPT_ID取值正确:只能使用Apps Script项目的脚本ID,不能填Google Cloud项目ID。获取路径:打开Apps Script编辑器 -> 左侧菜单栏「项目设置」 -> 复制页面内的「ID」字段值。 - 确认Apps Script项目已开启执行API权限:
- 在Apps Script项目设置页勾选「在编辑器中显示appsscript.json清单文件」
- 回到编辑器打开
appsscript.json,确认添加了执行API访问配置:
"executionApi": { "access": "ANYONE" }- 绑定的Google Cloud项目必须启用Apps Script API,未启用会直接返回404。
- 确认
devMode参数配置正确:devMode设为True时,调用凭证对应的用户必须是Apps Script项目的编辑者,仅为测试用户时会触发404。测试用户调用请先部署一个固定版本,devMode设为False。 - 确认调用的函数为全局暴露的函数,无拼写错误,没有嵌套在其他函数内部。
调用逻辑修正方案
方案1:使用Apps Script API调用(推荐)
直接调用makeQuestionsForm函数即可,无需走Web App入口,注意parameters要按函数定义的参数顺序传数组,不能传字典:
service = build('script', 'v1', credentials=self.creds) # 参数顺序和makeQuestionsForm(mywork, formName, subject)完全对应 api_request = { "function": "makeQuestionsForm", "parameters": [self.sheet_body, title, request.session['subject']], "devMode": False } response = service.scripts().run(body=api_request, scriptId=SCRIPT_ID).execute()
方案2:直接调用Web App接口
如果要使用doGet/doPost能力,直接请求Web App部署URL即可,之前的未授权错误排查和代码修正:
- 确认Web App部署配置:「执行为」选择自己的账号,「有权访问的人」选择指定的测试用户或对应范围。
- 调用请求头的Authorization字段格式为
Bearer <你的access_token>,token需包含Web App要求的对应作用域。 - 修正
doPost的参数解析逻辑,原有逻辑无法直接解析POST的JSON参数:
function doPost(e){ Logger.log('doPost is called'); const requestBody = JSON.parse(e.postData.contents); const mywork = requestBody.mywork; const formName = requestBody.formName; const subject = requestBody.subject; const result = makeQuestionsForm(mywork, formName, subject); return ContentService.createTextOutput(JSON.stringify(result)) .setMimeType(ContentService.MimeType.JSON); }
- 调用时直接向Web App部署URL发POST请求,请求体为JSON格式即可。
内容的提问来源于stack exchange,提问作者David Zhang
相关产品推荐
相关产品推荐

