I built the CMR Printer as a hands-on project to explore and expand my skills in automation and web development. Designed for a small, family-run business, this tool isn’t about flashy features—it’s about practical, cost-effective solutions that work. Along the way, I’ve learned a great deal about Google Apps Script, Google Docs templating, and responsive design with Bootstrap.
This project is a snapshot of my ongoing learning process—a practical experiment that not only serves a real need but also helps me master new technologies. I’m excited to keep refining the CMR Printer and to share more of my journey as I continue to build and learn.
Automated Document Generation: With a few clicks in a clean, Bootstrap-styled modal, users can generate transport documents (CMRs) instantly. I’ve set it up to replace placeholders in a preconfigured Google Docs template, making the whole process smooth and efficient.
Dynamic Data Handling: The tool automatically saves new shippers, consignees, and pickup locations. This self-learning feature means that every use not only solves a problem but also improves the system for future tasks.
Practical & Straightforward: No over-engineered bells and whistles here—just a low-cost, effective solution that meets real-world needs.
Working on this project has been a journey of self-teaching and experimentation. I dove into:
Google Apps Script: To manage backend logic and automate document creation.
Google Docs Templating: To build a flexible template that handles multiple pages with different watermarks.
Google Sheets Data Storage: To make this tool learn by itself it loads data on start-up from a Google Sheets source. When new consignees are added, it automatically updates the Google Sheet accordingly.
Bootstrap & Web Design: To craft a simple, user-friendly interface that keeps the focus on functionality.
The CMR Printer is designed as a low-cost, practical solution. It automates document creation by pulling data from Google Sheets, dynamically populating a Google Docs template, and outputting a ready-to-print PDF. Every time the app runs, it "learns" by saving new shippers, destinations, and reroute details, which continuously refines the system.
Elegant Code Architecture:
My code is now refactored and well-documented, making it easier to maintain and expand. Modular functions handle specific tasks—fetching data, creating dynamic documents, and updating Google Sheets—while template literals and modern JavaScript conventions keep the code concise.
Dynamic Data Handling:
Data from three Google Sheets (Senders, Destinations, and Reroutes) is read and injected into a Google Docs template. This ensures that each generated document reflects the latest available information.
Automated Document Generation:
Using Google Apps Script, the project creates a copy of a preconfigured Google Docs file, replaces placeholders with form inputs (such as sender and destination details), and finally produces a PDF URL for easy printing.
Responsive, User-Friendly Interface:
The web app is built using a Bootstrap modal for a clean, responsive user experience. The interface supports dynamic form fields, such as a calendar-based pickup date selector and additional input fields when creating new destinations or reroutes.
Working on this project has been a rewarding blend of real-world problem solving and self-education. I’ve explored:
Google Apps Script: Automating tasks and integrating multiple Google services.
Google Docs Templating: Overcoming limitations (like handling multiple watermark pages) with creative solutions.
Modern Web Development: Designing a responsive interface with Bootstrap and integrating a calendar date picker.
Data-Driven Enhancements: Implementing self-learning mechanisms that let the app evolve based on everyday use.
Every piece of the project—from elegant code in Code.gs to the interactive HTML template—reflects my continuous effort to learn and implement best practices in automation and web development.
The CMR Printer isn’t just a tool for generating transport documents; it’s a personal testament to my journey as a self-taught developer. It’s built for practicality, simplicity, and continuous improvement—qualities that I value deeply. I’m excited to continue refining this project, and I look forward to applying these skills to future challenges.