The short answer
Google Forms and RG Forms both put responses into a Google Sheet, but they solve different halves of the problem. Google Forms is a form builder: it creates and hosts the form itself, gives you a drag-and-drop editor, question types, response charts and quiz logic, and you share a link or embed it in an iframe — so the form looks like Google Forms, not like your site. RG Forms is a form backend: you write your own HTML form, styled however you like, and it POSTs to an endpoint that appends rows to your sheet. Use Google Forms for surveys and internal collection; use RG Forms when the form is part of your website's design.
Side by side
| Google Forms | RG Forms | |
|---|---|---|
| What it is | A form builder that hosts the form | A backend for a form you build |
| Who designs the form | Google, from your questions | You, in your own HTML and CSS |
| How it appears on your site | An iframe embed, or a link out | Native markup — it is part of your page |
| Styling control | Theme colour, font and header image | Complete — it is your CSS |
| Question types | Rich: multiple choice, grids, file upload, scales, sections, branching | Text, email, tel, textarea, select |
| File uploads | Yes, for signed-in Google users | No |
| Where responses go | A linked Google Sheet | A Google Sheet in your Drive |
| Setup effort | Minutes, no code | Minutes, plus pasting a form into your page |
| Cost | Free | Free |
The embed problem
You can embed a Google Form in your site, and plenty of people do. The trade-offs are consistent: it arrives in an iframe with Google’s own styling, a fixed height that fights with responsive layouts, its own scrollbar on mobile, and a “Never submit passwords through Google Forms” notice that looks out of place on a polished marketing page.
On a landing page where the contact form is part of the design, it’s noticeable. On an internal survey nobody cares — and that’s exactly the point about which tool fits which job.
Where Google Forms is clearly better
Surveys and questionnaires. Rating scales, matrix questions, section branching, response summaries with charts built in. RG Forms has none of that and isn’t trying to.
Non-technical creators. No HTML anywhere. If the person building it doesn’t write code, this is the answer.
File collection. Google Forms can accept uploads into Drive (from signed-in Google users). RG Forms handles text only.
Quizzes and internal workflows. Auto-grading, response validation, notifications to collaborators — mature features that come free.
Where RG Forms is clearly better
When the form is part of your site. Your fonts, your spacing, your colours, your validation, your success message — no iframe, no visual seam, no jump to a Google-branded page.
When you care about conversion. A native form on the page consistently outperforms an embed that looks like it belongs to a different website.
When you want in-page success states. Submit, see “Thanks — we’ll be in touch”, stay exactly where you were. No redirect, no reload.
When it’s a client site. “Contact form” and “Google Form embed” are different deliverables, and clients can tell.
What “part of your site” means in practice
This is your markup and your CSS. Nothing about it says Google.
<form id="contact-form">
<label>Name <input name="name" required /></label>
<label>Email <input type="email" name="email" required /></label>
<label>Message <textarea name="message" required></textarea></label>
<!-- Honeypot: humans never see it, bots fill it in -->
<input type="text" name="_hp" tabindex="-1" autocomplete="off"
style="position:absolute;left:-9999px" aria-hidden="true" />
<button type="submit">Send</button>
<p id="form-status" role="status"></p>
</form>
<script>
const ENDPOINT = "https://script.google.com/macros/s/AKfycb.../exec";
const form = document.getElementById("contact-form");
const status = document.getElementById("form-status");
form.addEventListener("submit", async (event) => {
event.preventDefault();
status.textContent = "Sending…";
const res = await fetch(ENDPOINT, {
method: "POST",
// text/plain avoids the CORS preflight Apps Script can't answer
headers: { "Content-Type": "text/plain" },
body: JSON.stringify({
tab: "contact",
fields: Object.fromEntries(new FormData(form)),
}),
});
const data = await res.json();
status.textContent =
data.result === "success" ? "Thanks — we'll be in touch." : "Something went wrong.";
if (data.result === "success") form.reset();
});
</script>Common questions
Can I style a Google Form to match my site?
You can set a theme colour, a font and a header image. You can’t restyle the layout, the buttons or the surrounding chrome — it stays recognisably a Google Form.
Do both put data in the same kind of sheet?
Effectively yes. Google Forms links responses to a sheet it creates; RG Forms appends rows to a sheet it provisions. Both are ordinary Google Sheets in your Drive.
Which is better for accessibility?
Google Forms is competently accessible out of the box. A hand-built form can be better — proper labels, fieldsets, live-region status messages — but only if you actually do that work. If you won’t, the embed is the safer choice.
Can I use Google Forms without an iframe?
People do POST directly to a Google Form’s response URL using the field entry IDs. It works until Google changes something, it breaks silently when it does, and there’s no support for it. A purpose-built endpoint is the sturdier path.
More answers in the full FAQ.