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
functioncreateForm(){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
functionaddSectionToForm(){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']);}
functionexportResponsesToSheet(){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 itemsconst 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:
functiononFormSubmit(e){const response = e.response;const itemResponses = response.getItemResponses();// Find the email answerconst 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);}}functioncreateFormTrigger(){const form =FormApp.openById('YOUR_FORM_ID');ScriptApp.newTrigger('onFormSubmit').forForm(form).onFormSubmit().create();}
Pre-fill a form URL with data
functiongetPrefilledUrl(){const form =FormApp.openById('YOUR_FORM_ID');const items = form.getItems();// Create a response with pre-filled valuesconst 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.