Monday, September 1, 2025

Interactive Tool - Blog Post

Interactive Tool

A powerful browser-based utility for enhanced productivity

About This Tool

This browser-based tool provides powerful functionality with a clean, intuitive interface. Built with modern web technologies and optimized for blog embedding, it offers a seamless user experience across all devices.

Features

Key features that make this tool exceptional:

User-friendly interface - Clean and intuitive design

Real-time processing - Instant updates and feedback

Browser-based - No downloads or installations required

Mobile responsive - Works perfectly on all devices

Blog-safe code - Optimized for embedding in blog platforms

Try It Out

Here's the interactive tool ready for use:

📄 Apps Script Generator

Generate Google Apps Script code for PDF invoice export

Configuration

Name of the sheet containing your invoice data
Range to export (e.g., A1:G, B1:H20)
Cell containing customer name
Cell containing invoice number
Column to check for last data row
Starting row for last data detection
Google Drive folder to save PDFs
Cell to store PDF link

Generated Code

Click "Generate Script" to create your custom Google Apps Script code...
function toggleEmailSection() { const emailSection = document.getElementById('emailSection'); const sendEmailCheckbox = document.getElementById('sendEmail'); if (sendEmailCheckbox.checked) { emailSection.style.display = 'block'; } else { emailSection.style.display = 'none'; } } // Add event listener to show/hide email section document.getElementById('sendEmail').addEventListener('change', toggleEmailSection); function generateScript() { try { var config = { sheetName: document.getElementById('sheetName').value || 'Invoice', exportRange: document.getElementById('exportRange').value || 'B1:H', customerNameCell: document.getElementById('customerNameCell').value || 'B3', invoiceNumberCell: document.getElementById('invoiceNumberCell').value || 'F3', lastRowColumn: document.getElementById('lastRowColumn').value || 'G', lastRowStart: document.getElementById('lastRowStart').value || '40', folderName: document.getElementById('folderName').value || 'InvoiceFolder', pdfLinkCell: document.getElementById('pdfLinkCell').value || 'M5', portrait: document.getElementById('portrait').checked, fitWidth: document.getElementById('fitWidth').checked, gridlines: document.getElementById('gridlines').checked, frozenRows: document.getElementById('frozenRows').checked, addThankYou: document.getElementById('addThankYou').checked, sendEmail: document.getElementById('sendEmail').checked, emailSubject: document.getElementById('emailSubject').value || 'Invoice', emailBody: document.getElementById('emailBody').value || 'The invoice is attached here', useDynamicContent: document.getElementById('useDynamicContent').checked }; var script = generateAppScript(config); document.getElementById('codeOutput').textContent = script; } catch (error) { document.getElementById('codeOutput').textContent = 'Error generating script: ' + error.message; } } function escapeStringForJS(str) { return str.replace(/\\/g, '\\\\') .replace(/"/g, '\\"') .replace(/'/g, "\\'") .replace(/\n/g, '\\n') .replace(/\r/g, '\\r') .replace(/\t/g, '\\t'); } function generateAppScript(config) { var thankYouSection = ''; var emailSection = ''; var cleanupSection = ''; if (config.addThankYou) { thankYouSection = '\n // Get the last row with data in column ' + config.lastRowColumn + '\n' + ' var sh = ss.getSheetByName(shTabName || "' + config.sheetName + '");\n' + ' var lr = sh.getRange("' + config.lastRowColumn + config.lastRowStart + '").getNextDataCell(SpreadsheetApp.Direction.UP).getRow();\n' + ' var thankYouRow = lr + 2;\n' + ' var comeAgainRow = thankYouRow + 1;\n' + ' \n' + ' sh.getRange("B" + thankYouRow).setValue("Thank you");\n' + ' sh.getRange("B" + comeAgainRow).setValue("COME AGAIN");\n' + ' \n' + ' range = range ? range : ("' + config.exportRange + '" + comeAgainRow);'; cleanupSection = '\n \n' + ' sh.getRange("B" + thankYouRow).clearContent();\n' + ' sh.getRange("B" + comeAgainRow).clearContent();'; } else { thankYouSection = '\n var sh = ss.getSheetByName(shTabName || "' + config.sheetName + '");\n' + ' range = range ? range : "' + config.exportRange + '";'; } if (config.sendEmail) { var emailSubject = config.emailSubject; var emailBody = config.emailBody; if (config.useDynamicContent) { // Replace placeholders with JavaScript template strings emailSubject = emailSubject.replace(/{customerName}/g, '" + name + "') .replace(/{invoiceNumber}/g, '" + invoiceNumber + "'); emailBody = emailBody.replace(/{customerName}/g, '" + name + "') .replace(/{invoiceNumber}/g, '" + invoiceNumber + "'); } emailSection = '\n \n' + ' var activeUserEmail = Session.getActiveUser().getEmail();\n' + ' var subject = "' + escapeStringForJS(emailSubject) + '";\n' + ' var htmlBody = "' + escapeStringForJS(emailBody) + '";\n' + ' MailApp.sendEmail({\n' + ' to: activeUserEmail,\n' + ' subject: subject,\n' + ' htmlBody: htmlBody,\n' + ' attachments: [file]\n' + ' });'; } var result = 'function exportPdflib(range, shTabName) {\n' + ' var blob, exportUrl, name, options, response, sheetTabId, ss, ssID, url_base;\n' + ' ss = SpreadsheetApp.getActiveSpreadsheet();\n' + thankYouSection + '\n' + ' \n' + ' ssID = ss.getId();\n' + ' sheetTabId = sh.getSheetId();\n' + ' url_base = ss.getUrl().replace(/edit$/, "");\n' + ' name = sh.getRange("' + config.customerNameCell + '").getValue();\n' + ' var invoiceNumber = sh.getRange("' + config.invoiceNumberCell + '").getValue();\n' + ' \n' + ' var folderName = "' + config.folderName + '";\n' + ' var folders = DriveApp.getFoldersByName(folderName);\n' + ' var folder;\n' + ' if (folders.hasNext()) {\n' + ' folder = folders.next();\n' + ' } else {\n' + ' folder = DriveApp.createFolder(folderName);\n' + ' }\n' + ' \n' + ' exportUrl = url_base + "export?exportFormat=pdf&format=pdf" +\n' + ' "&gid=" + sheetTabId + "&id=" + ssID +\n' + ' "&range=" + range +\n' + ' "&size=A4" +\n' + ' "&portrait=' + config.portrait + '" +\n' + ' "&fitw=' + config.fitWidth + '" +\n' + ' "&gridlines=' + config.gridlines + '" +\n' + ' "&fzr=' + config.frozenRows + '";\n' + ' \n' + ' var options = {\n' + ' headers: {\n' + ' "Authorization": "Bearer " + ScriptApp.getOAuthToken()\n' + ' },\n' + ' muteHttpExceptions: true\n' + ' };\n' + ' \n' + ' SpreadsheetApp.flush();\n' + ' \n' + ' var response = UrlFetchApp.fetch(exportUrl, options);\n' + ' if (response.getResponseCode() !== 200) {\n' + ' console.log("Error exporting Sheet to PDF! Response Code: " + response.getResponseCode());\n' + ' return;\n' + ' }\n' + ' \n' + ' var blob = response.getBlob();\n' + ' blob.setName(name + " " + invoiceNumber + " invoice.pdf");\n' + ' \n' + ' var file = folder.createFile(blob);\n' + ' \n' + ' sh.getRange("' + config.pdfLinkCell + '").setValue(file.getUrl());' + cleanupSection + emailSection + '\n' + '}'; return result; } function copyCode() { try { var codeElement = document.getElementById('codeOutput'); var textArea = document.createElement('textarea'); textArea.value = codeElement.textContent; document.body.appendChild(textArea); textArea.select(); document.execCommand('copy'); document.body.removeChild(textArea); var copyBtn = document.querySelector('.copy-btn'); copyBtn.textContent = '✅ Copied!'; copyBtn.classList.add('copied'); setTimeout(function() { copyBtn.textContent = '📋 Copy'; copyBtn.classList.remove('copied'); }, 2000); } catch (error) { alert('Copy failed: ' + error.message); } } function initializeApp() { try { toggleEmailSection(); generateScript(); } catch (error) { document.getElementById('codeOutput').textContent = 'Initialization error: ' + error.message; } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeApp); } else { initializeApp(); }

Technical Details

Built using HTML5, CSS3, and JavaScript with blog-safe coding practices. All processing happens client-side for privacy and security, with no server dependencies.

No comments:

Post a Comment