Creating client proposals manually can be time-consuming — especially if you receive multiple requests every week.
In this tutorial, I’ll show you how to automate proposal generation using Google Forms, Google Sheets, and Google Apps Script.
By the end of this guide, you’ll have a working system that:
- Takes client data through a Google Form
- Automatically generates a PDF proposal
- Sends it directly to the client’s email, and
- Saves the document in your Google Drive for record-keeping.
Tools You’ll Need
- Google Account (with access to Drive, Forms, and Sheets)
- Basic familiarity with Google Apps Script (JavaScript-based)
- Optional: Google Docs template for proposal layout
Step 1: Create a Google Form
- Open Google Forms
- Add these fields:
- Client Name
- Company Name
- Company Address
- Client Email
- Under the “Responses” tab, click the Google Sheets icon to link responses to a spreadsheet. This Sheet will store all form submissions.
Step 2: Create a Proposal Template
- Open Google Docs
- Write your proposal content. Replace variable parts with placeholders, for example:
Dear {{ClientName}},
Thank you for your interest in our services at Meja Daring.
Here’s the proposal for your company, {{CompanyName}}.
Best regards,
Meja Daring
Save the document and copy its Document ID (you can find it in the URL after /d/).
Step 3: Open Apps Script from Google Sheets
- In your linked Google Sheet, go to Extensions → Apps Script.
- Delete the default code and paste this starter script:
function onFormSubmit(e) {
try {
const named = e.namedValues;
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('YOUR_SHEET_NAME');
const row = e.range ? e.range.getRow() : sheet.getLastRow();
const TEMPLATE_ID = 'YOUR_DOC_TEMPLATE_ID';
const DEST_FOLDER_ID = 'YOUR_FOLDER_ID';
const LINK_COLUMN = 6; // change the field number to your pdf link field
const folder = DriveApp.getFolderById(DEST_FOLDER_ID);
const templateFile = DriveApp.getFileById(TEMPLATE_ID);
// create template copy in the target folder
const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd-HHmmss');
const copyName = `Generated-${timestamp}`;
const copyFile = templateFile.makeCopy(copyName, folder);
const copyId = copyFile.getId();
// open copy document, change placeholder using value form form
const doc = DocumentApp.openById(copyId);
const body = doc.getBody();
for (let key in named) {
const placeholder = `{{${key}}}`;
const value = (named[key] && named[key][0]) ? named[key][0] : '';
body.replaceText(placeholder, value);
}
doc.saveAndClose();
// conversion to PDF and saving
const pdfBlob = DriveApp.getFileById(copyId).getAs(MimeType.PDF).setName(`${copyName}.pdf`);
const pdfFile = folder.createFile(pdfBlob);
// optional: delete/move to trash Google Doc intermediate
DriveApp.getFileById(copyId).setTrashed(true);
// create share link (anyone with link can view) than change to direct-download URL
pdfFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
const downloadUrl = `https://drive.google.com/uc?export=download&id=${pdfFile.getId()}`; //for auto download when clicked
// tulis link ke sheet pada baris submit yang sesuai
sheet.getRange(row, LINK_COLUMN).setValue(downloadUrl);
// optional: kirim email ke responden jika kamu punya field 'Email'
if (named['Clien Email'] && named['Client Email'][0]) {
MailApp.sendEmail({
to: named['Clien Email'][0],
subject: 'Offering Virtual Assistant Service by Me',
htmlBody: `
<div>
<p>To <b>${named['Client Name'][0]}</b>,</p>
Let me introduce myself, we're from <b>Meja Daring</b>, a professional digital services provider.
Through this email, we'd like to offer our <b>Virtual Assistant</b> services to help you efficiently manage various administrative, communication, and routine work needs.</p>
<p><b>Advantages of Meja Daring's Virtual Assistant service:</b></p>
<ul>
<li>Professional email, schedule, and document management.</li>
<li>Business communication support (chat, email, online meetings).</li>
<li>Neat and structured recording of reports and data.</li>
<li>Flexible services tailored to your needs.</li>
</ul>
<p>To provide a clearer picture, we have prepared an official offering document which you can download via the following link:</p>
<p><a href="${downloadUrl}" style="background: #0066cc; color: #fff; padding: 10px 15px; text-decoration: none; border-radius: 5px;">📥 Unduh Penawaran PDF</a></p>
<p>With our team's support, you can focus more on strategic matters, while routine work is handled professionally.</p>
<p>If you have any questions or special needs, please feel free to reply to this email or contact us.</p>
<p>Sincerely,<br><br>
<b>My Team</b><br>
Website: <a href="#">https://my-website.com</a></p>
</div>
`
});
}
} catch (err) {
Logger.log('Error onFormSubmit: ' + err);
}
}
- Replace:
-
YOUR_SHEET_NAME
→ your sheet name -
YOUR_DOC_TEMPLATE_ID
→ your Google Docs template ID -
YOUR_FOLDER_ID
→ the folder ID in Google Drive where PDFs will be stored -
[Client Name]
→ your client name field
-
Step 4: Set the Trigger
- In Apps Script, click the clock icon (Triggers).
- Add a new trigger:
- Choose function:
onFormSubmit
- Event type:
From form → On form submit
This ensures the script runs automatically every time a client submits the form.
- Choose function:
Step 5: Test the System
- Submit a test entry via your Google Form.
- Wait a few seconds.
- Check:
- Your Drive → PDF generated inside your output folder
- Your email → PDF sent to the client’s address
- Your Sheet → (optional) download link to the PDF If all works, congratulations — you’ve built your own Smart Document Generator!
Step 6: Optional Enhancements
Here are some ways you can expand this system:
- Add your company logo and signature to the template
- Include service pricing tables or dynamic proposal text
- Send WhatsApp notifications using external APIs
- Store proposals in a database for analytics
Conclusion
You now have a working automation that:
- Collects client info,
- Generates custom proposals,
- Sends them automatically,
- And archives everything for you. It’s a small, free, but powerful example of what Google’s ecosystem can do with a bit of scripting.
Related Reading:
Read the full case study on Medium:
How I Built a Simple Smart Document Generator Using Google Forms and Apps Script
Top comments (0)