点击网页按钮调用Google App Scripts接口时遭遇405错误及CORS跨域问题求助
点击网页按钮调用Google App Scripts接口时遭遇405错误及CORS跨域问题求助
我最近做了个超简单的网页,就一个按钮,点击后会调用SendTest()函数给我的Google App Scripts代码发POST请求。结果测试的时候一点按钮就翻车了,控制台直接蹦出这个错误:
Access to fetch at 'https://script.google.com/macros/s/[redacted]/exec' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
折腾了好半天也没摸透问题出在哪,有没有大佬能帮我看看咋解决呀?
过来人给你支几招!我之前也踩过一模一样的坑
- 先盯紧Web应用的部署配置:把Google App Scripts部署成Web应用的时候,权限一定要选对!新部署时类型选「Web应用」,「谁可以访问此应用」要改成「任何人,甚至匿名」(测试阶段先用这个,正式上线再调权限),而且每次改完代码必须重新部署成新版本,别用旧版本的部署链接,这坑我当初踩了三次才记住!
- 必须处理OPTIONS预检请求:浏览器发POST之前会先发起OPTIONS预检请求,你的脚本要是没处理这个请求,直接就返回405错误,还不带CORS头。给你贴段现成的处理代码:
function doOptions(e) { return ContentService.createTextOutput("") .setMimeType(ContentService.MimeType.TEXT) .setHeaders({ "Access-Control-Allow-Origin": "http://127.0.0.1:5500", // 直接写你本地的域名,别用*更安全 "Access-Control-Allow-Methods": "POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type" }); }
- doPost函数里必须带CORS头:处理POST请求的函数返回响应时,一定要加上允许跨域的头,不然浏览器还是会拦截,示例代码给你参考:
function doPost(e) { // 这里写你自己的业务逻辑,比如解析请求参数、操作表格啥的 const result = { code: 200, msg: "请求成功处理啦" }; return ContentService.createTextOutput(JSON.stringify(result)) .setMimeType(ContentService.MimeType.JSON) .setHeaders({ "Access-Control-Allow-Origin": "http://127.0.0.1:5500" }); }
- 前端fetch配置要对应上:你的
SendTest()函数里,fetch的配置也得注意细节,比如:
function SendTest() { fetch('https://script.google.com/macros/s/[redacted]/exec', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ testData: "hello GAS" }), credentials: 'omit' // 测试阶段先关凭证,避免额外的跨域问题 }) .then(res => res.json()) .then(data => console.log("返回结果:", data)) .catch(err => console.error("请求失败:", err)); }
按这几步来,应该就能解决CORS和405的问题了,你快试试!
内容来源于stack exchange




