[{"data":1,"prerenderedAt":323},["ShallowReactive",2],{"blog-ultimate-guide-on-intake-forms":3},{"blogData":4,"relatedArticles":29},{"id":5,"title":6,"author":7,"authorImage":8,"authorProfile":9,"coverImg":10,"coverImgAlt":11,"createdAt":12,"description":13,"featured":14,"jsonld":15,"keywords":16,"metaDescription":17,"metaImage":18,"metaTitle":19,"publishedAt":20,"slug":21,"updatedAt":22,"__hash__":23,"body":24,"coverImgWidth":25,"coverImgHeight":26,"readingStats":27},"blog\u002Fblog\u002Fultimate-guide-on-intake-forms.md","The Ultimate Guide On Intake Forms","Harish Kumar",null,"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fharish-kumar2424\u002F","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FHow_to_Make_User_Research_Survey_b8bcfedc8f.png","cover of a blog post covering everything about intake forms","2025-03-06T18:05:43.321Z","Learn how to create an intake form effortlessly. Learn its purpose, key components, and best tools to collect client info and improve efficiency!",false,[],"intake form,\nintake form template,\nclient intake form,\nmedical intake form,\nonline intake form,","Learn what an intake form is, why it matters, and how to create one easily. Get tips, templates, and the best tools to streamline your workflow!",[],"What Is an Intake Form & How to Create One Easily?","2025-03-06T18:12:20.453Z","ultimate-guide-on-intake-forms","2025-07-10T20:50:59.052Z","FLKVfWm4H0MKntIIkLF_L3BeXvohUiba8fe6HuEt-Is","![cover of a blog post covering everything about intake forms](https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FHow_to_Make_User_Research_Survey_b8bcfedc8f.png)\n\n## What Are Intake Forms\nAn **[intake form](\u002Ftemplates\u002Fcategories\u002Fintake-forms\u002F)** is a document that gathers important information from a person before starting a service or consultation. Businesses, healthcare providers, law firms, and agencies use intake forms to **[understand a client’s needs](https:\u002F\u002Fwww.runsensible.com\u002Fblog\u002Finformation-client-intake-form-matter\u002F)**, history, or concerns.\n\nThink of it as the first step in a process. This could be signing up a new client, onboarding a patient, or gathering details for a project. A well-designed intake form saves time, improves efficiency, and makes sure nothing important is missed.\n\n### Types of Intake Forms\nDifferent industries use intake forms for different purposes. Here are some common types:\n\n**Business & Client Intake Forms**: Used by agencies, freelancers, and service providers to understand a client’s project, budget, and expectations before starting work.\n\n**Medical Intake Forms**: Doctors and therapists use these forms to collect patient history, symptoms, and insurance details before appointments.\n\n**Legal Intake Forms**: Law firms use intake forms to gather case details, client history, and legal concerns before consultations.\n\nFor example, **\u003Ca href=\"https:\u002F\u002Fthebradleylawfirm.com\u002F\">The Bradley Law Firm\u003C\u002Fa>**, with deep experience in personal injury and accident cases, uses detailed intake forms to gather key case information from the start.\n\n**Education Intake Forms**: Schools, universities, and coaching institutes use these to register students, collect academic history, and understand learning needs.\n\n**Service-Based Intake Forms**: Personal trainers, beauty salons, and consultants use these to understand customer preferences and requirements before providing services.\n\n### Key Components of an Intake Form\nA good intake form should be clear, structured, and relevant to your needs. Here are the key sections:\n\n- **Basic Information:** Name, contact details, address.\n\n- **Purpose of Inquiry:** What service or help is the person looking for?\n\n- **Background Details:** Relevant history, preferences, or requirements.\n\n- **Consent & Disclaimers:** **\u003Ca href=\"https:\u002F\u002Flawrina.org\u002Ftemplates\u002F\">Legal agreements\u003C\u002Fa>**, privacy policies, or terms of service.\n\n- **Custom Fields:** Additional fields based on industry-specific needs.\n\n### How to Create an Effective Intake Form\nCreating an intake form should be simple, and you don’t need coding skills to do it. Here’s how you can create one easily:\n\n**Step 1: Choose the Right Tool**\nUse a form builder like **[Formester](\u002F)**, **Google Forms**, or **JotForm** to create your intake form online. Formester offers **[AI-powered form creation](\u002Fai-form-generator\u002F)**, saving you time.\n\n**Step 2: Keep It Simple & Clear**\nAvoid long, confusing questions. Ask only what’s necessary to get the right information.\n\n**Step 3: Use Conditional Logic**\n**[Conditional logic](\u002Fblog\u002Fwhat-is-conditional-logic-how-to-use-it\u002F)** shows or hides questions based on responses. For example, if a client selects “Yes” for requiring a service, you can ask for more details.\n\n**Step 4: Make It Mobile-Friendly**\nMost people fill out forms on their phones. Ensure your form works well on all devices.\n\n**Step 5: Automate Follow-Ups**\nSet up **[automatic email follow ups](\u002Ffeatures\u002Fautoresponder-email\u002F)** after someone submits a form. This confirms their submission and lets them know the next steps.\n\n### Digital vs. Paper Intake Forms\nWhile paper forms are still used, digital forms have many advantages:\n\n- **Faster Processing:** No manual data entry.\n\n- **Easier Storage & Access:** No need for physical files.\n\n- **More Secure:** Digital forms can be encrypted and backed up.\n\n- **Better User Experience:** People can fill them out from anywhere.\n\nMost businesses now prefer online intake forms for convenience and efficiency.\n\n### Best Practices for Intake Forms\nTo create a professional and effective intake form, follow these best practices:\n- Keep it short and relevant. Don’t overwhelm users with too many questions.\n\n- Ensure data security. If you collect sensitive data, follow privacy laws like HIPAA (for medical forms) or GDPR (for businesses in Europe).\n\n- **[Use automation](\u002Fblog\u002F10-best-workflow-automation-tools-in-2024\u002F)**. Set up instant responses and integrations with your CRM or email software.\n\n### Conclusion\nAn intake form is more than just a questionnaire, it's a powerful tool that improves your workflow, client interactions, and also make sures that you collect the right information from the start. \n\nWhether you're running a business, providing healthcare services, or managing legal cases, having an efficient intake process saves time, reduces errors, and improves the overall experience for both you and your clients.\n\n\n",1214,630,{"text":28},"4 min read",[30,48,174,220],{"title":31,"author":7,"authorImage":8,"authorProfile":9,"coverImg":32,"coverImgAlt":33,"createdAt":34,"description":35,"featured":14,"jsonld":36,"keywords":37,"metaDescription":38,"metaImage":39,"metaTitle":40,"publishedAt":41,"slug":42,"updatedAt":43,"__hash__":44,"body":45,"id":46,"coverImgWidth":25,"coverImgHeight":26,"readingStats":47},"How to Create a Google Form With ChatGPT or Gemini","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002Fa_blog_post_cover_about_how_to_create_a_google_form_with_chatgpt_058bfef75b.png","a blog post cover about how to create a google form with chatgpt","2025-05-16T00:33:52.544Z","Create Google Forms with ChatGPT or Gemini in minutes. Use AI to write questions, build forms, and streamline your form creation process.\n\n",[],"how to create a google form with chatgpt,\nhow to create a form with chatgpt,\nhow to create a google form,\nai form builder,","Learn how to create a detailed Google Form using ChatGPT or Gemini. Follow these steps to generate forms faster without the manual work.",[],"How to Create a Google Form With ChatGPT","2025-05-16T00:34:01.177Z","how-to-create-google-form-using-chatgpt","2025-11-12T04:37:54.712Z","NBaID0MkEdtq_2RrYiwlSx4H1XSEX3HUyDT7j05uXsI","\u003Ciframe width=\"100%\" height=\"315\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FYT1_T-ZX8aw?si=Q44OlsQ8zH0zovLh\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\u003C\u002Fiframe>\n\nCreating a form from scratch can feel like a lot of work. But with tools like **[ChatGPT](https:\u002F\u002Fchatgpt.com\u002F)**, you can make that process much easier and faster. \n\nInstead of spending time thinking about questions, designing the form, and figuring out how to set it up, you can ask ChatGPT to help with most of it.\n\n**In this guide, you’ll learn how to:**\n- Ask ChatGPT to build your form\n\n- Turn that form into a working Google Form\n\n- Customize and publish it\n\n- And finally, discover a much easier way to create forms using **[Formester](\u002F)**\n\nLet’s get started.\n\n## Step 1: Ask ChatGPT to Create a Form\nThe first step is to tell ChatGPT what kind of form you want.\n\nYou can use a simple sentence like:\n “**Create a feedback form for a product launch**”\n or\n\n“**Make a job application form for a small business**”\n\nChatGPT will give you a list of questions, field types, and a title. It might include short answer questions, multiple choice, checkboxes, and more. This helps you skip the blank page and gives you a ready-to-use structure.\n\n### Step 2: Convert the Form Into a Google Apps Script\nOnce ChatGPT gives you the questions, ask it to turn that into a script that Google can use to create a form.\n\n**Try asking:**\n “**Turn this into a Google Apps Script that creates a Google Form**”\n \nChatGPT will give you a block of code. That code tells Google exactly how to build your form.\n\nHere is a basic example:\n```\nfunction createForm() {\n  var form = FormApp.create('Product Feedback Form');\n  form.addTextItem().setTitle('What did you like most about the product?');\n  form.addMultipleChoiceItem()\n      .setTitle('Would you recommend this product to others?')\n      .setChoiceValues(['Yes', 'No']);\n}\n```\nThis script will create a new Google Form with your questions already inside.\n\n### Step 3: Use the Script to Build the Form\nNow, you need to run this script to turn it into a real Google Form.\n\nHere is what you do:\n- Go to **[Google Apps Script](https:\u002F\u002Fscript.google.com\u002F)**\n\n- Start a new project\n\n- Copy and paste the code from ChatGPT into the editor\n\n- Click **Save** and then **Run** to execute the script.\n- \nThe first time you run the script, Google might ask for permission. After you allow it, your form will be created in your Google Drive.\n\n### Step 4: Customize and Share the Form\nAfter the form is created, open it from your Google Drive.\nYou can now:\n\n- **Change the look:** Pick colors, add your logo, or update the form title\n\n- **Adjust settings:** Decide if users can edit responses, receive confirmation messages, or need to sign in\n\n- **Publish and share:** Copy the form link and send it to people through email or post it on your website\n\n- **Collect responses:** See replies inside the form or send them to a **[connected Google Sheet](\u002Fblog\u002Fhow-to-link-google-sheets-to-google-forms\u002F)**\n\nYou now have a working form built with ChatGPT and Google!\n\nBut here’s the thing, it still takes a bit of effort, especially if you are not used to code or scripts. So what if there was a simpler way?\n\n### A Much Easier Way to Build Forms: Try Formester\nIf you want to build forms the fastest way, **[Formester’s AI Form Generator](\u002Fai-form-generator\u002F)** is your best option.\n\nWith Formester, you do not need to write code, use scripts, or open extra tools. You just type what you need, and the form is created for you. \n\nIt is simple, fast, and made for people who want results without spending hours building forms.\n\nThe best part? You can create powerful forms using Formester's AI. It understands what you need and builds a form with advanced fields like:\n- E-signature\n\n- File uploads\n\n- Logic rules\n\n- Calculations\n\n- Custom thank-you pages\n\n- And much more\n\nMost other form builders charge for these **features**. But with **Formester**, many of them are completely free.\n\nSo if you want a better way to create forms whether for a business, event, survey, or anything else Formester saves you time and gives you more tools to work with.\n\n### Final Thoughts\nChatGPT can help you create a Google Form by giving you the content and even helping you write the code to build it. \n\nThis is a smart way to save time and avoid starting from scratch. But it still takes a few extra steps and some basic tech skills.\n\nIf you want the easiest way to create forms, use **[Formester](\u002F)**. It handles everything for you. Just describe the form you want, and it’s ready to go. No scripts. No setup. Just results.\n\n**[Try it free today](https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up)** and see how simple form building can be.\n","blog\u002Fblog\u002Fhow-to-create-google-form-using-chatgpt.md",{"text":28},{"title":49,"author":7,"authorImage":8,"authorProfile":9,"coverImg":50,"coverImgAlt":51,"createdAt":52,"description":53,"featured":14,"jsonld":54,"keywords":164,"metaDescription":66,"metaImage":165,"metaTitle":60,"publishedAt":166,"slug":167,"updatedAt":168,"__hash__":169,"body":170,"id":171,"coverImgWidth":25,"coverImgHeight":26,"readingStats":172},"How to Create a Questionnaire in Google Forms (Easy Steps!)","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002Fa_blog_post_cover_about_how_to_make_a_questionnaire_in_google_forms_4b287a221d.png","a blog post cover about how to make a questionnaire in google forms","2025-05-19T02:55:15.358Z","Create a professional questionnaire in Google Forms easily! Follow simple steps to build, customize, and share surveys for feedback, research, or quizzes.\n\n\nStep-by-step guide to building a questionnaire in Google Forms with screenshots and a video walkthrough. Plus a clear questionnaire vs survey vs form comparison, and when Formester is the better choice.\n",[55],{"@graph":56,"@context":163},[57,69,84,90,124,159],{"@id":58,"url":59,"name":60,"@type":61,"headline":49,"isPartOf":62,"breadcrumb":64,"description":66,"dateModified":67,"datePublished":68},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms\u002F#webpage","https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms\u002F","How to Create a Questionnaire in Google Forms in 2026 (Step-by-Step Guide)","WebPage",{"@id":63},"https:\u002F\u002Fformester.com\u002F#organization",{"@id":65},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms\u002F#breadcrumb","Step-by-step guide to building a questionnaire in Google Forms with screenshots and a video walkthrough. Plus a clear questionnaire vs survey vs form comparison, and when Formester is the better choice.","2026-05-14","2026-01-25",{"@id":65,"@type":70,"itemListElement":71},"BreadcrumbList",[72,77,81],{"item":73,"name":74,"@type":75,"position":76},"https:\u002F\u002Fformester.com\u002F","Home","ListItem",1,{"item":78,"name":79,"@type":75,"position":80},"https:\u002F\u002Fformester.com\u002Fblog\u002F","Blog",2,{"item":59,"name":82,"@type":75,"position":83},"How to Make a Questionnaire in Google Forms",3,{"@id":85,"@type":86,"author":87,"headline":49,"publisher":88,"description":66,"dateModified":67,"datePublished":68,"mainEntityOfPage":89},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms\u002F#article","BlogPosting",{"@id":63},{"@id":63},{"@id":58},{"@id":91,"@type":92,"mainEntity":93},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms\u002F#faq","FAQPage",[94,100,104,108,112,116,120],{"name":95,"@type":96,"acceptedAnswer":97},"Is Google Forms a questionnaire or a survey?","Question",{"text":98,"@type":99},"Google Forms is a generic form builder. You can build a questionnaire, a survey, a quiz, an RSVP, or a job application inside it. The naming is about the container, not the use case. The three-column matrix above explains where each one diverges.","Answer",{"name":101,"@type":96,"acceptedAnswer":102},"How do I create a Google Form questionnaire for free?",{"text":103,"@type":99},"Go to forms.google.com, click “Blank,” add your questions using the “+” toolbar, configure the settings, and hit “Send.” It’s free on any Google account. The 6-step walkthrough above covers the configuration details.",{"name":105,"@type":96,"acceptedAnswer":106},"What’s the difference between a questionnaire and a survey?",{"text":107,"@type":99},"A questionnaire is a fixed set of structured questions. A survey is a research method that uses questionnaires plus sampling, randomisation, and statistical analysis. All surveys use questionnaires; not all questionnaires are surveys.",{"name":109,"@type":96,"acceptedAnswer":110},"Does Google Forms have a questionnaire template?",{"text":111,"@type":99},"Yes, several. Open the Google Forms template gallery and scroll to “Education” or “Personal” for the closest fits. They’re dated and visually generic; most users start from “Blank” and write their own questions.",{"name":113,"@type":96,"acceptedAnswer":114},"Can I make a Google Form questionnaire anonymous?",{"text":115,"@type":99},"Partially. You can turn off “Collect email addresses” in the settings, which removes the most obvious identifier. Google Forms still tracks Google account IDs in the background if you require sign-in, which is the only way to limit one response per person. For true anonymity with dedupe, use a tool like \u003Ca href=\"https:\u002F\u002Fformester.com\u002Fquestionnaire-maker\u002F\">Formester\u003C\u002Fa> that ships an anonymous-mode toggle.",{"name":117,"@type":96,"acceptedAnswer":118},"How do I share a Google Form questionnaire with my team?",{"text":119,"@type":99},"Hit “Send” in the top-right and pick a sharing method: email (Google sends it directly), link (copy and paste anywhere), or embed (paste the HTML snippet into your intranet or Notion page). The link works in Slack, Teams, WhatsApp, or any chat tool.",{"name":121,"@type":96,"acceptedAnswer":122},"How long should a questionnaire be?",{"text":123,"@type":99},"5 to 12 questions for a customer satisfaction or feedback questionnaire. Up to 20 for an academic or research questionnaire. Past 20, response rates drop sharply. Split anything longer into multiple sections so respondents see a progress bar.",{"@id":125,"name":49,"step":126,"@type":158},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms\u002F#howto",[127,130,132,134,137,140,143,146,149,152,155],{"name":128,"@type":129,"position":76},"What Is a Questionnaire?","HowToStep",{"name":131,"@type":129,"position":80},"When to Use a Questionnaire?",{"name":133,"@type":129,"position":83},"Questionnaire vs survey vs form: which one do you actually need?",{"name":135,"@type":129,"position":136},"Questionnaire, survey, or form. Pick the right one.",4,{"name":138,"@type":129,"position":139},"How to create a questionnaire in Google Forms in 6 steps",5,{"name":141,"@type":129,"position":142},"Google Forms features that matter for questionnaires",6,{"name":144,"@type":129,"position":145},"When Formester is the better choice for a questionnaire",7,{"name":147,"@type":129,"position":148},"Google Forms questionnaire FAQ",8,{"name":150,"@type":129,"position":151},"More from Formester for questionnaires and surveys",9,{"name":153,"@type":129,"position":154},"Related Blogs",10,{"name":156,"@type":129,"position":157},"Ready to build your perfect form?",11,"HowTo",{"@id":160,"name":49,"@type":161,"embedUrl":162,"uploadDate":68},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms\u002F#video","VideoObject","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FwaTsMCMnDzY","https:\u002F\u002Fschema.org","how to create a questionnaire in google forms,\nhow to make a questionnaire in google forms,\nhow to create a survey in google forms,",[],"2026-06-04T14:27:46.055Z","how-to-make-a-questionnaire-in-google-forms","2026-06-04T14:27:46.059Z","vWhlChXtkA8Lai9kKIYTUrnGXo75naw3lKqPDsgtsls","Google Forms is the most-used free questionnaire tool in the world, with [over 50 million users on Google Workspace](https:\u002F\u002Fworkspace.google.com\u002Fproducts\u002Fforms\u002F) building everything from one-off feedback polls to multi-page academic surveys. \n\nThe basic setup takes under five minutes; the parts people get wrong are choosing the right question types, configuring response validation, and deciding whether they actually need a questionnaire or a survey (those words don't mean the same thing).\n\nThis guide covers all three, with screenshots and a short video walkthrough. At the bottom, there's a comparison of when Google Forms is the right call and when a dedicated questionnaire builder like [Formester's questionnaire maker](\u002Fquestionnaire-maker\u002F) saves more time.\n\nIf the questionnaire is straightforward and you'd rather skip the field-by-field build, Formester's [AI form generator](\u002Fai-form-generator\u002F) turns a plain-English description into a live questionnaire in under 30 seconds, ready to share.\n\nLooking for a quick single-question poll instead of a full questionnaire? Here's [how to make a poll on Google Forms](\u002Fblog\u002Fhow-to-make-a-poll-on-google-forms\u002F) in 6 steps, including the 5 poll types and when to switch to a dedicated poll maker.\n\nIf you're collecting signups (event RSVPs, volunteer slots, class rosters) instead of a questionnaire, check out [how to create a sign up sheet in Google Forms](\u002Fblog\u002Fhow-to-create-signup-sheets-in-google-forms\u002F) with 8 steps and the capacity-limit workarounds.\n\n## What Is a Questionnaire?\nA **[questionnaire](\u002Ftemplates\u002Fcategories\u002Fquestionnaire\u002F)** is a set of questions that helps you collect information from people. It could be about their opinions, feedback, habits, or anything else you want to know.\n\nThink of it like a survey. People fill out their answers, and you use those responses to make decisions, learn something new, or solve a problem.\n\n## When to Use a Questionnaire?\nUse a questionnaire when you need structured, comparable data from a fixed set of respondents: customer satisfaction, employee engagement, academic research, intake forms, or pre-event preference collection. \n\nUse a survey when the result has to generalize to a population (and you care about statistical confidence). Use a generic form when the input is unique per respondent and you don't need to compare answers side by side (a job application, an event signup, a payment).\n\nIf you're not sure which one fits, the three-column comparison block earlier in this guide should clear it up in under 60 seconds.\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-gfq-vs a { text-decoration: none !important; }\n@import url('https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@300;400;500;600;700&display=swap');\n.fmstr-cmp-gfq-vs {\n--c-bg: #fafafb; --c-card: #ffffff;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff; --c-row: #ffffff; --c-row-alt: #fafafb;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-600: #6941c6; --c-violet-500: #7f56d9;\n--c-amber-50: #fef3c7; --c-amber-700: #b45309;\n--c-border: #eaecf0;\n--c-shadow: 0 4px 20px rgba(16,24,40,.06);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: 'Inter', ui-sans-serif, system-ui, sans-serif;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-gfq-vs *, .fmstr-cmp-gfq-vs *::before, .fmstr-cmp-gfq-vs *::after { box-sizing: border-box; }\n.fmstr-cmp-gfq-vs__container { max-width: 1180px; margin: 0 auto; }\n.fmstr-cmp-gfq-vs__h3 { font-size: 22px; font-weight: 600; line-height: 1.2; letter-spacing: -.01em; margin: 0 0 18px; color: var(--c-fg-1); }\n.fmstr-cmp-gfq-vs__card { background: var(--c-card); border: 1px solid var(--c-border); border-radius: 20px; overflow: hidden; box-shadow: var(--c-shadow); }\n.fmstr-cmp-gfq-vs__table { width: 100%; border-collapse: collapse; font-size: 14.5px; }\n.fmstr-cmp-gfq-vs__table th, .fmstr-cmp-gfq-vs__table td { padding: 14px 16px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--c-border); }\n.fmstr-cmp-gfq-vs__table thead th:first-child { background: var(--c-amber-50); color: var(--c-amber-700); }\n.fmstr-cmp-gfq-vs__table thead th:nth-child(2) { background: var(--c-amber-50); color: var(--c-amber-700); }\n.fmstr-cmp-gfq-vs__table thead th:last-child { background: var(--c-tint); color: var(--c-violet-600); }\n.fmstr-cmp-gfq-vs__table thead th { font-weight: 700; font-size: 13.5px; text-transform: uppercase; letter-spacing: .04em; }\n.fmstr-cmp-gfq-vs__table tbody th { font-weight: 600; color: var(--c-fg-1); background: var(--c-row-alt); width: 26%; }\n.fmstr-cmp-gfq-vs__table tbody td { color: var(--c-fg-2); }\n.fmstr-cmp-gfq-vs__table tbody tr:last-child th, .fmstr-cmp-gfq-vs__table tbody tr:last-child td { border-bottom: 0; }\n.fmstr-cmp-gfq-vs__table a { color: var(--c-violet-600) !important; text-decoration: none !important; }\n.fmstr-cmp-gfq-vs__table a:hover { text-decoration: underline !important; }\n.fmstr-cmp-gfq-vs__close { margin-top: 18px; font-size: 15px; color: var(--c-fg-3); line-height: 1.6; max-width: 880px; }\n\n@media (max-width: 760px) {\n.fmstr-cmp-gfq-vs { padding: 40px 16px; }\n.fmstr-cmp-gfq-vs__h3 { font-size: 19px; line-height: 1.25; }\n.fmstr-cmp-gfq-vs__close { font-size: 14.5px; }\n.fmstr-cmp-gfq-vs__table thead { display: none; }\n.fmstr-cmp-gfq-vs__table tbody th { width: 100%; display: block; background: var(--c-tint); }\n.fmstr-cmp-gfq-vs__table tbody td { display: block; }\n.fmstr-cmp-gfq-vs__table tbody td::before { content: attr(data-h) \": \"; font-weight: 600; color: var(--c-fg-1); }\n.fmstr-cmp-gfq-vs__table th, .fmstr-cmp-gfq-vs__table td { padding: 12px 14px; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-gfq-vs\" aria-labelledby=\"fmstr-cmp-gfq-vs-h3\">\n\u003Cdiv class=\"fmstr-cmp-gfq-vs__container\">\n\u003Ch3 class=\"fmstr-cmp-gfq-vs__h3\" id=\"fmstr-cmp-gfq-vs-h3\">Google Forms vs Formester for questionnaires\u003C\u002Fh3>\n\u003Cdiv class=\"fmstr-cmp-gfq-vs__card\">\n\u003Ctable class=\"fmstr-cmp-gfq-vs__table\">\n\u003Cthead>\n\u003Ctr>\u003Cth>Dimension\u003C\u002Fth>\u003Cth>Google Forms\u003C\u002Fth>\u003Cth>Formester\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Cth>Anonymous mode\u003C\u002Fth>\u003Ctd data-h=\"Google Forms\">Trade-off: collect emails or be truly anonymous\u003C\u002Ftd>\u003Ctd data-h=\"Formester\">Native toggle, dedupe without identifying data\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Conditional logic\u003C\u002Fth>\u003Ctd data-h=\"Google Forms\">Section-level branching only\u003C\u002Ftd>\u003Ctd data-h=\"Formester\">\u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fconditional-logic\u002F\">Per-question conditional logic\u003C\u002Fa>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Branding\u003C\u002Fth>\u003Ctd data-h=\"Google Forms\">Header image + colour\u003C\u002Ftd>\u003Ctd data-h=\"Formester\">Full \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fbranding-kit\u002F\">branding kit\u003C\u002Fa>: fonts, buttons, custom domain\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Response routing\u003C\u002Fth>\u003Ctd data-h=\"Google Forms\">One owner email\u003C\u002Ftd>\u003Ctd data-h=\"Formester\">Multiple recipients + Slack \u002F Teams \u002F Zapier\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Payments inside questionnaire\u003C\u002Fth>\u003Ctd data-h=\"Google Forms\">Not supported\u003C\u002Ftd>\u003Ctd data-h=\"Formester\">\u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fonline-payments\u002F\">Native payments\u003C\u002Fa>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>File upload\u003C\u002Fth>\u003Ctd data-h=\"Google Forms\">Requires respondents to sign in to Google\u003C\u002Ftd>\u003Ctd data-h=\"Formester\">No sign-in required\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Free plan response cap\u003C\u002Fth>\u003Ctd data-h=\"Google Forms\">Unlimited\u003C\u002Ftd>\u003Ctd data-h=\"Formester\">Generous free tier; verify the current cap on the pricing page\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp class=\"fmstr-cmp-gfq-vs__close\">If none of these trade-offs matter for your questionnaire, Google Forms is fine. If two or more apply, the 10-minute switch pays back inside the first survey cycle.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\nBasically, if you need honest answers from a group of people, a questionnaire is the tool to use.\n\n## Questionnaire vs survey vs form: which one do you actually need?\nA questionnaire is a set of fixed questions designed to collect specific information. A survey is a research method that uses questionnaires (and sometimes interviews and observation) to study a population. A form is a generic container for any data input, from a job application to an event RSVP. People use the words interchangeably; Google does too, which is why Google Forms is named for the container, not the use case.\nThe distinction matters because each one has different best practices:\nA questionnaire wants question consistency, short response options, and a defined scoring or coding rubric.\nA survey wants statistical rigor (sample size, randomisation, weighting) and bias-aware question wording.\nA form wants UX simplicity, clear field validation, and a low completion threshold.\n\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-gfq-mtx a { text-decoration: none !important; }\n@import url('https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@300;400;500;600;700&display=swap');\n.fmstr-cmp-gfq-mtx {\n--c-bg: #ffffff; --c-card: #ffffff;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff; --c-row: #fafafb;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-600: #6941c6;\n--c-border: #eaecf0;\n--c-shadow: 0 4px 20px rgba(16,24,40,.06);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: 'Inter', ui-sans-serif, system-ui, sans-serif;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-gfq-mtx *, .fmstr-cmp-gfq-mtx *::before, .fmstr-cmp-gfq-mtx *::after { box-sizing: border-box; }\n.fmstr-cmp-gfq-mtx__container { max-width: 1180px; margin: 0 auto; }\n.fmstr-cmp-gfq-mtx__eyebrow {\ndisplay: inline-block; padding: 5px 12px; border-radius: 9999px;\nbackground: var(--c-tint); color: var(--c-violet-600);\nfont-size: 12px; font-weight: 600; letter-spacing: .04em;\ntext-transform: uppercase; border: 1px solid var(--c-edge); margin: 0 0 14px;\n}\n.fmstr-cmp-gfq-mtx__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; }\n.fmstr-cmp-gfq-mtx__intro { color: var(--c-fg-3); font-size: 17px; line-height: 1.6; max-width: 820px; margin: 14px auto 28px; }\n.fmstr-cmp-gfq-mtx__card { background: var(--c-card); border: 1px solid var(--c-border); border-radius: 20px; overflow: hidden; box-shadow: var(--c-shadow); }\n.fmstr-cmp-gfq-mtx__table { width: 100%; border-collapse: collapse; font-size: 14.5px; }\n.fmstr-cmp-gfq-mtx__table th, .fmstr-cmp-gfq-mtx__table td { padding: 14px 16px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--c-border); }\n.fmstr-cmp-gfq-mtx__table thead th { background: var(--c-tint); color: var(--c-violet-600); font-weight: 700; font-size: 13.5px; text-transform: uppercase; letter-spacing: .04em; }\n.fmstr-cmp-gfq-mtx__table tbody th { font-weight: 600; color: var(--c-fg-1); background: var(--c-row); width: 22%; }\n.fmstr-cmp-gfq-mtx__table tbody td { color: var(--c-fg-2); }\n.fmstr-cmp-gfq-mtx__table tbody tr:last-child th, .fmstr-cmp-gfq-mtx__table tbody tr:last-child td { border-bottom: 0; }\n.fmstr-cmp-gfq-mtx__close { margin-top: 20px; font-size: 15px; color: var(--c-fg-3); line-height: 1.6; max-width: 880px; }\n\n@media (max-width: 760px) {\n.fmstr-cmp-gfq-mtx { padding: 40px 16px; }\n.fmstr-cmp-gfq-mtx__intro { font-size: 15.5px; }\n.fmstr-cmp-gfq-mtx__close { font-size: 14.5px; }\n.fmstr-cmp-gfq-mtx__table thead { display: none; }\n.fmstr-cmp-gfq-mtx__table tbody th { width: 100%; display: block; background: var(--c-tint); }\n.fmstr-cmp-gfq-mtx__table tbody td { display: block; }\n.fmstr-cmp-gfq-mtx__table tbody td::before { content: attr(data-h) \": \"; font-weight: 600; color: var(--c-fg-1); }\n.fmstr-cmp-gfq-mtx__table th, .fmstr-cmp-gfq-mtx__table td { padding: 12px 14px; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-gfq-mtx\" aria-labelledby=\"fmstr-cmp-gfq-mtx-h2\">\n\u003Cdiv class=\"fmstr-cmp-gfq-mtx__container\">\n\u003Cspan class=\"fmstr-cmp-gfq-mtx__eyebrow\">Definitions that actually help\u003C\u002Fspan>\n\u003Ch2 class=\"fmstr-cmp-gfq-mtx__h2\" id=\"fmstr-cmp-gfq-mtx-h2\">Questionnaire, survey, or form. Pick the right one.\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-gfq-mtx__intro\">Each one has a different best-practice setup in Google Forms. The table below shows where they diverge.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-gfq-mtx__card\">\n\u003Ctable class=\"fmstr-cmp-gfq-mtx__table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Dimension\u003C\u002Fth>\n\u003Cth>Questionnaire\u003C\u002Fth>\n\u003Cth>Survey\u003C\u002Fth>\n\u003Cth>Form\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Cth>Purpose\u003C\u002Fth>\u003Ctd data-h=\"Questionnaire\">Collect structured, comparable answers\u003C\u002Ftd>\u003Ctd data-h=\"Survey\">Study a population with statistical rigor\u003C\u002Ftd>\u003Ctd data-h=\"Form\">Capture per-respondent input\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Best for\u003C\u002Fth>\u003Ctd data-h=\"Questionnaire\">Customer satisfaction, intake, academic research\u003C\u002Ftd>\u003Ctd data-h=\"Survey\">Market research, opinion polling\u003C\u002Ftd>\u003Ctd data-h=\"Form\">Job application, RSVP, payment\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Question style\u003C\u002Fth>\u003Ctd data-h=\"Questionnaire\">Fixed, often closed-ended\u003C\u002Ftd>\u003Ctd data-h=\"Survey\">Mix of closed and open, randomised\u003C\u002Ftd>\u003Ctd data-h=\"Form\">Whatever the use case demands\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Anonymity\u003C\u002Fth>\u003Ctd data-h=\"Questionnaire\">Often required\u003C\u002Ftd>\u003Ctd data-h=\"Survey\">Required for representative results\u003C\u002Ftd>\u003Ctd data-h=\"Form\">Usually identified\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Length\u003C\u002Fth>\u003Ctd data-h=\"Questionnaire\">5 to 20 questions\u003C\u002Ftd>\u003Ctd data-h=\"Survey\">10 to 40 questions\u003C\u002Ftd>\u003Ctd data-h=\"Form\">3 to 12 fields\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Right Google Forms setup\u003C\u002Fth>\u003Ctd data-h=\"Questionnaire\">Quiz mode off, section branching on\u003C\u002Ftd>\u003Ctd data-h=\"Survey\">Section branching + linear scale + response validation\u003C\u002Ftd>\u003Ctd data-h=\"Form\">Short answer + required validation\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>When to use Formester instead\u003C\u002Fth>\u003Ctd data-h=\"Questionnaire\">Anonymous mode + custom branding\u003C\u002Ftd>\u003Ctd data-h=\"Survey\">Conditional logic + advanced analytics\u003C\u002Ftd>\u003Ctd data-h=\"Form\">Payments + e-signature + file upload without Google sign-in\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp class=\"fmstr-cmp-gfq-mtx__close\">A teacher gathering exam feedback uses a questionnaire. A marketing team studying brand awareness across 1,000 buyers uses a survey. A team running a holiday party RSVP uses a form. All three can technically be built in Google Forms, but the setup is different.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n## How to create a questionnaire in Google Forms in 6 steps\nGoogle Forms is free, easy to use, and great for basic questionnaires. Here’s how to create one step by step:\n\nThe video below walks through the full flow in 90 seconds. Below it are the steps written out, with the configuration details Google's own help docs skip.\n\n\u003Ciframe width=\"100%\" height=\"315\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FwaTsMCMnDzY?si=zNAdLYPVcr_WZON0\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\u003C\u002Fiframe>\n\n\n1. **Open Google Forms.** Go to [forms.google.com](https:\u002F\u002Fforms.google.com) or hit the \"+\" in your Google Drive. Pick the \"Blank\" template; the pre-made templates are dated and most readers customise heavily anyway.\n2. **Name the questionnaire.** Top-left, click the \"Untitled form\" title. Give it a name and a short description. The description shows above question 1 to every respondent.\n3. **Add your first question.** Hit the \"+\" on the side toolbar to add a question. Pick the question type from the dropdown: multiple choice for one answer, checkboxes for multi-select, short answer for free text, paragraph for longer free text, linear scale for a 1-5 or 1-10 rating, multiple choice grid for matrix-style questions, date or time for scheduling. Each type has a different default validation; pick the one that matches your data.\n4. **Turn on required validation where it matters.** For each question, toggle the \"Required\" switch in the bottom-right. Don't make every question required; response rates fall steeply past four required questions in a row.\n5. **Add sections to break up long questionnaires.** Hit the \"Add section\" icon (the equals-sign icon on the right toolbar). Sections render as separate pages; respondents see a progress bar. Anything longer than 12 questions should be split into 2-3 sections.\n6. **Set up the settings.** Click the gear icon in the top-right. Under \"Responses,\" decide whether to collect email addresses, allow editing after submission, and limit to one response per Google account. Under \"Presentation,\" pick whether to shuffle question order and whether to show a progress bar.\n\nOnce you're done, hit \"Send\" (top-right) to share via email, link, or embed. Responses pile up in the \"Responses\" tab; export to Google Sheets when you're ready to analyse.\n\n\n## Google Forms features that matter for questionnaires\nGoogle Forms comes with a few handy tools that make your questionnaire more useful:\n\n**Section branching.** Under each section's settings, you can choose \"Go to section based on answer\" to route respondents based on a previous answer. Use this for skip logic in research questionnaires.\n- **Response validation.** Per-question, you can require an answer to match a pattern (a phone number, an email, a number range, a regex). Catches data-entry mistakes at submission, not in your analysis.\n- **Linked spreadsheet.** In the \"Responses\" tab, hit the Google Sheets icon to dump every submission into a live spreadsheet. Sort, filter, pivot from there.\n- **Quiz mode.** Under \"Settings,\" toggle \"Make this a quiz\" to enable per-question scoring, answer keys, and auto-graded results. Useful for academic questionnaires that double as knowledge checks.\n- **Templates.** The questionnaire templates are dated and visually generic, but they save time on the structure. Always rewrite the questions; never ship the default.\n\nFor features Google Forms doesn't have (anonymous responses without disabling email collection, conditional logic across sections, custom branding beyond a logo, response notifications to multiple emails, e-signature, payment collection), a dedicated tool like [Formester's questionnaire maker](\u002Fquestionnaire-maker\u002F) covers them in one workflow.\n\n## When Formester is the better choice for a questionnaire\nFormester is a [free online form and questionnaire builder](\u002Fquestionnaire-maker\u002F) used by 56,000+ teachers, HR teams, and researchers. The cases where it beats Google Forms for questionnaires are specific and worth naming.\n\n- **You need anonymous responses without disabling email collection.** Google Forms forces a tradeoff: collect emails (kills anonymity) or don't (lose the ability to dedupe). Formester ships an anonymous-mode toggle that dedupes without collecting identifying data.\n- **You need conditional logic across sections.** Google Forms' branching is per-section. Formester's [conditional logic](\u002Ffeatures\u002Fconditional-logic\u002F) routes per-question and can branch on any prior answer.\n- **You need custom branding beyond a logo.** Google Forms gives you a header image and a colour. Formester's [branding kit](\u002Ffeatures\u002Fbranding-kit\u002F) controls fonts, colours, button styles, submit-page copy, and custom domains.\n- **You need response notifications to multiple emails or Slack\u002FTeams.** Google Forms emails the form owner; Formester routes to any number of recipients and integrates with Slack, Teams, and Zapier.\n- **You're collecting payment alongside the questionnaire.** Google Forms cannot. Formester [accepts payments](\u002Ffeatures\u002Fonline-payments\u002F) inside the same form.\n\nIf none of those apply, Google Forms is fine. If two or more apply, switching is worth a 10-minute setup.\n### How to build the same questionnaire in Formester in 90 seconds\n\n1. Open [questionnaire-maker](\u002Fquestionnaire-maker\u002F). Click \"Use template\" on the closest fit, or \"Start from scratch.\"\n2. Drag fields from the left rail. Same question types as Google Forms, plus rating scales, signatures, payments, and file uploads with no Google sign-in required.\n3. Set anonymous mode in the settings panel if needed.\n4. Hit \"Share.\" You get a link, an embed snippet, and a QR code by default.\n\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-gfq-faq a { text-decoration: none !important; }\n@import url('https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@300;400;500;600;700&display=swap');\n.fmstr-cmp-gfq-faq {\n--c-bg: #fafafb; --c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-600: #6941c6; --c-tint: #f7f3ff; --c-chip-bg: #f4f4f7;\n--c-border: #eaecf0; --c-shadow: 0 1px 3px rgba(16,24,40,.05);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: 'Inter', ui-sans-serif, system-ui, sans-serif;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-gfq-faq *, .fmstr-cmp-gfq-faq *::before, .fmstr-cmp-gfq-faq *::after { box-sizing: border-box; }\n.fmstr-cmp-gfq-faq__container { max-width: 820px; margin: 0 auto; }\n.fmstr-cmp-gfq-faq__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; text-align: center; margin: 0; }\n.fmstr-cmp-gfq-faq__intro { color: var(--c-fg-3); text-align: center; font-size: 17px; line-height: 1.6; margin: 14px auto 28px; }\n.fmstr-cmp-gfq-faq__list { display: flex; flex-direction: column; gap: 12px; }\n.fmstr-cmp-gfq-faq__item { background: var(--c-card); border: 1px solid var(--c-border); border-radius: 14px; box-shadow: var(--c-shadow); overflow: hidden; }\n.fmstr-cmp-gfq-faq__item > summary {\npadding: 18px 22px; cursor: pointer; font-weight: 600; font-size: 16.5px;\ncolor: var(--c-fg-1); display: flex; align-items: center; gap: 14px; list-style: none;\n}\n.fmstr-cmp-gfq-faq__item > summary::-webkit-details-marker { display: none; }\n.fmstr-cmp-gfq-faq__item > summary::before {\ncontent: \"\"; width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0;\nbackground-color: var(--c-chip-bg);\nbackground-image: url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' width='14' height='14' viewBox='0 0 14 14' fill='none' stroke='%2375747f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5l4 4 4-4'\u002F%3E%3C\u002Fsvg%3E\");\nbackground-repeat: no-repeat; background-position: center;\ntransition: transform .15s ease, background-color .15s ease;\n}\n.fmstr-cmp-gfq-faq__item[open] > summary::before { transform: rotate(180deg); background-color: var(--c-tint); }\n.fmstr-cmp-gfq-faq__item[open] > summary { color: var(--c-violet-600); }\n.fmstr-cmp-gfq-faq__answer { padding: 0 22px 22px 64px; color: var(--c-fg-2); font-size: 15.5px; line-height: 1.7; }\n.fmstr-cmp-gfq-faq__answer a { color: var(--c-violet-600) !important; text-decoration: none !important; }\n.fmstr-cmp-gfq-faq__answer a:hover { text-decoration: underline !important; }\n\n@media (max-width: 760px) {\n.fmstr-cmp-gfq-faq { padding: 40px 16px; }\n.fmstr-cmp-gfq-faq__intro { font-size: 15.5px; }\n.fmstr-cmp-gfq-faq__item > summary { padding: 16px 16px; font-size: 15.5px; gap: 12px; }\n.fmstr-cmp-gfq-faq__item > summary::before { width: 26px; height: 26px; }\n.fmstr-cmp-gfq-faq__answer { padding: 0 16px 18px 16px; font-size: 15px; line-height: 1.65; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-gfq-faq\" aria-labelledby=\"fmstr-cmp-gfq-faq-h2\">\n\u003Cdiv class=\"fmstr-cmp-gfq-faq__container\">\n\u003Ch2 class=\"fmstr-cmp-gfq-faq__h2\" id=\"fmstr-cmp-gfq-faq-h2\">Google Forms questionnaire FAQ\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-gfq-faq__intro\">Answers that mirror the FAQPage JSON-LD on the live page.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-gfq-faq__list\">\n\u003Cdetails class=\"fmstr-cmp-gfq-faq__item\">\u003Csummary>Is Google Forms a questionnaire or a survey?\u003C\u002Fsummary>\u003Cdiv class=\"fmstr-cmp-gfq-faq__answer\">Google Forms is a generic form builder. You can build a questionnaire, a survey, a quiz, an RSVP, or a job application inside it. The naming is about the container, not the use case. The three-column matrix above explains where each one diverges.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails class=\"fmstr-cmp-gfq-faq__item\">\u003Csummary>How do I create a Google Form questionnaire for free?\u003C\u002Fsummary>\u003Cdiv class=\"fmstr-cmp-gfq-faq__answer\">Go to forms.google.com, click &ldquo;Blank,&rdquo; add your questions using the &ldquo;+&rdquo; toolbar, configure the settings, and hit &ldquo;Send.&rdquo; It&rsquo;s free on any Google account. The 6-step walkthrough above covers the configuration details.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails class=\"fmstr-cmp-gfq-faq__item\">\u003Csummary>What&rsquo;s the difference between a questionnaire and a survey?\u003C\u002Fsummary>\u003Cdiv class=\"fmstr-cmp-gfq-faq__answer\">A questionnaire is a fixed set of structured questions. A survey is a research method that uses questionnaires plus sampling, randomisation, and statistical analysis. All surveys use questionnaires; not all questionnaires are surveys.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails class=\"fmstr-cmp-gfq-faq__item\">\u003Csummary>Does Google Forms have a questionnaire template?\u003C\u002Fsummary>\u003Cdiv class=\"fmstr-cmp-gfq-faq__answer\">Yes, several. Open the Google Forms template gallery and scroll to &ldquo;Education&rdquo; or &ldquo;Personal&rdquo; for the closest fits. They&rsquo;re dated and visually generic; most users start from &ldquo;Blank&rdquo; and write their own questions.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails class=\"fmstr-cmp-gfq-faq__item\">\u003Csummary>Can I make a Google Form questionnaire anonymous?\u003C\u002Fsummary>\u003Cdiv class=\"fmstr-cmp-gfq-faq__answer\">Partially. You can turn off &ldquo;Collect email addresses&rdquo; in the settings, which removes the most obvious identifier. Google Forms still tracks Google account IDs in the background if you require sign-in, which is the only way to limit one response per person. For true anonymity with dedupe, use a tool like \u003Ca href=\"https:\u002F\u002Fformester.com\u002Fquestionnaire-maker\u002F\">Formester\u003C\u002Fa> that ships an anonymous-mode toggle.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails class=\"fmstr-cmp-gfq-faq__item\">\u003Csummary>How do I share a Google Form questionnaire with my team?\u003C\u002Fsummary>\u003Cdiv class=\"fmstr-cmp-gfq-faq__answer\">Hit &ldquo;Send&rdquo; in the top-right and pick a sharing method: email (Google sends it directly), link (copy and paste anywhere), or embed (paste the HTML snippet into your intranet or Notion page). The link works in Slack, Teams, WhatsApp, or any chat tool.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails class=\"fmstr-cmp-gfq-faq__item\">\u003Csummary>How long should a questionnaire be?\u003C\u002Fsummary>\u003Cdiv class=\"fmstr-cmp-gfq-faq__answer\">5 to 12 questions for a customer satisfaction or feedback questionnaire. Up to 20 for an academic or research questionnaire. Past 20, response rates drop sharply. Split anything longer into multiple sections so respondents see a progress bar.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-gfq-rel a { text-decoration: none !important; }\n@import url('https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@300;400;500;600;700&display=swap');\n.fmstr-cmp-gfq-rel {\n--c-bg: #f4f4f7; --c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0; --c-shadow: 0 4px 20px rgba(16,24,40,.06);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: 'Inter', ui-sans-serif, system-ui, sans-serif;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-gfq-rel *, .fmstr-cmp-gfq-rel *::before, .fmstr-cmp-gfq-rel *::after { box-sizing: border-box; }\n.fmstr-cmp-gfq-rel__container { max-width: 1180px; margin: 0 auto; }\n.fmstr-cmp-gfq-rel__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; }\n.fmstr-cmp-gfq-rel__intro { color: var(--c-fg-3); font-size: 17px; line-height: 1.6; max-width: 780px; margin: 14px 0 28px; }\n.fmstr-cmp-gfq-rel__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n.fmstr-cmp-gfq-rel__card {\nbackground: var(--c-card); border: 1px solid var(--c-border); border-radius: 14px;\npadding: 18px 20px; display: flex; align-items: center; gap: 14px;\ntext-decoration: none !important; color: inherit !important; transition: all .15s ease;\n}\n.fmstr-cmp-gfq-rel__card:hover { border-color: var(--c-edge); box-shadow: var(--c-shadow); transform: translateY(-1px); }\n.fmstr-cmp-gfq-rel__icon { width: 40px; height: 40px; border-radius: 10px; background: var(--c-tint); display: grid; place-items: center; flex-shrink: 0; font-size: 18px; }\n.fmstr-cmp-gfq-rel__text { flex-grow: 1; }\n.fmstr-cmp-gfq-rel__text h4 { font-size: 14.5px; font-weight: 600; color: var(--c-fg-1); margin: 0; }\n.fmstr-cmp-gfq-rel__text small { font-size: 12.5px; color: var(--c-fg-3); display: block; margin-top: 2px; }\n.fmstr-cmp-gfq-rel__arrow { color: var(--c-violet-500); font-size: 18px; }\n\n@media (max-width: 880px) { .fmstr-cmp-gfq-rel__grid { grid-template-columns: 1fr 1fr; gap: 12px; } }\n@media (max-width: 760px) {\n.fmstr-cmp-gfq-rel { padding: 40px 16px; }\n.fmstr-cmp-gfq-rel__intro { font-size: 15.5px; }\n.fmstr-cmp-gfq-rel__card { padding: 16px; gap: 12px; }\n}\n@media (max-width: 540px) { .fmstr-cmp-gfq-rel__grid { grid-template-columns: 1fr; gap: 12px; } }\n\u003C\u002Fstyle>\n\n## Final Thoughts\n\nIf you want a quick and easy way to collect responses, Google Forms is a solid choice. But if you want more control over design, smarter features, and a faster setup, Formester is the better option.\n\nYou can build a professional-looking questionnaire in minutes. Use AI to save time. Add logic and branding to make it yours. And manage all your responses in one place.\n\nSo whether you’re gathering feedback, doing research, or just trying to understand your audience better , start with the right tool.\n\n**[Try Formester now](https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up)** and build smarter questionnaires in less time.\n\n\u003Csection class=\"fmstr-cmp-gfq-rel\" aria-labelledby=\"fmstr-cmp-gfq-rel-h2\">\n\u003Cdiv class=\"fmstr-cmp-gfq-rel__container\">\n\u003Ch2 class=\"fmstr-cmp-gfq-rel__h2\" id=\"fmstr-cmp-gfq-rel-h2\">More from Formester for questionnaires and surveys\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-gfq-rel__intro\">Tools and templates you can pair with this guide.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-gfq-rel__grid\">\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fquestionnaire-maker\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#128221;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Questionnaire Maker\u003C\u002Fh4>\u003Csmall>Formester product page\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fsurvey-vs-questionnaire\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#128203;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Survey vs Questionnaire\u003C\u002Fh4>\u003Csmall>Decision guide\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Ftemplates\u002Fcategories\u002Fquestionnaire\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#128218;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Questionnaire templates\u003C\u002Fh4>\u003Csmall>Browse the library\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fbest-google-forms-templates\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#11088;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Best Google Forms templates\u003C\u002Fh4>\u003Csmall>Comparison blog\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-create-a-google-form-with-photo-upload\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#128247;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Photo upload in Google Forms\u003C\u002Fh4>\u003Csmall>How-to blog\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-create-signup-sheets-in-google-forms\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#128197;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Signup sheets in Google Forms\u003C\u002Fh4>\u003Csmall>How-to blog\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fconditional-logic\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#128279;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Conditional logic\u003C\u002Fh4>\u003Csmall>Formester feature\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003Ca class=\"fmstr-cmp-gfq-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fbranding-kit\u002F\">\u003Cdiv class=\"fmstr-cmp-gfq-rel__icon\" aria-hidden=\"true\">&#127912;\u003C\u002Fdiv>\u003Cdiv class=\"fmstr-cmp-gfq-rel__text\">\u003Ch4>Branding kit\u003C\u002Fh4>\u003Csmall>Formester feature\u003C\u002Fsmall>\u003C\u002Fdiv>\u003Cspan class=\"fmstr-cmp-gfq-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n","blog\u002Fblog\u002Fhow-to-make-a-questionnaire-in-google-forms.md",{"text":173},"11 min read",{"title":175,"author":176,"authorImage":8,"authorProfile":177,"coverImg":178,"coverImgAlt":179,"createdAt":180,"description":181,"featured":14,"jsonld":182,"keywords":209,"metaDescription":210,"metaImage":211,"metaTitle":212,"publishedAt":180,"slug":213,"updatedAt":214,"__hash__":215,"body":216,"id":217,"coverImgWidth":218,"coverImgHeight":26,"readingStats":219},"How to Use Response Validation in Google Forms (With Examples)","Ankit Singhaniya","https:\u002F\u002Flinkedin.com\u002Fin\u002Fankitsinghaniyaz","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002F247119e8315acda1_response-validation-in-google-forms-cover.png","Google Forms question showing a response validation error message","2026-09-01T00:00:00.000Z","Set up response validation in Google Forms: number, text, length, and regex rules, copy-paste regex patterns for phone numbers and dates, checkbox limits, and what validation can't catch.",[183],{"@context":163,"@type":92,"mainEntity":184},[185,189,193,197,201,205],{"@type":96,"name":186,"acceptedAnswer":187},"How do I set up data validation in Google Forms?",{"@type":99,"text":188},"Data validation and response validation are the same feature in Google Forms. Click a short answer, paragraph, or checkbox question, open the three-dot menu in the bottom-right corner of the question, and choose Response validation. Then pick a rule type, set the condition, and write a custom error message.",{"@type":96,"name":190,"acceptedAnswer":191},"Can I add more than one validation rule to a question?",{"@type":99,"text":192},"No. Google Forms allows one validation rule per question. If you need two checks, like a minimum length and a specific format, either combine both conditions into one regular expression or split the input across two questions.",{"@type":96,"name":194,"acceptedAnswer":195},"Which question types support response validation?",{"@type":99,"text":196},"Three types get real validation rules: short answer, paragraph, and checkboxes. Short answer questions get number, text, length, and regular expression rules. Paragraph questions get length and regular expression only. Checkbox questions can only limit how many options a respondent selects, and grid questions only offer row and column limits.",{"@type":96,"name":198,"acceptedAnswer":199},"How do I validate an email address in Google Forms?",{"@type":99,"text":200},"Add a short answer question, open the three-dot menu, and choose Response validation. Set the first dropdown to Text and the second to Email address, then write an error message telling people to enter a valid email address. Google Forms then rejects any answer that doesn't follow the name@domain format.",{"@type":96,"name":202,"acceptedAnswer":203},"Can Google Forms verify that an email address actually exists?",{"@type":99,"text":204},"No. The built-in email rule checks formatting only, so typos like name@gmial.com and made-up addresses still pass. To confirm the inbox is real you need a tool that sends a verification code, like Formester's email verification field, or a third-party validation service connected through Zapier.",{"@type":96,"name":206,"acceptedAnswer":207},"How do I limit checkbox selections in Google Forms?",{"@type":99,"text":208},"Add a checkbox question, open the three-dot menu, and choose Response validation. Pick Select at least, Select at most, or Select exactly, then enter the number. Google Forms blocks submission until the respondent's selection count matches the rule.","google forms response validation, response validation google form, google forms email validation, data validation google forms, google form validation","Learn how to use response validation in Google Forms: number, text, length, and regex rules, with copy-paste examples and custom error messages.",[],"Response Validation in Google Forms: Setup + Examples","response-validation-in-google-forms","2026-09-01T18:00:00.000Z","ZrM58gDPUyBLphfUlZJOrhoJUPKyfdEUfUCPmv5UhT8","![Google Forms question showing a response validation error message](https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002F247119e8315acda1_response-validation-in-google-forms-cover.png)\n\nWhen you ask for a phone number or an email address, some answers come back as a name, or with a typo that makes your follow-up bounce. Once those responses are in a spreadsheet, the only fix is cleaning them up by hand.\n\nResponse validation in Google Forms lets you set a rule an answer must follow before the form can be submitted, so people fix bad answers while they're still filling the form. This guide shows you how to set up validation, what each of the four rule types does, and copy-paste regex patterns for common formats.\n\n\u003Cdiv class=\"tldr\">\n\u003Cp>Quick answer\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Click a \u003Cstrong>short answer\u003C\u002Fstrong>, \u003Cstrong>paragraph\u003C\u002Fstrong>, or \u003Cstrong>checkbox\u003C\u002Fstrong> question (the only three types that support validation).\u003C\u002Fli>\n\u003Cli>Open the \u003Cstrong>three-dot menu\u003C\u002Fstrong> in the bottom-right corner of the question and choose \u003Cstrong>Response validation\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Pick a rule type: \u003Cstrong>Number\u003C\u002Fstrong>, \u003Cstrong>Text\u003C\u002Fstrong>, \u003Cstrong>Length\u003C\u002Fstrong>, or \u003Cstrong>Regular expression\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Set the condition and write a \u003Cstrong>custom error message\u003C\u002Fstrong> that tells people how to fix their answer.\u003C\u002Fli>\n\u003Cli>Preview the form and test it with wrong answers before you share it.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\n## What is response validation in Google Forms?\n\nResponse validation is a rule you attach to a question. When an answer breaks the rule, Google Forms shows your error message in red under the question and blocks the submission until the answer is fixed. For example, if someone types an email address without an @, the form won't go through until they correct it.\n\nOne limit to know before you plan your form: full validation works on only three question types.\n\n- For short answer questions: you can use the full set of rules (number, text, length, and regex).\n- For paragraph questions: you can apply length and regex rules only.\n- For checkbox questions: you can only limit how many options someone selects.\n\nGrid questions get two narrow settings of their own (require a response in every row, limit to one response per column). Multiple choice and dropdown questions have no validation at all, because their answers are already restricted to the choices you provide.\n\n## How to add response validation in Google Forms\n\nThe setup takes under a minute per question:\n\n\u003Col class=\"steps\">\n\u003Cli>\n\u003Ch3>Pick a question\u003C\u002Fh3>\n\u003Cp>Go to \u003Cstrong>forms.google.com\u003C\u002Fstrong> and open the form you want to edit. Click the question you want to validate. Check that the question type is short answer, paragraph, or checkboxes, because dropdown and multiple choice questions don't show the validation option.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Ch3>Turn on response validation\u003C\u002Fh3>\n\u003Cp>Click the \u003Cstrong>three-dot menu\u003C\u002Fstrong> in the bottom-right corner of the question card, then choose \u003Cstrong>Response validation\u003C\u002Fstrong>. A new row of dropdowns appears under the answer field.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002F6bf87464570b63a8_response-validation-in-google-forms-1.webp\" alt=\"Google Forms question with the three-dot menu open and Response validation highlighted\">\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Ch3>Choose the rule\u003C\u002Fh3>\n\u003Cp>The first dropdown sets the rule category: \u003Cstrong>Number\u003C\u002Fstrong>, \u003Cstrong>Text\u003C\u002Fstrong>, \u003Cstrong>Length\u003C\u002Fstrong>, or \u003Cstrong>Regular expression\u003C\u002Fstrong>. The second dropdown sets the condition, like between, contains, or maximum character count. The field after it takes your value. For an age question, that's \u003Cstrong>Number\u003C\u002Fstrong>, then \u003Cstrong>Between\u003C\u002Fstrong>, then 18 and 100.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002Fd6997927783bf0ab_response-validation-in-google-forms-2.webp\" alt=\"Number validation configured in Google Forms requiring an answer between 18 and 100\">\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Ch3>Write a custom error message\u003C\u002Fh3>\n\u003Cp>The last field holds the text people see when their answer fails. Google's default error is vague, so say exactly what to do: enter a number between 18 and 100, or enter your work email address. A clear error message helps people fix their answer instead of abandoning the form.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Ch3>Preview and test the form\u003C\u002Fh3>\n\u003Cp>Click the \u003Cstrong>eye icon\u003C\u002Fstrong> at the top to open the preview. Submit a wrong answer on purpose and confirm the error appears, then submit a correct one and confirm it goes through. Test the edge cases too: spaces before an email address, a number written with a comma, an empty field. Testing now means you catch a broken rule before your respondents do.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002F1fdd7cf6aa9c553c_response-validation-in-google-forms-3.webp\" alt=\"Respondent view of a Google Form showing a red validation error message under an invalid answer\">\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\n\u003Cdiv class=\"note\">\u003Cp>Validation and the Required toggle work independently. A validated question that isn't required can simply be left blank, and the rule never runs. Mark the question required if the answer must be present and correct.\u003C\u002Fp>\u003C\u002Fdiv>\n\n## The 4 types of response validation (with examples)\n\nEach validation type works with a different kind of answer. Choose the one that fits the question you're asking.\n\n### Number validation\n\nNumber validation keeps answers numeric and inside a range you choose. The conditions are greater than, greater than or equal to, less than, less than or equal to, equal to, not equal to, between, not between, is number, and whole number.\n\nUse it when you're asking for a quantity, such as age, ticket count, hours worked, or a number-based rating. For example, if you're asking how many tickets someone needs, set the rule to between 1 and 10, and nobody can enter 1,000 by accident. Add the whole number condition too, or someone can RSVP for 2.5 people.\n\n### Text validation for email and URL\n\nText validation checks the format or content of an answer. You can check whether the answer contains specific text, doesn't contain specific text, or follows an email or URL format.\n\nThe email condition matters when you collect emails for follow-up. Select \u003Cstrong>Text\u003C\u002Fstrong> and then \u003Cstrong>Email address\u003C\u002Fstrong>, and Google Forms rejects entries that don't follow the name@domain shape, like an address missing the @ or ending in .con.\n\nThe URL condition works the same way for links. Use it when you ask for a portfolio, LinkedIn profile, or company website.\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002Fe8493815365a16cf_response-validation-in-google-forms-4.webp\" alt=\"Text validation set to Email address on a short answer question in Google Forms\">\u003C\u002Fp>\n\nThe contains and doesn't contain conditions handle formats specific to your business. For example, if every employee ID starts with ACM, a contains rule for ACM catches anyone who typed only the digits.\n\n### Length validation\n\nLength validation sets a minimum or maximum character count. It works on both short answer and paragraph questions.\n\nUse a minimum when you need more than a one-word answer, like requiring at least 50 characters for a feedback question. Use a maximum when the answer has a fixed limit, like a display name that must fit in 20 characters.\n\nYou don't need a minimum on every open question, though. If people add extra words just to meet the limit, you get longer answers without better feedback.\n\n### Regular expression validation\n\nRegular expression, or regex, validation checks an answer against a pattern you define. The conditions are contains, doesn't contain, matches, and doesn't match. Use it when the built-in options can't describe your format: phone numbers, PIN codes, dates, order IDs.\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002F529dc3be73ad1c71_response-validation-in-google-forms-5.webp\" alt=\"Regular expression validation in Google Forms with a phone number pattern entered\">\u003C\u002Fp>\n\nFor example, the phone pattern \u003Ccode>^\\d{3}-\\d{3}-\\d{4}$\u003C\u002Fcode> checks for three digits, a dash, three more digits, another dash, and four final digits. So 555-123-4567 passes and 5551234567 doesn't. You don't need to learn regex to use it; copy a pattern from the table below.\n\n## Copy-paste regex patterns for Google Forms\n\nFor each of these, set the validation to \u003Cstrong>Regular expression\u003C\u002Fstrong> and the condition to \u003Cstrong>Matches\u003C\u002Fstrong>, unless the row says otherwise. Paste the pattern as-is.\n\n\u003Cdiv class=\"table-wrap\">\n\u003Ctable>\n\u003Cthead>\u003Ctr>\u003Cth>What you want\u003C\u002Fth>\u003Cth>Pattern\u003C\u002Fth>\u003Cth>Passes\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>US phone (dashes)\u003C\u002Ftd>\u003Ctd>\u003Ccode>^\\d{3}-\\d{3}-\\d{4}$\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>555-123-4567\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>10-digit phone, digits only\u003C\u002Ftd>\u003Ctd>\u003Ccode>^\\d{10}$\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>5551234567\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Indian mobile number\u003C\u002Ftd>\u003Ctd>\u003Ccode>^[6-9]\\d{9}$\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>9812345678\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>US ZIP code\u003C\u002Ftd>\u003Ctd>\u003Ccode>^\\d{5}(-\\d{4})?$\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>12345 or 12345-6789\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Indian PIN code\u003C\u002Ftd>\u003Ctd>\u003Ccode>^[1-9]\\d{5}$\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>560001\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Date as MM\u002FDD\u002FYYYY\u003C\u002Ftd>\u003Ctd>\u003Ccode>^(0[1-9]|1[0-2])\u002F(0[1-9]|[12]\\d|3[01])\u002F\\d{4}$\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>03\u002F28\u002F2026\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Letters and spaces only (names)\u003C\u002Ftd>\u003Ctd>\u003Ccode>^[A-Za-z ]+$\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Priya Sharma\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Block links in answers\u003C\u002Ftd>\u003Ctd>\u003Ccode>https?:\u002F\u002F|www\\.\u003C\u002Fcode> with condition \u003Cstrong>Doesn't contain\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>any answer without a link\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\nAdjust the pieces to fit your format: change \u003Ccode>\\d{3}\u003C\u002Fcode> to \u003Ccode>\\d{4}\u003C\u002Fcode> for four digits, or swap the dash for a space. Google Forms uses RE2 regex syntax, which has no lookahead support, so very clever patterns from Stack Overflow may not work. The patterns above all do.\n\nThe blocked-links row solves a specific problem: spam bots paste URLs into open text fields. A doesn't-contain rule on your paragraph questions filters most of them without bothering real respondents. (Use doesn't contain, not doesn't match: the matches conditions test the whole answer against the pattern, so a spam message with extra words around the link would slip through.)\n\n## Limit how many checkboxes people can select\n\nCheckbox questions get their own validation. The conditions are \u003Cstrong>Select at least\u003C\u002Fstrong>, \u003Cstrong>Select at most\u003C\u002Fstrong>, and \u003Cstrong>Select exactly\u003C\u002Fstrong>, each with a number.\n\nUse it when you ask people to pick their top 3 and don't want more than three answers. Open the three-dot menu on a checkbox question, choose \u003Cstrong>Response validation\u003C\u002Fstrong>, pick the condition, and set the count. The error message field works the same as everywhere else.\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002F370b1e60b4162fdc_response-validation-in-google-forms-6.webp\" alt=\"Checkbox question in Google Forms with a Select at most 2 validation rule\">\u003C\u002Fp>\n\n## What response validation can't do\n\nValidation catches formatting problems, but there are checks it can't do:\n\n- **One rule per question.** You can't require both a minimum length and an email format on the same field. Combine the conditions into one regex, or split the question in two.\n\n- **The email check is format-only.** name@gmial.com passes, because it looks like an email. A fake address someone invented on the spot passes too. Format validation tells you the answer is shaped right, not that the inbox exists.\n\n- **No cross-field rules.** A rule can't compare two answers, so you can't require an end date later than a start date, or a shipping address only when a checkbox is ticked.\n\nThese gaps rarely matter for a simple survey. They matter when the contact details are the point, like lead capture and event registrations. If you want more workarounds for the platform's edges, our collection of [Google Forms tips and tricks](\u002Fblog\u002Fgoogle-forms-tips-and-tricks\u002F) covers the rest of the toolset.\n\n## Validation on every field, and verification where it counts\n\nIn Formester, every field type carries its own validation. Phone, email, number, date, and file upload fields each have their own rules, and the checks Google Forms can't do are handled with verification:\n\n- **Email verification that confirms the inbox.** The [email verification field](\u002Ffeatures\u002Femail-verification\u002F) sends a one-time code to the address the respondent entered. They type the code into the form, which proves the inbox exists and belongs to them, so typos and throwaway addresses never reach your list.\n\n- **Phone verification over SMS.** [SMS verification](\u002Ffeatures\u002Fsms-verification-forms\u002F) does the same for phone numbers with an OTP, so a lead's number is dialable before it reaches your CRM.\n\n- **Fields that react to other answers.** [Conditional logic](\u002Ffeatures\u002Fconditional-logic\u002F) shows and hides fields based on earlier answers, so a shipping address field can appear only when someone ticks the checkbox asking for delivery.\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002F702ad296070cc0e8_response-validation-in-google-forms-7.webp\" alt=\"Formester form builder showing email verification settings on an email field\">\u003C\u002Fp>\n\nIf your forms collect contact details you plan to act on, verification catches the bad entries that format checks let through. For a full comparison, read [why Formester is the best Google Forms alternative](\u002Fblog\u002Fwhy-formester-is-the-best-google-forms-alternative\u002F).\n\n\u003Cdiv style=\"background:linear-gradient(135deg,#7f56d9 0%,#6941c6 100%);padding:32px 28px;margin:36px 0;border-radius:12px;color:#ffffff;font-family:inherit;text-align:center;\">\n\u003Cp style=\"margin:0 0 12px 0;font-size:18px;font-weight:700;color:#ffffff;font-family:inherit;\">Collect contact details that actually work\u003C\u002Fp>\n\u003Cp style=\"margin:0 0 20px 0;font-size:14px;line-height:1.55;color:#f4ebff;font-family:inherit;\">Formester verifies emails and phone numbers with one-time codes at submission, so every lead in your list is reachable. Format rules are built into the fields themselves.\u003C\u002Fp>\n\u003Ca href=\"https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up\" style=\"display:inline-block;padding:12px 24px;background:#ffffff;color:#6941c6;text-decoration:none;font-weight:700;border-radius:9999px;font-family:inherit;\">Try Formester free\u003C\u002Fa>\n\u003Cp style=\"margin:12px 0 0 0;font-size:13px;color:#e9d7fe;font-family:inherit;\">Free forever · No credit card · 56,000+ teams\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\u003Csection class=\"faq\">\n\u003Ch2>Frequently asked questions\u003C\u002Fh2>\n\u003Cdetails>\u003Csummary>How do I set up data validation in Google Forms?\u003C\u002Fsummary>\u003Cdiv>Data validation and response validation are the same feature in Google Forms. Click a short answer, paragraph, or checkbox question, open the three-dot menu in the bottom-right corner of the question, and choose \u003Cstrong>Response validation\u003C\u002Fstrong>. Then pick a rule type, set the condition, and write a custom error message.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>Can I add more than one validation rule to a question?\u003C\u002Fsummary>\u003Cdiv>No. Google Forms allows one validation rule per question. If you need two checks, like a minimum length and a specific format, either combine both conditions into one regular expression or split the input across two questions.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>Which question types support response validation?\u003C\u002Fsummary>\u003Cdiv>Three types get real validation rules: short answer, paragraph, and checkboxes. Short answer questions get number, text, length, and regular expression rules. Paragraph questions get length and regular expression only. Checkbox questions can only limit how many options a respondent selects, and grid questions only offer row and column limits.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>How do I validate an email address in Google Forms?\u003C\u002Fsummary>\u003Cdiv>Add a short answer question, open the three-dot menu, and choose \u003Cstrong>Response validation\u003C\u002Fstrong>. Set the first dropdown to \u003Cstrong>Text\u003C\u002Fstrong> and the second to \u003Cstrong>Email address\u003C\u002Fstrong>, then write an error message telling people to enter a valid email address. Google Forms then rejects any answer that doesn't follow the name@domain format.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>Can Google Forms verify that an email address actually exists?\u003C\u002Fsummary>\u003Cdiv>No. The built-in email rule checks formatting only, so typos like name@gmial.com and made-up addresses still pass. To confirm the inbox is real you need a tool that sends a verification code, like Formester's email verification field, or a third-party validation service connected through Zapier.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>How do I limit checkbox selections in Google Forms?\u003C\u002Fsummary>\u003Cdiv>Add a checkbox question, open the three-dot menu, and choose \u003Cstrong>Response validation\u003C\u002Fstrong>. Pick \u003Cstrong>Select at least\u003C\u002Fstrong>, \u003Cstrong>Select at most\u003C\u002Fstrong>, or \u003Cstrong>Select exactly\u003C\u002Fstrong>, then enter the number. Google Forms blocks submission until the respondent's selection count matches the rule.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003C\u002Fsection>\n","blog\u002Fblog\u002Fresponse-validation-in-google-forms.md",1200,{"text":173},{"title":221,"author":222,"authorImage":8,"authorProfile":223,"coverImg":224,"coverImgAlt":225,"createdAt":226,"description":227,"featured":14,"jsonld":228,"keywords":312,"metaDescription":227,"metaImage":313,"metaTitle":314,"publishedAt":315,"slug":316,"updatedAt":317,"__hash__":318,"body":319,"id":320,"coverImgWidth":25,"coverImgHeight":26,"readingStats":321},"How to Send HTML Form Data to Google Sheets for Free","Harsh Shah","https:\u002F\u002Flinkedin.com\u002Fin\u002Fharshshahseo","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FHow_to_Make_User_Research_Survey_1_ec282fa0b6.png","a cover of a blog post that talks about sending contact form data to google sheets","2025-03-06T18:34:23.526Z","Push HTML form submissions straight into Google Sheets, free. Working Apps Script code, a no-code option, and a method-by-method comparison so you pick once.",[229],{"@graph":230,"@context":163},[231,245,273,307],{"@id":232,"@type":233,"image":224,"author":234,"headline":221,"publisher":236,"description":227,"dateModified":242,"datePublished":243,"mainEntityOfPage":244},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-send-contact-form-data-to-google-sheets-free\u002F#article","Article",{"url":9,"name":7,"@type":235},"Person",{"logo":237,"name":240,"@type":241},{"url":238,"@type":239},"https:\u002F\u002Fformester.com\u002Flogo.png","ImageObject","Formester","Organization","2026-06-09","2025-03-06","https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-send-contact-form-data-to-google-sheets-free\u002F",{"name":246,"step":247,"tool":260,"@type":158,"totalTime":268,"estimatedCost":269},"How to send HTML form data to Google Sheets with Apps Script",[248,251,254,257],{"name":249,"text":250,"@type":129},"Create the Sheet","Open Google Sheets, create a new spreadsheet, name the tab Submissions, and add column headers in row 1 that match the name attributes on your HTML form inputs.",{"name":252,"text":253,"@type":129},"Open Apps Script and paste the doPost function","Inside the Sheet, open Extensions then Apps Script. Paste the doPost script provided in this guide. Save the project.",{"name":255,"text":256,"@type":129},"Run initialSetup and deploy the web app","Pick initialSetup in the function dropdown and click Run. Approve the OAuth prompt. Click Deploy, New deployment, Web app, Execute as Me, Anyone has access. Copy the deployment URL.",{"name":258,"text":259,"@type":129},"Wire the deployment URL into your HTML form","Point your form's fetch endpoint or action attribute at the deployment URL. Submit a test entry. The row appears in the Sheet within a second.",[261,264,266],{"name":262,"@type":263},"Google Sheets","HowToTool",{"name":265,"@type":263},"Google Apps Script",{"name":267,"@type":263},"HTML form on your site","PT30M",{"@type":270,"value":271,"currency":272},"MonetaryAmount","0","USD",{"@type":92,"mainEntity":274},[275,279,283,287,291,295,299,303],{"name":276,"@type":96,"acceptedAnswer":277},"Is it really free to send HTML form data to Google Sheets?",{"text":278,"@type":99},"Yes. Google Apps Script is free with any Google account, capped at one Sheets write per second per user. Google Forms is free. Formester's free plan includes unlimited submissions.",{"name":280,"@type":96,"acceptedAnswer":281},"How secure is form data in Google Sheets?",{"text":282,"@type":99},"Google encrypts data at rest and in transit. Lock sharing to specific accounts, neutralize formula characters on input to prevent CSV injection, and do not use a Sheet for payment data or passwords.",{"name":284,"@type":96,"acceptedAnswer":285},"What is the rate limit on Apps Script writes to Sheets?",{"text":286,"@type":99},"Roughly 100 requests per 100 seconds per user, per Google's published quotas. A contact form sustaining one submission per second sits comfortably inside that envelope.",{"name":288,"@type":96,"acceptedAnswer":289},"Can I send file uploads from the form into Google Sheets?",{"text":290,"@type":99},"Sheets cannot hold a file. Write the file to Google Drive via Apps Script and store the Drive URL in the cell, or use a no-code builder that handles file uploads natively.",{"name":292,"@type":96,"acceptedAnswer":293},"How do I add CAPTCHA or spam protection?",{"text":294,"@type":99},"The script in this guide ships a honeypot field. For more, add Google reCAPTCHA v3 on the client and verify the token server-side before writing to the Sheet.",{"name":296,"@type":96,"acceptedAnswer":297},"How do I get an email when someone submits the form?",{"text":298,"@type":99},"Add MailApp.sendEmail inside the doPost function in Apps Script. Or use the autoresponder feature in a no-code builder and skip the code.",{"name":300,"@type":96,"acceptedAnswer":301},"Can I use this on Netlify, Vercel, or any static site?",{"text":302,"@type":99},"Yes. The Apps Script deployment URL is a fetch target. It works from any frontend, hosted anywhere, with no backend on your side.",{"name":304,"@type":96,"acceptedAnswer":305},"Can I move from this setup to a database later?",{"text":306,"@type":99},"Easily. Sheets is a great starter store. When you cross a few hundred submissions a week, route the same form to a database or CRM in parallel with the Sheet.",{"@type":70,"itemListElement":308},[309,310,311],{"item":73,"name":74,"@type":75,"position":76},{"item":78,"name":79,"@type":75,"position":80},{"item":244,"name":221,"@type":75,"position":83},"how to send contact form data to google sheets free,\ncontact form template,\ncontact form automation,",[],"HTML Form to Google Sheets: 3 Free Methods (Code)","2026-06-15T04:53:58.393Z","how-to-send-contact-form-data-to-google-sheets-free","2026-06-15T04:53:58.398Z","SpJtH4MN2xn0shG-jzP6RaMox4pENmrLXV3OuYWeFbk","![a cover of a blog post that talks about sending contact form data to google sheets](https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FHow_to_Make_User_Research_Survey_1_ec282fa0b6.png)\n\n\u003Cstyle>\n\u002F* batch-1 blog normalisation *\u002F\n.fmstr-blog-lead {\n  font-size: 17px !important;\n  line-height: 1.65 !important;\n  color: #475467 !important;\n  font-weight: 400 !important;\n  margin: 0 0 16px !important;\n}\n.fmstr-blog-lead a { color: #6941c6 !important; font-weight: 500; }\n.fmstr-blog-lead a:hover { text-decoration: underline !important; }\n.fmstr-blog-lead strong { color: #101828; font-weight: 700; }\nsection[class^=\"fmstr-cmp-\"], section[class*=\" fmstr-cmp-\"] {\n  padding-top: 28px !important;\n  padding-bottom: 28px !important;\n}\n@media (max-width: 540px) {\n  section[class^=\"fmstr-cmp-\"], section[class*=\" fmstr-cmp-\"] {\n    padding-top: 24px !important;\n    padding-bottom: 24px !important;\n  }\n}\n\u003C\u002Fstyle>\n\n\u003Cstyle id=\"fmstr-blog-mobile-fullwidth-v3\">\n@media (max-width: 760px) {\n  .art-section { padding-left: 12px !important; padding-right: 12px !important; }\n}\n@media (max-width: 540px) {\n  .art-section { padding-left: 6px !important; padding-right: 6px !important; padding-top: 24px !important; }\n  section[class^=\"fmstr-cmp-\"], section[class*=\" fmstr-cmp-\"] {\n    padding-left: 0 !important; padding-right: 0 !important;\n    overflow-x: hidden !important; box-sizing: border-box !important;\n  }\n  section[class^=\"fmstr-cmp-\"] *, section[class^=\"fmstr-cmp-\"] *::before, section[class^=\"fmstr-cmp-\"] *::after { box-sizing: border-box !important; }\n  section[class^=\"fmstr-cmp-\"] > *, section[class^=\"fmstr-cmp-\"] > * > * { min-width: 0 !important; }\n  section[class^=\"fmstr-cmp-\"] [class*=\"__container\"] {\n    padding-left: 0 !important; padding-right: 0 !important;\n    max-width: 100% !important; width: 100% !important;\n  }\n  section[class^=\"fmstr-cmp-\"] [class*=\"__card\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__step\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__panel\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__tool\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__verdict\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__row\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__fix\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__callout\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__quote\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__tldr\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__answer\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__faq\"],\n  section[class^=\"fmstr-cmp-\"] details {\n    padding-left: 14px !important; padding-right: 14px !important;\n    margin-left: 0 !important; margin-right: 0 !important;\n  }\n  section[class^=\"fmstr-cmp-\"] p, section[class^=\"fmstr-cmp-\"] li { font-size: 15px !important; line-height: 1.6 !important; }\n  section[class^=\"fmstr-cmp-\"] h2 { font-size: 22px !important; line-height: 1.22 !important; }\n  section[class^=\"fmstr-cmp-\"] h3 { font-size: 18px !important; line-height: 1.3 !important; }\n  section[class^=\"fmstr-cmp-\"] h4 { font-size: 16px !important; line-height: 1.35 !important; }\n  section[class^=\"fmstr-cmp-\"] table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; width: 100% !important; }\n  section[class^=\"fmstr-cmp-\"] img, section[class^=\"fmstr-cmp-\"] iframe, section[class^=\"fmstr-cmp-\"] video { max-width: 100% !important; height: auto !important; }\n  section[class^=\"fmstr-cmp-\"] pre, section[class^=\"fmstr-cmp-\"] code {\n    white-space: pre-wrap !important; overflow-wrap: anywhere !important; word-break: break-word !important;\n  }\n  section[class^=\"fmstr-cmp-\"] pre { overflow-x: auto; }\n  .fmstr-blog-lead { font-size: 16.5px !important; }\n}\n\u003C\u002Fstyle>\n\n\u003Cp class=\"fmstr-blog-lead\">If you have a contact form, an opt-in widget, or a custom HTML form on your site, you can route every submission straight into a Google Sheet without a database, a Zapier subscription, or a paid backend. Three free methods get you there. Two need code. One does not.\u003C\u002Fp>\n\n\u003Cp class=\"fmstr-blog-lead\">This guide gives you the working Apps Script (paste-ready), the no-code path, and a side-by-side comparison so you know which one to pick before you start.\u003C\u002Fp>\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-tldr a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-tldr {\n--c-card: #f7f3ff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6; --c-violet-700: #5b34b1;\n--c-edge: #e4d7ff; --c-border: #d6c2f7;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\nbackground: transparent;\npadding: 28px 0 40px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important; overflow-x: hidden; -webkit-text-size-adjust: 100%;}\n.fmstr-cmp-tmpl-tldr *, .fmstr-cmp-tmpl-tldr *::before, .fmstr-cmp-tmpl-tldr *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-tldr__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-tldr__card {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-left: 4px solid var(--c-violet-500);\nborder-radius: 14px;\npadding: 22px 26px;\nbox-shadow: var(--c-shadow);\ndisplay: flex; flex-direction: column; gap: 12px;\n}\n.fmstr-cmp-tmpl-tldr__label {\nfont-size: 12px !important;\nfont-weight: 700 !important;\nletter-spacing: 0.08em !important;\ntext-transform: uppercase;\ncolor: var(--c-violet-700) !important;\ndisplay: inline-flex;\nalign-items: center;\ngap: 8px;\nmargin: 0 !important;\n}\n.fmstr-cmp-tmpl-tldr__label::before {\ncontent: \"\";\nwidth: 8px; height: 8px; border-radius: 9999px;\nbackground: var(--c-violet-500);\ndisplay: inline-block;\n}\n.fmstr-cmp-tmpl-tldr__body {\nfont-size: 16px !important;\nline-height: 1.65 !important;\ncolor: var(--c-fg-1);\nmargin: 0 !important;\nfont-weight: 500 !important;\n}\n.fmstr-cmp-tmpl-tldr__body strong { color: var(--c-violet-700); font-weight: 700; }\n.fmstr-cmp-tmpl-tldr__list {\nmargin: 0 !important; padding: 0 0 0 20px !important;\ndisplay: flex; flex-direction: column; gap: 8px;\nfont-size: 15.5px; line-height: 1.6; color: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-tldr__list li { margin: 0; }\n.fmstr-cmp-tmpl-tldr__list strong { color: var(--c-violet-700); font-weight: 700; }\n\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-tldr { padding: 20px 0 28px; }\n.fmstr-cmp-tmpl-tldr__card { padding: 18px 20px; }\n.fmstr-cmp-tmpl-tldr__body { font-size: 15px !important; }\n.fmstr-cmp-tmpl-tldr__list { font-size: 14.5px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-tldr img, .fmstr-cmp-tmpl-tldr table, .fmstr-cmp-tmpl-tldr pre, .fmstr-cmp-tmpl-tldr iframe, .fmstr-cmp-tmpl-tldr video { max-width: 100%; }\n.fmstr-cmp-tmpl-tldr > * { min-width: 0; }\n.fmstr-cmp-tmpl-tldr [class*='__grid'] > *, .fmstr-cmp-tmpl-tldr [class*='__list'] > *, .fmstr-cmp-tmpl-tldr [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-tldr pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-tldr table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-tldr\" aria-labelledby=\"fmstr-cmp-tmpl-tldr-label\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-tldr__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-tldr__card\">\n\u003Cp class=\"fmstr-cmp-tmpl-tldr__label\" id=\"fmstr-cmp-tmpl-tldr-label\">Quick answer\u003C\u002Fp>\n\u003Cp class=\"fmstr-cmp-tmpl-tldr__body\">You can push HTML form submissions into a Google Sheet for free with three methods. Pick one in 30 seconds:\u003C\u002Fp>\n\u003Cul class=\"fmstr-cmp-tmpl-tldr__list\">\n\u003Cli>\u003Cstrong>Google Forms\u003C\u002Fstrong> (2 minutes, no code): use it when the form does not need to live on your own domain.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Google Apps Script\u003C\u002Fstrong> (20-40 minutes, paste-ready code below): use it when you already have an HTML form on your site and are fine maintaining a script.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>No-code builder like \u003Ca href=\"https:\u002F\u002Fformester.com\u002F\">Formester\u003C\u002Fa>\u003C\u002Fstrong> (5 minutes, no code): use it when you want spam control, conditional logic, and Sheets sync in one place.\u003C\u002Fli>\n\u003Cli>Apps Script caps at roughly one Sheets write per second per user, which is plenty for a contact form.\u003C\u002Fli>\n\u003Cli>Never store payment data or passwords in Sheets. It is a great inbox, not a vault.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-cmp a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-cmp a.fmstr-cmp-tmpl-cmp__link { color: var(--c-violet-600) !important; font-weight: 600; }\n.fmstr-cmp-tmpl-cmp a.fmstr-cmp-tmpl-cmp__link:hover { text-decoration: underline !important; }\n.fmstr-cmp-tmpl-cmp {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6; --c-violet-700: #5b34b1;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\n--c-good: #12b76a; --c-bad: #f04438;\nbackground: transparent;\npadding: 48px 0;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important;\noverflow-x: hidden;\n}\n.fmstr-cmp-tmpl-cmp *, .fmstr-cmp-tmpl-cmp *::before, .fmstr-cmp-tmpl-cmp *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-cmp > *, .fmstr-cmp-tmpl-cmp > * > * { min-width: 0; }\n.fmstr-cmp-tmpl-cmp__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-cmp__head { margin: 0 0 28px !important; }\n.fmstr-cmp-tmpl-cmp__h2 {\nfont-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important;\nletter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-cmp__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 0 !important; }\n.fmstr-cmp-tmpl-cmp__grid {\ndisplay: grid; grid-template-columns: repeat(3, 1fr); gap: 14px;\n}\n.fmstr-cmp-tmpl-cmp__card {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-radius: 14px;\npadding: 22px;\nbox-shadow: var(--c-shadow);\ndisplay: flex; flex-direction: column; gap: 12px;\nmin-width: 0;\n}\n.fmstr-cmp-tmpl-cmp__card--featured {\nborder-color: var(--c-edge);\nbackground: var(--c-tint);\nbox-shadow: 0 4px 18px rgba(105,65,198,.10);\n}\n.fmstr-cmp-tmpl-cmp__chip {\ndisplay: inline-flex; align-items: center;\nfont-size: 11px !important; font-weight: 700 !important; letter-spacing: 0.08em !important;\ntext-transform: uppercase; color: var(--c-violet-700) !important;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\npadding: 4px 10px; border-radius: 9999px;\nalign-self: flex-start;\n}\n.fmstr-cmp-tmpl-cmp__name {\nfont-size: 18px !important; font-weight: 700 !important; color: var(--c-fg-1);\nmargin: 0 !important; line-height: 1.3 !important;\n}\n.fmstr-cmp-tmpl-cmp__best {\nfont-size: 13.5px !important; color: var(--c-fg-3); margin: 0 !important;\n}\n.fmstr-cmp-tmpl-cmp__best strong { color: var(--c-fg-1); font-weight: 600; }\n.fmstr-cmp-tmpl-cmp__divider {\nheight: 1px; background: var(--c-border); margin: 4px 0; border: 0;\n}\n.fmstr-cmp-tmpl-cmp__list {\nmargin: 0; padding: 0; list-style: none;\ndisplay: flex; flex-direction: column; gap: 8px;\n}\n.fmstr-cmp-tmpl-cmp__item {\ndisplay: block; position: relative; padding-left: 26px;\nfont-size: 14px; line-height: 1.5; color: var(--c-fg-2);\n}\n.fmstr-cmp-tmpl-cmp__item::before {\ncontent: \"\\2713\";\nposition: absolute; left: 0; top: 0.05em;\ncolor: var(--c-good); font-weight: 700; line-height: 1.45;\n}\n.fmstr-cmp-tmpl-cmp__item--con::before { content: \"\\2717\"; color: var(--c-bad); position: absolute; left: 0; top: 0.05em; font-weight: 700; }\n.fmstr-cmp-tmpl-cmp__rules {\nmargin: 28px 0 0; padding: 18px 22px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\nborder-radius: 12px;\ndisplay: flex; flex-direction: column; gap: 8px;\n}\n.fmstr-cmp-tmpl-cmp__rules-label {\nfont-size: 11px !important; font-weight: 700 !important; letter-spacing: 0.08em !important;\ntext-transform: uppercase; color: var(--c-violet-700) !important; margin: 0 !important;\n}\n.fmstr-cmp-tmpl-cmp__rules-list {\nmargin: 0 !important; padding: 0 0 0 20px !important;\nfont-size: 14.5px; line-height: 1.6; color: var(--c-fg-1);\ndisplay: flex; flex-direction: column; gap: 6px;\n}\n\n@media (max-width: 920px) {\n.fmstr-cmp-tmpl-cmp__grid { grid-template-columns: 1fr; gap: 12px; }\n}\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-cmp { padding: 36px 0; }\n.fmstr-cmp-tmpl-cmp__card { padding: 18px 20px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-cmp img, .fmstr-cmp-tmpl-cmp table, .fmstr-cmp-tmpl-cmp pre, .fmstr-cmp-tmpl-cmp iframe, .fmstr-cmp-tmpl-cmp video { max-width: 100%; }\n.fmstr-cmp-tmpl-cmp > * { min-width: 0; }\n.fmstr-cmp-tmpl-cmp [class*='__grid'] > *, .fmstr-cmp-tmpl-cmp [class*='__list'] > *, .fmstr-cmp-tmpl-cmp [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-cmp pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-cmp table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-cmp\" aria-labelledby=\"fmstr-cmp-tmpl-cmp-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__head\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-cmp__h2\" id=\"fmstr-cmp-tmpl-cmp-h2\">Which method should you pick?\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__intro\">Three free routes from form submission to a Google Sheet row. Match the method to where you already are.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__grid\">\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__card\">\n\u003Cspan class=\"fmstr-cmp-tmpl-cmp__chip\">Method 1\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-cmp__name\">Google Forms\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__best\">\u003Cstrong>Best for:\u003C\u002Fstrong> A form you do not need to embed on your own site.\u003C\u002Fp>\n\u003Chr class=\"fmstr-cmp-tmpl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">2-minute setup, no code at all.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Free with any Google account.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Responses auto-link to a Sheet.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">Lives on a Google URL, not your domain.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">Limited design control.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__card\">\n\u003Cspan class=\"fmstr-cmp-tmpl-cmp__chip\">Method 2\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-cmp__name\">Google Apps Script\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__best\">\u003Cstrong>Best for:\u003C\u002Fstrong> A custom HTML form you already have on your site.\u003C\u002Fp>\n\u003Chr class=\"fmstr-cmp-tmpl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Free forever, no usage cap on Sheets writes (within Google quotas).\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Paste-ready code, no edits required.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Stays on your domain, no third-party branding.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">20-40 minute setup.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">You maintain the script and the deployment.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__card fmstr-cmp-tmpl-cmp__card--featured\">\n\u003Cspan class=\"fmstr-cmp-tmpl-cmp__chip\">Method 3 &middot; No-code\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-cmp__name\">Formester\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__best\">\u003Cstrong>Best for:\u003C\u002Fstrong> Embedding on any site with spam control, conditional logic, and Sheets sync.\u003C\u002Fp>\n\u003Chr class=\"fmstr-cmp-tmpl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">5-minute setup, no code at all.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Free plan includes unlimited responses.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Native \u003Ca class=\"fmstr-cmp-tmpl-cmp__link\" href=\"https:\u002F\u002Fformester.com\u002Fintegrations\u002F\">Google Sheets integration\u003C\u002Fa>, OAuth, retries handled.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Spam filtering, conditional logic, analytics built in.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">Branded footer on the free plan.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003C\u002Fdiv>\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__rules\">\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__rules-label\">Decision rule\u003C\u002Fp>\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__rules-list\">\n\u003Cli>If the form already exists in HTML and you are fine maintaining a script, use Apps Script.\u003C\u002Fli>\n\u003Cli>If you do not need to embed the form on your own domain, use Google Forms.\u003C\u002Fli>\n\u003Cli>If you want zero maintenance, spam control, conditional logic, and Google Sheets sync in one place, use a no-code form builder like Formester.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-steps a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-steps a.fmstr-cmp-tmpl-steps__link { color: var(--c-violet-600) !important; font-weight: 600; }\n.fmstr-cmp-tmpl-steps a.fmstr-cmp-tmpl-steps__link:hover { text-decoration: underline !important; }\n.fmstr-cmp-tmpl-steps {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6; --c-violet-700: #5b34b1;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0;\n--c-code-bg: #0f172a; --c-code-fg: #e2e8f0;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\nbackground: transparent;\npadding: 48px 0;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important;\noverflow-x: hidden;\n}\n.fmstr-cmp-tmpl-steps *, .fmstr-cmp-tmpl-steps *::before, .fmstr-cmp-tmpl-steps *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-steps > *, .fmstr-cmp-tmpl-steps > * > * { min-width: 0; }\n.fmstr-cmp-tmpl-steps__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-steps__head { margin: 0 0 28px !important; }\n.fmstr-cmp-tmpl-steps__h2 {\nfont-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important;\nletter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-steps__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 0 !important; }\n.fmstr-cmp-tmpl-steps__list {\ndisplay: flex; flex-direction: column; gap: 14px;\nmargin: 0; padding: 0; list-style: none;\n}\n.fmstr-cmp-tmpl-steps__item {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-radius: 14px;\npadding: 22px 24px;\nbox-shadow: var(--c-shadow);\ndisplay: flex; gap: 12px;\nalign-items: flex-start;\nmin-width: 0;\n}\n.fmstr-cmp-tmpl-steps__num {\nflex-shrink: 0;\nwidth: 26px; line-height: 1; height: 26px; border-radius: 7px;\nbackground: var(--c-tint);\nborder: 1px solid var(--c-edge);\ncolor: var(--c-violet-700) !important;\nfont-weight: 800; font-size: 13px;\ndisplay: inline-flex; align-items: center; justify-content: center;\n}\n.fmstr-cmp-tmpl-steps__main { flex: 1; min-width: 0; }\n.fmstr-cmp-tmpl-steps__title {\nfont-size: 17px !important; font-weight: 700 !important; line-height: 1.3 !important;\ncolor: var(--c-fg-1); margin: 0 0 6px !important;\n}\n.fmstr-cmp-tmpl-steps__body {\nfont-size: 15px !important; line-height: 1.6 !important;\ncolor: var(--c-fg-2); margin: 0 0 10px !important;\n}\n.fmstr-cmp-tmpl-steps__body:last-child { margin-bottom: 0 !important; }\n.fmstr-cmp-tmpl-steps__body code {\nbackground: #f4f4f7; padding: 1px 6px; border-radius: 5px;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 13.5px; color: var(--c-violet-700);\nborder: 1px solid var(--c-border);\n}\n.fmstr-cmp-tmpl-steps__code {\nmargin: 12px 0 4px;\nbackground: var(--c-code-bg);\ncolor: var(--c-code-fg);\nborder-radius: 10px;\npadding: 16px 18px;\noverflow-x: auto;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 13px;\nline-height: 1.6;\nwhite-space: pre;\nmax-width: 100%;\n}\n.fmstr-cmp-tmpl-steps__code-label {\ndisplay: block; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 11.5px; font-weight: 700; letter-spacing: 0.06em;\ntext-transform: uppercase; color: #94a3b8;\nmargin: 0 0 10px;\n}\n.fmstr-cmp-tmpl-steps__note {\nmargin: 12px 0 0 !important; padding: 12px 14px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\nborder-radius: 10px;\nfont-size: 14px !important; line-height: 1.55 !important;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-steps__note strong { color: var(--c-violet-700); font-weight: 700; }\n\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-steps { padding: 36px 0; }\n.fmstr-cmp-tmpl-steps__item { padding: 18px 20px; gap: 14px; }\n.fmstr-cmp-tmpl-steps__num { width: 34px; height: 34px; font-size: 15px; }\n.fmstr-cmp-tmpl-steps__title { font-size: 16px !important; }\n.fmstr-cmp-tmpl-steps__body { font-size: 14.5px !important; }\n.fmstr-cmp-tmpl-steps__code { font-size: 12px; padding: 14px 16px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-steps img, .fmstr-cmp-tmpl-steps table, .fmstr-cmp-tmpl-steps pre, .fmstr-cmp-tmpl-steps iframe, .fmstr-cmp-tmpl-steps video { max-width: 100%; }\n.fmstr-cmp-tmpl-steps > * { min-width: 0; }\n.fmstr-cmp-tmpl-steps [class*='__grid'] > *, .fmstr-cmp-tmpl-steps [class*='__list'] > *, .fmstr-cmp-tmpl-steps [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-steps pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-steps table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\n\n\n\u002F* mobile-inline-num *\u002F\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-steps__item { padding: 18px 16px; gap: 10px; flex-direction: row; align-items: flex-start; }\n  .fmstr-cmp-tmpl-steps__num { width: 28px; height: 28px; font-size: 13px; border-radius: 8px; }\n}\n\n\u002F* step-inline-num-restructure *\u002F\n.fmstr-cmp-tmpl-steps__item { display: block !important; }\n.fmstr-cmp-tmpl-steps__title { display: block; }\n.fmstr-cmp-tmpl-steps__num { display: inline-block !important; vertical-align: 2px; margin-right: 8px; padding: 2px 8px; width: auto !important; height: auto !important; border-radius: 6px; font-size: 12.5px !important; line-height: 1.3 !important; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-steps__num { font-size: 11.5px !important; padding: 2px 7px; margin-right: 6px; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-steps\" aria-labelledby=\"fmstr-cmp-tmpl-steps-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__head\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-steps__h2\" id=\"fmstr-cmp-tmpl-steps-h2\">Method 2: Google Apps Script, full working setup\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__intro\">\u003Cstrong>Method 1 is one click in Google Forms. Method 3 is a no-code toggle in Formester.\u003C\u002Fstrong> The only method that needs a real walkthrough is Method 2. Here it is, in full.\u003C\u002Fp>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__intro\">Paste-ready code that handles any field name in your HTML form, sanitizes against \u003Ca class=\"fmstr-cmp-tmpl-steps__link\" href=\"https:\u002F\u002Fowasp.org\u002Fwww-community\u002Fattacks\u002FCSV_Injection\">CSV formula injection\u003C\u002Fa>, and works with both \u003Ccode>application\u002Fjson\u003C\u002Fcode> and standard form-encoded submissions.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Col class=\"fmstr-cmp-tmpl-steps__list\">\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">1\u003C\u002Fspan>Create the Sheet\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Open \u003Ca class=\"fmstr-cmp-tmpl-steps__link\" href=\"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002F\">Google Sheets\u003C\u002Fa> and create a new spreadsheet. Name the tab \u003Ccode>Submissions\u003C\u002Fcode>. In row 1, add column headers that match the \u003Ccode>name\u003C\u002Fcode> attributes on your form inputs. Add \u003Ccode>timestamp\u003C\u002Fcode> as the first column. The script reads row 1 as the source of truth for column mapping, so a typo in a header is a typo in the data.\u003C\u002Fp>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Example row 1: \u003Ccode>timestamp | name | email | message\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">2\u003C\u002Fspan>Open Apps Script and paste the code\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Inside the Sheet, go to Extensions, then Apps Script. Delete the boilerplate and paste this:\u003C\u002Fp>\n\u003Cpre class=\"fmstr-cmp-tmpl-steps__code\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__code-label\">Code.gs\u003C\u002Fspan>const SHEET_NAME = 'Submissions';\nconst SCRIPT_PROP = PropertiesService.getScriptProperties();\n\nfunction initialSetup() {\n  const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();\n  SCRIPT_PROP.setProperty('key', activeSpreadsheet.getId());\n}\n\nfunction doPost(e) {\n  const lock = LockService.getScriptLock();\n  lock.tryLock(10000);\n\n  try {\n    const doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty('key'));\n    const sheet = doc.getSheetByName(SHEET_NAME);\n\n    const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];\n    const nextRow = sheet.getLastRow() + 1;\n\n    \u002F\u002F Honeypot: if a hidden field named \"website\" is filled, drop the submission.\n    if (e.parameter.website) {\n      return ContentService.createTextOutput(JSON.stringify({ result: 'ignored' }))\n        .setMimeType(ContentService.MimeType.JSON);\n    }\n\n    const sanitize = (value) =&gt; {\n      if (typeof value !== 'string') return value;\n      \u002F\u002F Block CSV \u002F formula injection\n      return \u002F^[=+\\-@]\u002F.test(value) ? \"'\" + value : value;\n    };\n\n    const newRow = headers.map((header) =&gt; {\n      if (header === 'timestamp') return new Date();\n      return sanitize(e.parameter[header] || '');\n    });\n\n    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);\n\n    return ContentService\n      .createTextOutput(JSON.stringify({ result: 'success', row: nextRow }))\n      .setMimeType(ContentService.MimeType.JSON);\n  } catch (err) {\n    return ContentService\n      .createTextOutput(JSON.stringify({ result: 'error', error: err.toString() }))\n      .setMimeType(ContentService.MimeType.JSON);\n  } finally {\n    lock.releaseLock();\n  }\n}\u003C\u002Fpre>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Save the script. Then in the function dropdown at the top of the editor, pick \u003Ccode>initialSetup\u003C\u002Fcode> and click Run once. Approve the OAuth prompt when Google asks. You will only do this once.\u003C\u002Fp>\n\u003C\u002Fli>\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">3\u003C\u002Fspan>Deploy as a web app\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Click Deploy, then New deployment. Pick Web app. Set Execute as: Me. Set Who has access: Anyone. Click Deploy. Copy the long URL that ends in \u003Ccode>\u002Fexec\u003C\u002Fcode>. That URL is your form endpoint.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__note\">\u003Cstrong>Heads-up:\u003C\u002Fstrong> every time you change the script, redeploy and grab the new URL. Old URLs keep working at the old script version, which is the most common cause of \"I updated my code and nothing changed\" complaints.\u003C\u002Fdiv>\n\u003C\u002Fli>\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">4\u003C\u002Fspan>Wire up your HTML form\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Drop this into your page. Replace \u003Ccode>PASTE_YOUR_DEPLOYMENT_URL_HERE\u003C\u002Fcode> with the URL from step 3.\u003C\u002Fp>\n\u003Cpre class=\"fmstr-cmp-tmpl-steps__code\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__code-label\">index.html\u003C\u002Fspan>&lt;form id=\"contact-form\"&gt;\n  &lt;input type=\"text\" name=\"name\" required placeholder=\"Name\" \u002F&gt;\n  &lt;input type=\"email\" name=\"email\" required placeholder=\"Email\" \u002F&gt;\n  &lt;textarea name=\"message\" required placeholder=\"Message\"&gt;&lt;\u002Ftextarea&gt;\n  &lt;!-- Honeypot: hidden from humans, filled by bots --&gt;\n  &lt;input type=\"text\" name=\"website\" tabindex=\"-1\" autocomplete=\"off\" style=\"position:absolute;left:-9999px\" \u002F&gt;\n  &lt;button type=\"submit\"&gt;Send&lt;\u002Fbutton&gt;\n&lt;\u002Fform&gt;\n\n&lt;script&gt;\n  const form = document.getElementById('contact-form');\n  const endpoint = 'PASTE_YOUR_DEPLOYMENT_URL_HERE';\n\n  form.addEventListener('submit', async (e) =&gt; {\n    e.preventDefault();\n    const data = new FormData(form);\n    try {\n      await fetch(endpoint, { method: 'POST', body: data });\n      form.reset();\n      alert('Thanks. We will be in touch.');\n    } catch (err) {\n      alert('Something went wrong. Try again in a minute.');\n    }\n  });\n&lt;\u002Fscript&gt;\u003C\u002Fpre>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Submit a test entry. The row should appear in your Sheet within a second.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__note\">\u003Cstrong>Rate limit to know about:\u003C\u002Fstrong> Google caps the Sheets-backed Apps Script at roughly \u003Ca class=\"fmstr-cmp-tmpl-steps__link\" href=\"https:\u002F\u002Fdevelopers.google.com\u002Fsheets\u002Fapi\u002Flimits\">100 requests per 100 seconds per user\u003C\u002Fa>, or one write per second. For a contact form that is plenty. If you expect bursts (a launch, a paid ad campaign), queue submissions or use a builder that handles retries.\u003C\u002Fdiv>\n\u003C\u002Fli>\n\n\u003C\u002Fol>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-midcta a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-midcta { background: transparent; padding: 48px 0; font-family: inherit; color: #101828; overflow-x: hidden; }\n.fmstr-cmp-tmpl-midcta *, .fmstr-cmp-tmpl-midcta *::before, .fmstr-cmp-tmpl-midcta *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-midcta__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-midcta__card { width: 100%; background: linear-gradient(135deg, #f7f3ff 0%, #faf7ff 100%); border: 1px solid #e4d7ff; border-radius: 18px; padding: 48px 32px; text-align: center; box-shadow: 0 4px 24px rgba(127, 86, 217, 0.08); }\n.fmstr-cmp-tmpl-midcta__inner { max-width: 760px; margin: 0 auto; }\n.fmstr-cmp-tmpl-midcta__eyebrow { display: inline-block; padding: 4px 12px; background: #ffffff; border: 1px solid #e4d7ff; border-radius: 9999px; color: #5b34b1 !important; font-size: 11.5px !important; font-weight: 700 !important; letter-spacing: 0.06em !important; text-transform: uppercase; margin: 0 0 14px !important; }\n.fmstr-cmp-tmpl-midcta__h2 { font-size: clamp(22px, 3vw, 28px) !important; font-weight: 700 !important; line-height: 1.2 !important; letter-spacing: -0.02em !important; margin: 0 0 12px !important; color: #101828 !important; }\n.fmstr-cmp-tmpl-midcta__body { font-size: 16px !important; line-height: 1.55 !important; color: #475467 !important; margin: 0 0 22px !important; }\n.fmstr-cmp-tmpl-midcta__cta { display: inline-flex !important; align-items: center; gap: 8px; background: #7f56d9 !important; color: #ffffff !important; border: 1px solid #7f56d9 !important; padding: 12px 26px !important; border-radius: 9999px !important; font-size: 15px !important; font-weight: 600 !important; text-decoration: none !important; transition: background .15s ease, transform .15s ease; }\n.fmstr-cmp-tmpl-midcta__cta:hover { background: #6941c6 !important; border-color: #6941c6 !important; color: #ffffff !important; text-decoration: none !important; transform: translateY(-1px); }\n.fmstr-cmp-tmpl-midcta__cta::after { content: \"\\2192\"; transition: transform .15s ease; }\n.fmstr-cmp-tmpl-midcta__cta:hover::after { transform: translateX(2px); }\n.fmstr-cmp-tmpl-midcta__strip { font-size: 13px !important; color: #697586 !important; margin: 20px 0 0 !important; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 6px 14px; width: 100%; }\n.fmstr-cmp-tmpl-midcta__strip span { color: #d6c2f7; }\n@media (max-width: 760px) {\n  .fmstr-cmp-tmpl-midcta__card { padding: 36px 22px; }\n}\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-midcta { padding: 32px 0; }\n  .fmstr-cmp-tmpl-midcta__card { padding: 26px 16px; border-radius: 14px; }\n  .fmstr-cmp-tmpl-midcta__h2 { font-size: 20px !important; }\n  .fmstr-cmp-tmpl-midcta__body { font-size: 15px !important; }\n  .fmstr-cmp-tmpl-midcta__cta { padding: 11px 22px !important; font-size: 14.5px !important; width: 100%; justify-content: center; }\n  .fmstr-cmp-tmpl-midcta__strip { font-size: 12.5px !important; gap: 4px 10px; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-midcta\" aria-labelledby=\"fmstr-cmp-tmpl-midcta-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-midcta__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-midcta__card\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-midcta__inner\">\n\u003Cspan class=\"fmstr-cmp-tmpl-midcta__eyebrow\">No-code path\u003C\u002Fspan>\n\u003Ch2 class=\"fmstr-cmp-tmpl-midcta__h2\" id=\"fmstr-cmp-tmpl-midcta-h2\">Send HTML form data to Google Sheets, without writing a single line of code\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-midcta__body\">Drop in a Formester form, connect Google Sheets, done. Two-way sync, free plan, no script to maintain.\u003C\u002Fp>\n\u003Ca class=\"fmstr-cmp-tmpl-midcta__cta\" href=\"https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up\" style=\"background: #7f56d9 !important; color: #ffffff !important; border-color: #7f56d9 !important; text-decoration: none !important;\">Start free on Formester\u003C\u002Fa>\n\u003Cp class=\"fmstr-cmp-tmpl-midcta__strip\">Free forever plan\u003Cspan>&bull;\u003C\u002Fspan>No credit card\u003Cspan>&bull;\u003C\u002Fspan>Setup in 2 minutes\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-tmpl-faq a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-faq {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-600: #6941c6;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0; --c-chip-bg: #f4f4f7;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important; overflow-x: hidden; -webkit-text-size-adjust: 100%;}\n.fmstr-cmp-tmpl-faq *, .fmstr-cmp-tmpl-faq *::before, .fmstr-cmp-tmpl-faq *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-faq__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-faq__h2 { font-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important; letter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1); text-align: left; }\n.fmstr-cmp-tmpl-faq__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 28px !important; text-align: left; }\n.fmstr-cmp-tmpl-faq__list { display: flex; flex-direction: column; gap: 12px; }\n.fmstr-cmp-tmpl-faq__item {\nbackground: var(--c-card); border: 1px solid var(--c-border);\nborder-radius: 14px; box-shadow: var(--c-shadow); overflow: hidden;\n}\n.fmstr-cmp-tmpl-faq__item > summary {\npadding: 18px 22px; cursor: pointer; font-weight: 600; font-size: 16.5px;\ncolor: var(--c-fg-1); display: flex; align-items: center; gap: 14px;\nlist-style: none;\n}\n.fmstr-cmp-tmpl-faq__item > summary::-webkit-details-marker { display: none; }\n.fmstr-cmp-tmpl-faq__item > summary::before {\ncontent: \"\"; width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0;\nbackground-color: var(--c-chip-bg);\nbackground-image: url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' width='14' height='14' viewBox='0 0 14 14' fill='none' stroke='%2375747f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5l4 4 4-4'\u002F%3E%3C\u002Fsvg%3E\");\nbackground-repeat: no-repeat; background-position: center;\ntransition: transform .15s ease, background-color .15s ease;\n}\n.fmstr-cmp-tmpl-faq__item[open] > summary::before { transform: rotate(180deg); background-color: var(--c-tint); }\n.fmstr-cmp-tmpl-faq__item[open] > summary { color: var(--c-violet-600) !important; }\n.fmstr-cmp-tmpl-faq__answer { padding: 0 22px 22px 64px; color: var(--c-fg-2); font-size: 15.5px; line-height: 1.7; }\n.fmstr-cmp-tmpl-faq__answer a { color: var(--c-violet-600) !important; text-decoration: none !important; font-weight: 600; }\n.fmstr-cmp-tmpl-faq__answer a:hover { text-decoration: underline !important; }\n.fmstr-cmp-tmpl-faq__answer code {\nbackground: var(--c-chip-bg); padding: 1px 6px; border-radius: 5px;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 13.5px; color: var(--c-violet-600);\nborder: 1px solid var(--c-border);\n}\n\n@media (max-width: 760px) {\n.fmstr-cmp-tmpl-faq { padding: 40px 16px; }\n.fmstr-cmp-tmpl-faq__intro { font-size: 15.5px !important; text-align: left; }\n.fmstr-cmp-tmpl-faq__item > summary { padding: 16px 16px; font-size: 15.5px; gap: 12px; }\n.fmstr-cmp-tmpl-faq__item > summary::before { width: 26px; height: 26px; }\n.fmstr-cmp-tmpl-faq__answer { padding: 0 16px 18px 16px; font-size: 15px; line-height: 1.65; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-faq img, .fmstr-cmp-tmpl-faq table, .fmstr-cmp-tmpl-faq pre, .fmstr-cmp-tmpl-faq iframe, .fmstr-cmp-tmpl-faq video { max-width: 100%; }\n.fmstr-cmp-tmpl-faq > * { min-width: 0; }\n.fmstr-cmp-tmpl-faq [class*='__grid'] > *, .fmstr-cmp-tmpl-faq [class*='__list'] > *, .fmstr-cmp-tmpl-faq [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-faq pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-faq table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-faq\" aria-labelledby=\"fmstr-cmp-tmpl-faq-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__container\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-faq__h2\" id=\"fmstr-cmp-tmpl-faq-h2\">Frequently asked questions\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-faq__intro\">Common questions about routing HTML form data into Google Sheets for free.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__list\">\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Is it really free to send HTML form data to Google Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Yes. Google Apps Script is free with any Google account, with the rate limit of one Sheets write per second per user. Google Forms is free. Formester's free plan includes unlimited submissions. You only start paying when your volume crosses Google's API quota or a builder's free-plan cap.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>How secure is form data in Google Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Google encrypts data at rest and in transit. The risk is in sharing and CSV injection, not the storage. Lock down sharing to specific accounts, do not share by link, neutralize formula characters on input (the script above does this), and never use a Sheet for payment data or passwords.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>What is the rate limit on Apps Script writes to Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Roughly 100 requests per 100 seconds per user, per Google's published quotas. For a contact form that allows a sustained one submission per second, with bursts handled by retries.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Can I send file uploads from the form into Google Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Sheets cannot hold a file, but it can hold a link. With Apps Script, you can write the file to Google Drive and write the Drive URL into the cell. With a no-code builder, the \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002F\">file upload field in Formester\u003C\u002Fa> handles this and stores the file separately.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>How do I add CAPTCHA or spam protection?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">The script above includes a honeypot field. For more, add Google reCAPTCHA v3 on the client and verify the token server-side before writing to the Sheet. Builders ship CAPTCHA, rate limiting, and IP blocks as a toggle.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>How do I get an email when someone submits the form?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Add \u003Ccode>MailApp.sendEmail({ to: 'you@example.com', subject: 'New form submission', body: JSON.stringify(e.parameter) })\u003C\u002Fcode> inside the \u003Ccode>doPost\u003C\u002Fcode> function in the script. Or use the \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fautoresponder-email\u002F\">autoresponder feature\u003C\u002Fa> in Formester and skip the code.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Can I use this on Netlify, Vercel, or any static site?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Yes. The Apps Script deployment URL is just a \u003Ccode>fetch\u003C\u002Fcode> target. It works from any frontend, hosted anywhere, with no backend on your side.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Can I move from this setup to a database later?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Easily. Sheets is a great starter store. When you cross a few hundred submissions a week, route the same form to a database or CRM in parallel with the Sheet. Most CRMs ship a Google Sheets sync, so you can keep the Sheet for the team and the CRM for the system of record.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-tmpl-rel a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-rel {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0;\n--c-shadow: 0 4px 20px rgba(16,24,40,.06);\n\nbackground: transparent;\npadding: 56px 24px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important; overflow-x: hidden; -webkit-text-size-adjust: 100%;}\n.fmstr-cmp-tmpl-rel *, .fmstr-cmp-tmpl-rel *::before, .fmstr-cmp-tmpl-rel *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-rel__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-rel__head { margin: 0 0 28px !important; text-align: left; }\n.fmstr-cmp-tmpl-rel__h2 { font-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important; letter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1); text-align: left; }\n.fmstr-cmp-tmpl-rel__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 0 !important; text-align: left; }\n\n.fmstr-cmp-tmpl-rel__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n.fmstr-cmp-tmpl-rel__card {\nbackground: var(--c-card); border: 1px solid var(--c-border);\nborder-radius: 14px; padding: 20px 22px; display: flex; flex-direction: column; gap: 8px;\ntext-decoration: none !important; color: inherit !important; transition: all .15s ease;\nposition: relative;\n}\n.fmstr-cmp-tmpl-rel__card:hover { border-color: var(--c-edge); box-shadow: var(--c-shadow); transform: translateY(-1px); }\n.fmstr-cmp-tmpl-rel__chip {\ndisplay: inline-block; padding: 3px 10px; border-radius: 9999px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\ncolor: var(--c-violet-600); font-size: 11.5px; font-weight: 600; letter-spacing: .02em;\ntext-transform: uppercase; align-self: flex-start;\nmargin-bottom: 2px;\n}\n.fmstr-cmp-tmpl-rel__title {\nfont-size: 16px !important; font-weight: 700 !important; color: var(--c-fg-1); margin: 0 !important; line-height: 1.3 !important; text-align: left; }\n.fmstr-cmp-tmpl-rel__body { font-size: 14.5px !important; line-height: 1.55 !important; color: var(--c-fg-2); margin: 0 !important; }\n.fmstr-cmp-tmpl-rel__arrow {\nmargin-top: 6px; color: var(--c-violet-600); font-size: 14px; font-weight: 600;\ndisplay: inline-flex; align-items: center; gap: 6px;\n}\n.fmstr-cmp-tmpl-rel__arrow::after {\ncontent: \"\\2192\"; transition: transform .15s ease; display: inline-block;\n}\n.fmstr-cmp-tmpl-rel__card:hover .fmstr-cmp-tmpl-rel__arrow::after { transform: translateX(3px); }\n\n@media (max-width: 880px) { .fmstr-cmp-tmpl-rel__grid { grid-template-columns: 1fr 1fr; gap: 14px; } }\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-rel { padding: 40px 16px; }\n.fmstr-cmp-tmpl-rel__grid { grid-template-columns: 1fr; gap: 12px; }\n.fmstr-cmp-tmpl-rel__card { padding: 18px 20px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-rel img, .fmstr-cmp-tmpl-rel table, .fmstr-cmp-tmpl-rel pre, .fmstr-cmp-tmpl-rel iframe, .fmstr-cmp-tmpl-rel video { max-width: 100%; }\n.fmstr-cmp-tmpl-rel > * { min-width: 0; }\n.fmstr-cmp-tmpl-rel [class*='__grid'] > *, .fmstr-cmp-tmpl-rel [class*='__list'] > *, .fmstr-cmp-tmpl-rel [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-rel pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-rel table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-rel\" aria-labelledby=\"fmstr-cmp-tmpl-rel-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-rel__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-rel__head\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-rel__h2\" id=\"fmstr-cmp-tmpl-rel-h2\">More on connecting forms to Google Sheets\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__intro\">More on connecting forms to Google Sheets, building APIs around them, and picking the right builder.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"fmstr-cmp-tmpl-rel__grid\">\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fbest-form-builders-compatible-with-google-sheets\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">Listicle\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">Best form builders compatible with Google Sheets\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Side-by-side on price, sync mode, and field mapping.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-link-google-sheets-to-google-forms\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">How-to\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">How to link Google Sheets to Google Forms\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">The 2-minute setup for the Google Forms route.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-pre-fill-forms-using-google-sheets-and-formester\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">How-to\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">Pre-fill forms using Google Sheets and Formester\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Reverse the flow: pull Sheet data into a form before it loads.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-link-squarespace-forms-to-google-sheets\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">How-to\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">How to link Squarespace forms to Google Sheets\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Same idea, scoped to a Squarespace site.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fintegrations\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">Formester\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">Google Sheets integration\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Native sync with OAuth, header mapping, and retries handled.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Open\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n","blog\u002Fblog\u002Fhow-to-send-contact-form-data-to-google-sheets-free.md",{"text":322},"9 min read",1788363426142]