I built a web form using React and deployed it on Vercel. I want to send the form data to a Google Sheets spreadsheet but I keep getting a CORS error.
The error message says:
Access to fetch at ‘URL’ from origin 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.
Here’s my Google Apps Script code:
function doPost(request) {
var corsHeaders = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST",
"Access-Control-Allow-Headers": "Content-Type",
};
if (request.postData.contents) {
var payload = JSON.parse(request.postData.contents);
var spreadsheet = SpreadsheetApp.openById('your-sheet-id').getSheetByName('Sheet1');
var fullName = payload.fullName || '';
var userEmail = payload.userEmail || '';
var userMessage = payload.userMessage || '';
spreadsheet.appendRow([fullName, userEmail, userMessage]);
return ContentService.createTextOutput("Data saved successfully!")
.setMimeType(ContentService.MimeType.JSON)
.setHeaders(corsHeaders);
} else {
return ContentService.createTextOutput("Failed to receive data.")
.setMimeType(ContentService.MimeType.JSON)
.setHeaders(corsHeaders);
}
}
And here’s my React fetch request:
try {
const result = await fetch("https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(userData),
});
if (result.ok) {
const responseData = await result.json();
console.log("API Response:", responseData);
alert("Form submitted successfully!");
} else {
const errorInfo = await result.json();
console.error("Response error:", errorInfo);
alert("Submission failed: " + (errorInfo.message || "Unknown error"));
}
} catch (err) {
console.error("Request failed:", err);
alert("An error occurred during submission.");
}
I’ve tried different approaches to fix the CORS headers but nothing works. Is there a solution for this or should I try a different method?