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

Google Apps Script(GAS)跨域(CORS)问题求助:HTML表单数据无法提交至Google表格

解决HTML表单提交到Google Sheets的CORS与Fetch错误问题

看起来你遇到的CORS和提交失败问题,大概率是Fetch请求配置不完整、后端脚本与前端字段不匹配,加上Web App部署细节没到位导致的,咱们一步步来修复:

1. 修正Fetch请求的CORS与格式配置

你的Fetch请求缺少关键的Content-Type头部,这会导致后端无法正确解析JSON数据,同时也可能触发CORS限制。修改后的代码如下:

const url = "https://script.google.com/macros/s/AKfycbzZe824lIxa-hNsO71xoFfq5qXbFaDKhHZeACrQgLMCjU_EjvY/exec";
var loginText = document.getElementById("tLogin");
var tableText = document.getElementById("tTable");
var orderText = document.getElementById("tOrder");

function testGS(){
 var userInfo = {
 login: loginText.value,
 table: tableText.value,
 order: orderText.value,
 tdate: new Date().toLocaleDateString(),
 //komm: kommText.value,
 };
 fetch(url, {
 method: 'POST',
 mode: 'cors', // 明确启用CORS(默认值,但显式声明更稳妥)
 headers: {
   'Content-Type': 'application/json', // 必须设置,告诉后端接收的是JSON格式
 },
 body: JSON.stringify(userInfo)
 })
 .then((res) => {
   // 先检查HTTP响应状态
   if (!res.ok) throw new Error(`请求失败,状态码:${res.status}`);
   return res.json(); // 改成解析JSON,配合后端返回格式
 })
 .then((res) => {
   console.log("提交成功!", res);
   // 可选:提交后清空表单
   loginText.value = "";
   tableText.value = "";
   orderText.value = "";
 })
 .catch((err) => {
   console.error("提交出错:", err);
 });
 console.log("要提交的数据:", userInfo);
}

document.getElementById("del").addEventListener("click", testGS);

2. 确保Google Sheets表头与前端字段完全匹配

你的后端脚本会排序后对比前端传入的字段名与表格表头(排除第一列ID),所以必须保证:

  • 你的LOG_history工作表第一行(表头),从第二列开始的字段名,要和前端userInfo的key完全一致(包括大小写!)。比如前端传的是logintableordertdate,表头就必须是这四个名称,顺序无关,但拼写和大小写不能错。
  • 如果表头有拼写错误(比如写成LoginTable),后端会返回Invalid Arguments Passed错误,导致提交失败。

3. 检查Google Apps Script的Web App部署设置

这是最容易忽略的关键点,必须确保:

  • 部署类型选择Web app
  • 执行权限设置为Anyone, even anonymous
  • 访问权限同样设置为Anyone, even anonymous
  • 每次修改脚本后,一定要点击「部署」→「新版本」,并使用新生成的部署URL(旧URL不会生效)

4. 统一后端返回格式(可选但推荐)

你的doPost方法最后返回的是纯文本"ok",和doGet的JSON格式不一致,建议修改成统一的JSON返回,方便前端处理:

function doPost(e){
 let jsonResponse;
 const ss = SpreadsheetApp.getActiveSpreadsheet();
 const ws = ss.getSheetByName("LOG_history");
 const headers = ws.getRange(1,1,1,ws.getLastColumn()).getValues()[0];
 const headersOriginalOrder = headers.slice();
 headersOriginalOrder.shift(); //remove id columns header
 headers.shift();
 headers.sort();
 const body = e.postData.contents;
 const bodyJSON = JSON.parse(body);
 const headersPassed = Object.keys(bodyJSON).sort();
 if(!compareTwoArray_(headers, headersPassed)){
 jsonResponse = [{status:500, message:"Invalid Arguments Passed"}];
 return sendJSON_(jsonResponse);
 }
 const arrayOfData = headersOriginalOrder.map(h => bodyJSON[h]);
 const aoaIds = ws.getRange(2,1,ws.getLastRow()-1,1).getValues();
 const newIDNumber = getMaxFromArrayOfArray_(aoaIds) + 1;
 arrayOfData.unshift(newIDNumber);
 ws.appendRow(arrayOfData);
 // 替换原来的纯文本返回,改成JSON格式
 jsonResponse = [{status:200, message:"Data submitted successfully"}];
 return sendJSON_(jsonResponse);
}

5. 避免本地file://协议的CORS限制

如果你直接双击HTML文件用file://协议打开,浏览器会严格限制跨域请求。建议用本地服务器托管页面:

  • Python:执行python -m http.server,然后访问http://localhost:8000
  • Node.js:安装http-server后执行http-server,访问对应地址

按以上步骤排查后,应该就能解决CORS和提交失败的问题了。

内容的提问来源于stack exchange,提问作者Dmitriy Rudakov

火山引擎 最新活动