Google Apps Script实现动态范围导出PDF并邮件发送需求
Google Apps Script 适配活动表格/工作表的PDF导出方案(含选中区域逻辑)
核心实现逻辑
- 绑定当前活动表格与工作表,摆脱固定ID的局限性
- 自动识别用户选中区域,仅保留A-G列内容,与前3行表头合并导出
- 无选中区域时,自动导出A-G列整表数据
完整代码
function exportAndSendPDF() { // 获取当前活动表格和工作表 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getActiveSheet(); const ssId = ss.getId(); const sheetId = sheet.getSheetId(); // 定义基础表头范围:前3行A-G列 const headerRange = `'${sheet.getName()}'!A1:G3`; let exportRange = headerRange; // 获取用户选中的活动区域 const activeRange = sheet.getActiveRange(); const hasSelectedRange = activeRange.getNumRows() > 0 && activeRange.getNumColumns() > 0; if (hasSelectedRange) { // 提取选中区域的A-G列部分(限定列1-7) const startRow = activeRange.getRow(); const endRow = activeRange.getLastRow(); // 避免与表头重复,从第4行开始合并 const targetStartRow = Math.max(startRow, 4); if (targetStartRow <= endRow) { const selectedAGRange = `'${sheet.getName()}'!A${targetStartRow}:G${endRow}`; exportRange = `${headerRange},${selectedAGRange}`; } } else { // 无选中区域时,导出A-G列整表(表头+所有数据行) const lastRow = sheet.getLastRow(); if (lastRow > 3) { const fullDataRange = `'${sheet.getName()}'!A4:G${lastRow}`; exportRange = `${headerRange},${fullDataRange}`; } } // 构建PDF导出URL参数 const url = `https://docs.google.com/spreadsheets/d/${ssId}/export?` + `format=pdf` + `&size=A4` + `&portrait=true` + `&sheetnames=false` + `&printtitle=false` + `&pagenumbers=false` + `&gridlines=false` + `&fzr=false` + `&gid=${sheetId}` + `&range=${encodeURIComponent(exportRange)}`; // 获取PDF文件内容 const token = ScriptApp.getOAuthToken(); const response = UrlFetchApp.fetch(url, { headers: { 'Authorization': `Bearer ${token}` } }); const pdfBlob = response.getBlob().setName(`${sheet.getName()}_导出文件.pdf`); // 发送邮件(自行修改收件人、主题、正文) MailApp.sendEmail({ to: 'your-recipient@example.com', subject: `【${sheet.getName()}】导出PDF文件`, body: '附件为请求导出的PDF文件,请查收。', attachments: [pdfBlob] }); SpreadsheetApp.getUi().alert('PDF导出并发送成功!'); }
关键代码说明
- 活动对象获取:
getActiveSpreadsheet()和getActiveSheet()必须在绑定到表格的脚本中使用(通过表格「扩展→Apps脚本」创建的脚本),独立脚本会触发报错,这大概率是你之前遇到问题的原因。 - 选中区域处理:通过
getActiveRange()获取用户选中区域,强制限定A-G列(1-7列),同时避免与前3行表头重复,从第4行开始合并选中区域。 - PDF范围拼接:用逗号分隔多个区域,确保导出内容包含表头和选中数据;无选中时自动拼接表头到最后一行的A-G列。
- OAuth权限:通过
ScriptApp.getOAuthToken()获取权限,避免导出时出现权限不足的问题。
常见问题排查
- 若调用
getActiveSheet()报错:检查脚本是否为绑定到当前表格的脚本,而非独立的Google Apps Script项目。 - 导出范围不符合预期:确认选中区域是否在A-G列内,代码已自动过滤超出列的部分;若整表导出异常,检查表格是否有隐藏行/列,
getLastRow()会忽略完全空白的行。
内容的提问来源于stack exchange,提问作者Dziubas
相关产品推荐
相关产品推荐

