DEV Community

Jessy Mutaj Hifjudin
Jessy Mutaj Hifjudin

Posted on

Automating Client Proposal Generation with Google Forms, Sheets, and Apps Script (Step-by-Step Guide)

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

  1. Open Google Forms
  2. Add these fields:
    • Client Name
    • Company Name
    • Company Address
    • Client Email
  3. 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

  1. Open Google Docs
  2. 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
Enter fullscreen mode Exit fullscreen mode

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

  1. In your linked Google Sheet, go to Extensions → Apps Script.
  2. 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);
  }
}

Enter fullscreen mode Exit fullscreen mode
  1. 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

  1. In Apps Script, click the clock icon (Triggers).
  2. 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.

Step 5: Test the System

  1. Submit a test entry via your Google Form.
  2. Wait a few seconds.
  3. 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)