Google Apps Script Web App带路径调用触发CORS策略问题求助
解决Google Apps Script Web App带路径请求的CORS问题
问题核心是带路径的请求触发了浏览器的OPTIONS预请求,而你的Google Apps Script只实现了doGet方法,没有处理OPTIONS请求,导致预请求失败,触发CORS错误。直接访问基础URL时属于浏览器的简单请求,不会触发预校验,所以能正常返回数据。
解决步骤:
1. 添加doOptions方法处理预请求
专门响应浏览器的OPTIONS预请求,返回必要的CORS头:
function doOptions(e) { return ContentService.createTextOutput('') .setMimeType(ContentService.MimeType.TEXT) .setHeaders({ 'Access-Control-Allow-Origin': '*', // 生产环境建议替换为你的实际域名,比如https://your-site.com 'Access-Control-Allow-Methods': 'GET, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }); }
2. 修改doGet方法,给响应添加CORS头
确保实际的GET请求响应也包含跨域允许头:
function doGet(e) { let output = ""; const path = e.pathInfo.split("/"); // 用const避免全局变量污染 switch(path[0]) { case "Employees": output = path.length > 1 ? getEmployeeByName(path[1]) : getAllEmployees(); break; case "Tasks": output = getAllTasks(); break; default: output = { error: "无效的请求路径" }; // 处理未知路径的情况 } return ContentService.createTextOutput(JSON.stringify(output)) .setMimeType(ContentService.MimeType.JSON) .setHeaders({ 'Access-Control-Allow-Origin': '*', // 和doOptions保持一致,生产环境替换为指定域名 'Access-Control-Allow-Methods': 'GET, OPTIONS' }); }
3. 优化前端fetch配置(可选但建议)
GET请求不需要设置Content-Type为text/plain,可以移除该头或改为application/json,减少预请求触发的概率:
try { fetch(this.url + "/Employees", { redirect: "follow", method: "GET", headers: { "Accept": "application/json" // 指定接受JSON格式 }, }) .then(response => response.json()) .then(data => { // 处理返回的数据 console.log(data); }) } catch (err) { console.log(err); }
关键注意点:
- 修改代码后必须重新部署Web App并更新版本,否则修改不会生效
- 生产环境不要用
*作为允许源,替换为你的实际业务域名,提升安全性 - 浏览器直接访问属于简单请求,不会触发OPTIONS预校验,所以能正常返回,但前端脚本的跨域请求必须通过预校验
内容的提问来源于stack exchange,提问作者STG
相关产品推荐
相关产品推荐

