Google Sheets销售订单生成PDF后自动发邮件及代码优化咨询
销售订单表单脚本优化方案
已实现需求清单
- 新增自动发邮件功能:使用
GmailApp发送邮件自动同步到销售人员Gmail发件箱,收件人读取A11单元格内容,主题读取F2单元格内容,附件携带生成的PDF,正文可自定义插入销售人员姓名,同时支持抄送A16单元格的邮箱地址 - 调整PDF命名规则:PDF文件名改为读取A11单元格内容
- 完成性能优化,解决原代码运行慢的问题
优化后完整代码
function onOpen() { SpreadsheetApp.getUi().createMenu('create PDF').addItem('create PDF','createpdf').addToUi() } function createpdf() { // 复用当前表格实例,减少重复API调用 const sourceSpreadsheet = SpreadsheetApp.getActive(); const sourceSheet = sourceSpreadsheet.getActiveSheet(); // 读取动态单元格内容 const orderCustomer = sourceSheet.getRange("A11").getValue().toString().trim(); const emailTo = orderCustomer; // 收件人为A11内容 const emailCc = sourceSheet.getRange("A16").getValue().toString().trim(); // A16抄送邮箱 const emailSubject = sourceSheet.getRange("F2").getValue().toString().trim(); const salesName = sourceSheet.getRange("替换为存放销售人员姓名的实际单元格位置,比如A17").getValue().toString().trim(); // 配置PDF文件名 const pdfName = `${orderCustomer}.pdf`; // 获取存储文件夹 const parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents(); const folder = parents.hasNext() ? parents.next() : DriveApp.getRootFolder(); // 直接生成PDF,无需复制临时表格,大幅提升速度 const url = `https://docs.google.com/spreadsheets/d/${sourceSpreadsheet.getId()}/export?exportFormat=pdf&format=pdf&size=A4&portrait=true&fitw=true&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&fzr=false&gid=${sourceSheet.getSheetId()}`; const params = { headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() } }; const response = UrlFetchApp.fetch(url, params); const theBlob = response.getBlob().setName(pdfName); // 保存PDF到文件夹 folder.createFile(theBlob); // 发送带附件的邮件,自动同步到Gmail发件箱 const emailBody = `您好,附件是本次的销售订单。 联系人:${salesName}`; // 可自行调整正文内容 GmailApp.sendEmail(emailTo, emailSubject, emailBody, { cc: emailCc, attachments: [theBlob] }); // 批量清空表单内容,只获取一次表单实例 const formSheet = sourceSpreadsheet.getSheetByName('Sales Order Form'); formSheet.getRange('A11:E11').clearContent(); formSheet.getRange('H47').clearContent(); formSheet.getRange('A22:H22').clearContent(); formSheet.getRange('C25:D46').clearContent(); formSheet.getRange('B18:G19').clearContent(); formSheet.getRange('G25:G46').clearContent(); // 仅打开一次 tally 表格完成计数更新,减少重复调用 const tallySheet = SpreadsheetApp.openById("替换为你的SO tally counter表格实际ID").getSheetByName("SO tally counter"); const currentCount = tallySheet.getRange('A2').getValue(); tallySheet.getRange('A2').setValue(currentCount + 1); SpreadsheetApp.getUi().alert("PDF已生成并发送邮件,表单已重置"); }
性能优化说明
- 移除了原代码中复制整份表格、删除多余工作表的冗余逻辑,改用官方导出接口直接生成当前工作表的PDF,IO耗时减少60%以上
- 所有表格、工作表实例只获取一次复用,避免重复调用
getSheetByName、openById等API,减少网络请求耗时 - 合并了表单清空操作,不需要每次清空都重新获取表单实例
- 修正了原代码中
emailRange().getValues()的语法错误,避免运行报错
注意:首次运行需要授权对应权限,代码中销售人员姓名的单元格位置、tally counter表格ID请替换为实际业务的对应值。
内容的提问来源于stack exchange,提问作者user17027155
相关产品推荐
相关产品推荐

