Automate Google Forms: Create, Modify and Analyse Responses with Apps Script

Apps Script's FormApp lets you create and modify Google Forms entirely in code, and build powerful workflows around form responses — all without touching the Forms UI.

Create a form programmatically

function createForm() { const form = FormApp.create('Customer Feedback Survey'); form.setDescription('Help us improve by sharing your feedback.'); form.setConfirmationMessage('Thank you! Your response has been recorded.'); form.setCollectEmail(true); // Short answer form.addTextItem() .setTitle('Your Name') .setRequired(true); // Multiple choice form.addMultipleChoiceItem() .setTitle('How satisfied are you?') .setChoiceValues(['Very satisfied', 'Satisfied', 'Neutral', 'Dissatisfied']) .setRequired(true); // Scale / Linear scale form.addScaleItem() .setTitle('Rate our service (1-10)') .setBounds(1, 10) .setRequired(true); // Paragraph form.addParagraphTextItem() .setTitle('Any additional comments?'); Logger.log('Form created: ' + form.getPublishedUrl()); return form; }

Add a section with a page break

function addSectionToForm() { const form = FormApp.openById('YOUR_FORM_ID'); form.addPageBreakItem() .setTitle('Section 2: Product Feedback') .setHelpText('Tell us about the specific product you purchased.'); form.addCheckboxItem() .setTitle('Which features did you use?') .setChoiceValues(['Analytics', 'Reporting', 'Integrations', 'API Access']); }

Read all form responses

function readFormResponses() { const form = FormApp.openById('YOUR_FORM_ID'); const responses = form.getResponses(); Logger.log(`Total responses: ${responses.length}`); responses.forEach((response, i) => { Logger.log(`\nResponse ${i + 1}${response.getTimestamp()}`); response.getItemResponses().forEach(itemResponse => { Logger.log(` Q: ${itemResponse.getItem().getTitle()}`); Logger.log(` A: ${itemResponse.getResponse()}`); }); }); }

Export responses to a Google Sheet

function exportResponsesToSheet() { const form = FormApp.openById('YOUR_FORM_ID'); const responses = form.getResponses(); const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.clearContents(); if (responses.length === 0) { Logger.log('No responses found.'); return; } // Build header from first response's items const headers = ['Timestamp', ...responses[0].getItemResponses().map(r => r.getItem().getTitle())]; sheet.appendRow(headers); responses.forEach(response => { const row = [ response.getTimestamp(), ...response.getItemResponses().map(r => r.getResponse()), ]; sheet.appendRow(row); }); Logger.log(`Exported ${responses.length} responses.`); }

Trigger on form submit

Use an onFormSubmit trigger to run code every time someone submits the form:

function onFormSubmit(e) { const response = e.response; const itemResponses = response.getItemResponses(); // Find the email answer const emailItem = itemResponses.find(r => r.getItem().getTitle().toLowerCase().includes('email') ); const email = emailItem ? emailItem.getResponse() : null; if (email) { GmailApp.sendEmail( email, 'We received your feedback!', 'Thank you for taking the time to share your thoughts. We truly appreciate it.' ); Logger.log('Confirmation email sent to: ' + email); } } function createFormTrigger() { const form = FormApp.openById('YOUR_FORM_ID'); ScriptApp.newTrigger('onFormSubmit') .forForm(form) .onFormSubmit() .create(); }

Pre-fill a form URL with data

function getPrefilledUrl() { const form = FormApp.openById('YOUR_FORM_ID'); const items = form.getItems(); // Create a response with pre-filled values const formResponse = form.createResponse(); items.forEach(item => { if (item.getTitle() === 'Your Name' && item.getType() === FormApp.ItemType.TEXT) { formResponse.withItemResponse( item.asTextItem().createResponse('Alice Smith') ); } }); Logger.log('Pre-filled URL: ' + formResponse.toPrefilledUrl()); }

Tips

  • FormApp.create() creates the form in the script owner's Drive root folder.
  • Form item types: TEXT, PARAGRAPH_TEXT, MULTIPLE_CHOICE, CHECKBOX, LIST, SCALE, DATE, TIME, GRID, FILE_UPLOAD.
  • form.setLimitOneResponsePerUser(true) requires respondents to sign in with a Google account.
  • getResponses() returns all responses — for large forms, use getResponses(timestamp) to fetch only responses after a certain date.