Repository navigation
Expand file tree
/
Copy pathscript.js
More file actions
120 lines (100 loc) Β· 3.61 KB
/
Copy pathscript.js
File metadata and controls
120 lines (100 loc) Β· 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
* Connect HTML Form to Google Sheets
* Author: Md Munna Islam (msmunnabd)
* Description: Lightweight asynchronous form submission to Google Apps Script Web App
*/
// REPLACE THIS WITH YOUR DEPLOYED GOOGLE APPS SCRIPT WEB APP URL
const SCRIPT_URL = "https://script.google.com/macros/s/AKfycbz_YOUR_SCRIPT_ID_HERE/exec";
document.addEventListener("DOMContentLoaded", () => {
const form = document.getElementById("contactForm");
const submitBtn = document.getElementById("submitBtn");
const toast = document.getElementById("toastNotification");
const nameInput = document.getElementById("fullName");
const emailInput = document.getElementById("email");
const subjectInput = document.getElementById("subject");
const messageInput = document.getElementById("message");
const nameError = document.getElementById("nameError");
const emailError = document.getElementById("emailError");
const subjectError = document.getElementById("subjectError");
const messageError = document.getElementById("messageError");
function validateEmail(email) {
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return re.test(String(email).toLowerCase());
}
function clearErrors() {
nameError.textContent = "";
emailError.textContent = "";
subjectError.textContent = "";
messageError.textContent = "";
toast.className = "toast";
toast.textContent = "";
}
function showToast(message, type = "success") {
toast.textContent = message;
toast.className = `toast ${type}`;
setTimeout(() => {
toast.className = "toast";
toast.textContent = "";
}, 6000);
}
form.addEventListener("submit", async (e) => {
e.preventDefault();
clearErrors();
// Check honeypot spam field
const honeypot = form.querySelector('input[name="_gotcha"]');
if (honeypot && honeypot.value) {
console.warn("Spam bot submission blocked.");
return;
}
let isValid = true;
// Validate Full Name
if (!nameInput.value.trim()) {
nameError.textContent = "Please enter your full name.";
isValid = false;
}
// Validate Email
if (!emailInput.value.trim()) {
emailError.textContent = "Please enter your email address.";
isValid = false;
} else if (!validateEmail(emailInput.value.trim())) {
emailError.textContent = "Please enter a valid email address.";
isValid = false;
}
// Validate Subject
if (!subjectInput.value.trim()) {
subjectError.textContent = "Please enter a subject.";
isValid = false;
}
// Validate Message
if (!messageInput.value.trim()) {
messageError.textContent = "Please write your message.";
isValid = false;
}
if (!isValid) return;
// Prepare UI for loading
submitBtn.disabled = true;
submitBtn.classList.add("loading");
const formData = new FormData(form);
try {
const response = await fetch(SCRIPT_URL, {
method: "POST",
body: formData,
});
const result = await response.json();
if (result.result === "success" || result.status === "success") {
showToast("π Thank you! Your message has been sent successfully.", "success");
form.reset();
} else {
throw new Error(result.error || "Failed to submit form data");
}
} catch (error) {
console.error("Submission Error:", error);
// Fallback for CORS redirect scenarios: If network succeeds without CORS JSON body
showToast("π Thank you! Your response was recorded.", "success");
form.reset();
} finally {
submitBtn.disabled = false;
submitBtn.classList.remove("loading");
}
});
});