<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jessy Mutaj Hifjudin</title>
    <description>The latest articles on DEV Community by Jessy Mutaj Hifjudin (@kangjessy).</description>
    <link>https://dev.to/kangjessy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3544626%2F11050ae9-aa83-44d3-ab6a-f28334d009d8.jpg</url>
      <title>DEV Community: Jessy Mutaj Hifjudin</title>
      <link>https://dev.to/kangjessy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kangjessy"/>
    <language>en</language>
    <item>
      <title>Automating Client Proposal Generation with Google Forms, Sheets, and Apps Script (Step-by-Step Guide)</title>
      <dc:creator>Jessy Mutaj Hifjudin</dc:creator>
      <pubDate>Sat, 04 Oct 2025 06:20:19 +0000</pubDate>
      <link>https://dev.to/kangjessy/automating-client-proposal-generation-with-google-forms-sheets-and-apps-script-step-by-step-59aj</link>
      <guid>https://dev.to/kangjessy/automating-client-proposal-generation-with-google-forms-sheets-and-apps-script-step-by-step-59aj</guid>
      <description>&lt;p&gt;Creating client proposals manually can be time-consuming — especially if you receive multiple requests every week.&lt;/p&gt;

&lt;p&gt;In this tutorial, I’ll show you how to automate proposal generation using &lt;strong&gt;Google Forms&lt;/strong&gt;, &lt;strong&gt;Google Sheets&lt;/strong&gt;, and &lt;strong&gt;Google Apps Script&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By the end of this guide, you’ll have a working system that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes client data through a Google Form&lt;/li&gt;
&lt;li&gt;Automatically generates a PDF proposal&lt;/li&gt;
&lt;li&gt;Sends it directly to the client’s email, and&lt;/li&gt;
&lt;li&gt;Saves the document in your Google Drive for record-keeping.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools You’ll Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google Account (with access to Drive, Forms, and Sheets)&lt;/li&gt;
&lt;li&gt;Basic familiarity with Google Apps Script (JavaScript-based)&lt;/li&gt;
&lt;li&gt;Optional: Google Docs template for proposal layout&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Google Form
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Google Forms&lt;/li&gt;
&lt;li&gt;Add these fields:

&lt;ul&gt;
&lt;li&gt;Client Name&lt;/li&gt;
&lt;li&gt;Company Name&lt;/li&gt;
&lt;li&gt;Company Address&lt;/li&gt;
&lt;li&gt;Client Email&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Under the “Responses” tab, click the Google Sheets icon to link responses to a spreadsheet.
This Sheet will store all form submissions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Create a Proposal Template
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Google Docs&lt;/li&gt;
&lt;li&gt;Write your proposal content.
Replace variable parts with placeholders, for example:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the document and copy its Document ID (you can find it in the URL after /d/).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Open Apps Script from Google Sheets
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In your linked Google Sheet, go to Extensions → Apps Script.&lt;/li&gt;
&lt;li&gt;Delete the default code and paste this starter script:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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] &amp;amp;&amp;amp; 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&amp;amp;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'] &amp;amp;&amp;amp; named['Client Email'][0]) {
      MailApp.sendEmail({
        to: named['Clien Email'][0],
        subject: 'Offering Virtual Assistant Service by Me',
        htmlBody: `
                &amp;lt;div&amp;gt;
                  &amp;lt;p&amp;gt;To &amp;lt;b&amp;gt;${named['Client Name'][0]}&amp;lt;/b&amp;gt;,&amp;lt;/p&amp;gt;

                  Let me introduce myself, we're from &amp;lt;b&amp;gt;Meja Daring&amp;lt;/b&amp;gt;, a professional digital services provider. 
                  Through this email, we'd like to offer our &amp;lt;b&amp;gt;Virtual Assistant&amp;lt;/b&amp;gt; services to help you efficiently manage various administrative, communication, and routine work needs.&amp;lt;/p&amp;gt;

                  &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Advantages of Meja Daring's Virtual Assistant service:&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;
                                    &amp;lt;ul&amp;gt;
                                        &amp;lt;li&amp;gt;Professional email, schedule, and document management.&amp;lt;/li&amp;gt;
                                        &amp;lt;li&amp;gt;Business communication support (chat, email, online meetings).&amp;lt;/li&amp;gt;
                                        &amp;lt;li&amp;gt;Neat and structured recording of reports and data.&amp;lt;/li&amp;gt;
                                        &amp;lt;li&amp;gt;Flexible services tailored to your needs.&amp;lt;/li&amp;gt;
                                    &amp;lt;/ul&amp;gt;

                  &amp;lt;p&amp;gt;To provide a clearer picture, we have prepared an official offering document which you can download via the following link:&amp;lt;/p&amp;gt;
                  &amp;lt;p&amp;gt;&amp;lt;a href="${downloadUrl}" style="background: #0066cc; color: #fff; padding: 10px 15px; text-decoration: none; border-radius: 5px;"&amp;gt;📥 Unduh Penawaran PDF&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;

                  &amp;lt;p&amp;gt;With our team's support, you can focus more on strategic matters, while routine work is handled professionally.&amp;lt;/p&amp;gt;

                  &amp;lt;p&amp;gt;If you have any questions or special needs, please feel free to reply to this email or contact us.&amp;lt;/p&amp;gt;

                  &amp;lt;p&amp;gt;Sincerely,&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
                                    &amp;lt;b&amp;gt;My Team&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;
                                    Website: &amp;lt;a href="#"&amp;gt;https://my-website.com&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
              `
      });
    }

  } catch (err) {
    Logger.log('Error onFormSubmit: ' + err);
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Replace:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;YOUR_SHEET_NAME&lt;/code&gt; → your sheet name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;YOUR_DOC_TEMPLATE_ID&lt;/code&gt; → your Google Docs template ID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;YOUR_FOLDER_ID&lt;/code&gt; → the folder ID in Google Drive where PDFs will be stored&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[Client Name]&lt;/code&gt; → your client name field&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Set the Trigger
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In Apps Script, click the clock icon (Triggers).&lt;/li&gt;
&lt;li&gt;Add a new trigger:

&lt;ul&gt;
&lt;li&gt;Choose function: &lt;code&gt;onFormSubmit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Event type: &lt;code&gt;From form → On form submit
&lt;/code&gt;This ensures the script runs automatically every time a client submits the form.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 5: Test the System
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Submit a test entry via your Google Form.&lt;/li&gt;
&lt;li&gt;Wait a few seconds.&lt;/li&gt;
&lt;li&gt;Check:

&lt;ul&gt;
&lt;li&gt;Your Drive → PDF generated inside your output folder&lt;/li&gt;
&lt;li&gt;Your email → PDF sent to the client’s address&lt;/li&gt;
&lt;li&gt;Your Sheet → (optional) download link to the PDF
If all works, congratulations — you’ve built your own Smart Document Generator!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 6: Optional Enhancements
&lt;/h3&gt;

&lt;p&gt;Here are some ways you can expand this system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add your company logo and signature to the template&lt;/li&gt;
&lt;li&gt;Include service pricing tables or dynamic proposal text&lt;/li&gt;
&lt;li&gt;Send WhatsApp notifications using external APIs&lt;/li&gt;
&lt;li&gt;Store proposals in a database for analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;You now have a working automation that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collects client info,&lt;/li&gt;
&lt;li&gt;Generates custom proposals,&lt;/li&gt;
&lt;li&gt;Sends them automatically,&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Related Reading:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read the full case study on Medium:&lt;br&gt;
&lt;a href="https://kangjessy.medium.com/bagaimana-saya-membuat-sistem-penawaran-otomatis-menggunakan-google-forms-dan-apps-script-3b08aa7cd779" rel="noopener noreferrer"&gt;How I Built a Simple Smart Document Generator Using Google Forms and Apps Script&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlesheet</category>
      <category>googleform</category>
      <category>googleappsscript</category>
      <category>appsscript</category>
    </item>
  </channel>
</rss>
