You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

点击网页按钮调用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

火山引擎 最新活动