如何在Google Sheets中发送指定工作表PDF?报错求助
问题分析
报错TypeError: sourceSheet.getBlob is not a function的核心原因是:Sheet(工作表)对象没有getBlob()方法,该方法仅属于Spreadsheet(整个表格文档)对象。你之前的代码逻辑混乱——创建了临时工作表却未使用,反而调用原工作表的getBlob(),自然触发错误。
修复方案
核心思路:创建独立的临时表格文档,仅保留需要导出的"Recibo"工作表,再导出该临时文档为PDF,既避免导出整个原文档,又不破坏原文档结构。
修复后的完整代码:
function myFunction() { var originalSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sourceSheet = originalSpreadsheet.getSheetByName("Recibo"); // 检查"Control"工作表是否存在,不存在则创建 var targetSheet = originalSpreadsheet.getSheetByName("Control"); if (!targetSheet) { targetSheet = originalSpreadsheet.insertSheet("Control"); } // 创建独立的临时表格文档 var tempSpreadsheet = SpreadsheetApp.create("TempRecibo"); // 将目标工作表复制到临时文档 sourceSheet.copyTo(tempSpreadsheet); // 删除临时文档默认的空白工作表 tempSpreadsheet.deleteSheet(tempSpreadsheet.getSheetByName("Sheet1")); // 生成临时文档的PDF Blob var pdfBlob = tempSpreadsheet.getBlob().getAs('application/pdf'); // 给PDF设置自定义文件名(可选,方便客户识别) pdfBlob.setName("Recibo_Gastos_Legales.pdf"); // 获取收件人邮箱地址 var recipientEmail = sourceSheet.getRange("C16").getValue(); // 发送带附件的邮件 var subject = "Recibo de gastos legales"; var body = "Estimado cliente, adjunto encontrará su recibo de gastos legales."; MailApp.sendEmail(recipientEmail, subject, body, { attachments: [pdfBlob] }); // 复制关键数据到"Control"工作表 var targetLastRow = targetSheet.getLastRow() + 1; targetSheet.getRange(targetLastRow, 1).setValue(sourceSheet.getRange("L8").getValue()); targetSheet.getRange(targetLastRow, 2).setValue(sourceSheet.getRange("L10").getValue()); targetSheet.getRange(targetLastRow, 3).setValue(sourceSheet.getRange("C14").getValue()); targetSheet.getRange(targetLastRow, 4).setValue(sourceSheet.getRange("L18").getValue()); // 将临时文档移入回收站清理 DriveApp.getFileById(tempSpreadsheet.getId()).setTrashed(true); }
关键修改说明
- 替换原有的「原文档内复制工作表」逻辑为「创建独立临时表格文档」,确保导出的PDF仅包含目标工作表
- 使用
tempSpreadsheet.getBlob()生成PDF(仅整个文档对象支持该方法) - 添加临时文档的清理逻辑,避免Drive中残留无用文件
- 新增PDF自定义文件名,提升收件人体验
内容的提问来源于stack exchange,提问作者David Palma
相关产品推荐
相关产品推荐

