Google Sheets Apps Script问题:指定列PDF邮件及工作表显示异常
解决方案
以下是修复后的完整代码,同时解决了PDF导出指定范围和工作表恢复显示的问题:
function sendReport() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const invoiceSheet = ss.getSheetByName("Email Invoice"); // 要隐藏的工作表名称列表 const sheetsToHide = [ "Fuel Usage", "Gross Metrics", "Historical Tracking Metrics", "Scale Ticket Form", "Pay Stub", "Lookups", "Trucking Data", "Indexes" ]; try { // 隐藏指定工作表 sheetsToHide.forEach(sheetName => { ss.getSheetByName(sheetName).hideSheet(); }); // 获取驱动信息 const emailDriverName = invoiceSheet.getRange("J7").getValue(); const driveremailaddr = invoiceSheet.getRange("J14").getValue(); const exportRange = "A1:F105"; // 构建PDF导出URL,指定工作表和范围 const sheetId = invoiceSheet.getSheetId(); const exportUrl = `${ss.getUrl().replace(/edit$/, '')}export?exportFormat=pdf&format=pdf` + `&gid=${sheetId}` + `&range=${encodeURIComponent(exportRange)}` + `&size=letter` + `&portrait=true` + `&fitw=true` + `&sheetnames=false&printtitle=false` + `&pagenumbers=false&gridlines=false` + `&fzr=false`; // 获取PDF Blob const pdfBlob = UrlFetchApp.fetch(exportUrl, { headers: { 'Authorization': `Bearer ${ScriptApp.getOAuthToken()}` } }).getBlob().setName("Load Invoice.pdf"); // 发送邮件 const message = { to: driveremailaddr, subject: `Loads by ${emailDriverName}`, body: `Please do not respond to this email as it is an unmonitored address. If you have any questions please call User or email example-email2.com See Attachment`, cc: 'example-email@gmail.com', attachments: [pdfBlob] }; MailApp.sendEmail(message); } finally { // 恢复显示所有隐藏的工作表 sheetsToHide.forEach(sheetName => { ss.getSheetByName(sheetName).showSheet(); }); } }
关键修改说明
1. 修复工作表恢复显示问题
- 原代码用
activate()仅能激活工作表,无法恢复显示隐藏的表,替换为showSheet()才是正确的显示隐藏工作表的方法。 - 用
try...finally块包裹逻辑,确保无论邮件发送是否出错,隐藏的工作表都会被恢复,避免出现表永久隐藏的情况。 - 将需隐藏的工作表整理为数组,通过循环批量处理,减少冗余代码。
2. 实现指定范围导出PDF
- 原代码
getAs(MimeType.PDF)会导出整个电子表格,改为构建Google Sheets导出URL,指定目标工作表ID和A1:F105范围。 - 用
UrlFetchApp携带OAuth令牌请求导出链接,获取仅包含指定范围的PDF Blob。 - URL参数可按需调整PDF格式,示例中设置了常用的无网格线、无标题的打印参数。
3. 代码优化
- 提取电子表格和目标工作表为变量,避免重复调用获取方法,提升代码可读性和执行效率。
- 移除原代码中多余的大括号,修复代码结构问题。
内容的提问来源于stack exchange,提问作者Jarvis Davis
相关产品推荐
相关产品推荐

