To use this template, please follow this tutorial to set up the automation
Google Apps Script can automate Google Workspace products with JavaScript, Google Forms service can create/manage forms, installable form-submit triggers can run code after a form response, and MailApp can send emails from the authorized account.
Apps Script code
Replace YOUR_EMAIL@gmail.com first.
const CONFIG = { formTitle: 'Contact Request Form', ownerEmail: 'YOUR_EMAIL@gmail.com', ownerName: 'Your Website Name', emailSubjectToSender: 'We received your message', emailSubjectToOwner: 'New Google Form submission'};function setupAutoEmailForm() { deleteExistingProjectTriggers_(); const form = FormApp.create(CONFIG.formTitle); form.setDescription('Fill this form and you will receive an automatic email confirmation.'); form.setConfirmationMessage('Thank you. Please check your email for confirmation.'); form.setAcceptingResponses(true); const emailValidation = FormApp.createTextValidation() .requireTextIsEmail() .setHelpText('Please enter a valid email address.') .build(); form.addTextItem() .setTitle('Name') .setRequired(true); form.addTextItem() .setTitle('Email') .setRequired(true) .setValidation(emailValidation); form.addParagraphTextItem() .setTitle('Message') .setRequired(true); const sheet = SpreadsheetApp.create(`${CONFIG.formTitle} Responses`); form.setDestination(FormApp.DestinationType.SPREADSHEET, sheet.getId()); PropertiesService.getScriptProperties().setProperties({ FORM_ID: form.getId(), SHEET_ID: sheet.getId() }); ScriptApp.newTrigger('sendEmailOnSubmit') .forForm(form) .onFormSubmit() .create(); Logger.log('Form edit URL: ' + form.getEditUrl()); Logger.log('Form public URL: ' + form.getPublishedUrl()); Logger.log('Responses sheet URL: ' + sheet.getUrl());}function sendEmailOnSubmit(e) { if (!e || !e.response) { throw new Error('This function must run from the form submit trigger.'); } const answers = getAnswers_(e.response); const name = answers['Name'] || 'there'; const email = answers['Email']; const message = answers['Message'] || ''; if (!email) { throw new Error('Email field is missing.'); } const senderHtml = ` <p>Hi ${escapeHtml_(name)},</p> <p>Thank you for contacting us. We received your message:</p> <blockquote>${escapeHtml_(message).replace(/\n/g, '<br>')}</blockquote> <p>We will reply as soon as possible.</p> `; MailApp.sendEmail({ to: email, subject: CONFIG.emailSubjectToSender, htmlBody: senderHtml, body: `Hi ${name},\n\nThank you for contacting us. We received your message:\n\n${message}\n\nWe will reply as soon as possible.`, name: CONFIG.ownerName, replyTo: CONFIG.ownerEmail }); const ownerHtml = ` <p>New form submission:</p> <ul> <li><strong>Name:</strong> ${escapeHtml_(name)}</li> <li><strong>Email:</strong> ${escapeHtml_(email)}</li> </ul> <p><strong>Message:</strong></p> <blockquote>${escapeHtml_(message).replace(/\n/g, '<br>')}</blockquote> `; MailApp.sendEmail({ to: CONFIG.ownerEmail, subject: CONFIG.emailSubjectToOwner, htmlBody: ownerHtml, body: `New form submission:\n\nName: ${name}\nEmail: ${email}\nMessage:\n${message}`, replyTo: email });}function getAnswers_(formResponse) { const answers = {}; formResponse.getItemResponses().forEach((itemResponse) => { const title = itemResponse.getItem().getTitle(); const answer = itemResponse.getResponse(); answers[title] = Array.isArray(answer) ? answer.join(', ') : String(answer || ''); }); return answers;}function deleteExistingProjectTriggers_() { ScriptApp.getProjectTriggers().forEach((trigger) => { if (trigger.getHandlerFunction() === 'sendEmailOnSubmit') { ScriptApp.deleteTrigger(trigger); } });}function escapeHtml_(value) { return String(value) .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, ''');}function showLinks() { const props = PropertiesService.getScriptProperties(); const form = FormApp.openById(props.getProperty('FORM_ID')); const sheet = SpreadsheetApp.openById(props.getProperty('SHEET_ID')); Logger.log('Form edit URL: ' + form.getEditUrl()); Logger.log('Form public URL: ' + form.getPublishedUrl()); Logger.log('Responses sheet URL: ' + sheet.getUrl());}