使用Google Apps Script合并指定谷歌表格工作表为PDF出错并需修改
解决方案
修复500错误的核心原因
原代码构建PDF导出URL时错误使用HTML实体&代替URL参数分隔符&,导致请求无效触发500错误;同时存在重复调用folder.createFile(blob)的冗余操作,需移除。
实现指定工作表范围合并为单个PDF的代码
以下代码通过创建临时工作表,将两个指定范围的内容复制到临时表并插入分页符,最终导出为单个PDF,完成后自动删除临时表:
function mergeSheetsToPdf(pdfName) { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var folder = DriveApp.getFolderById('1t6ns346GNX_gP-uGkwE43egGhTCaWgKO'); pdfName = pdfName || spreadsheet.getName(); // 获取源工作表 var sheet1 = spreadsheet.getSheetByName('Sheet1'); var sheet2 = spreadsheet.getSheetByName('Sheet2'); // 创建临时工作表 var tempSheet = spreadsheet.insertSheet('TempSheet'); try { // 复制Sheet1的A2:Q28到临时表A1起始位置 var range1 = sheet1.getRange('A2:Q28'); range1.copyTo(tempSheet.getRange('A1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES_AND_FORMATTING); // 在第28行前插入分页符(确保两个内容分属不同页面) tempSheet.insertPageBreak(28); // 复制Sheet2的A1:I27到临时表A28起始位置 var range2 = sheet2.getRange('A1:I27'); range2.copyTo(tempSheet.getRange('A28'), SpreadsheetApp.CopyPasteType.PASTE_VALUES_AND_FORMATTING); // 导出临时表为PDF var pdfBlob = exportSheetToPdf(spreadsheet.getId(), tempSheet.getSheetId(), pdfName); // 保存PDF到指定文件夹 folder.createFile(pdfBlob); } finally { // 无论是否出错,都删除临时工作表 spreadsheet.deleteSheet(tempSheet); } } function exportSheetToPdf(spreadsheetId, sheetId, pdfName) { var spreadsheet = SpreadsheetApp.openById(spreadsheetId); var url_base = spreadsheet.getUrl().replace(/edit$/, ''); // 正确构建导出URL,使用&作为参数分隔符 var url_ext = 'export?exportFormat=pdf&format=pdf' + '&gid=' + sheetId + '&size=letter' + '&portrait=true' + '&fitw=true' + '&sheetnames=false&printtitle=false&pagenumbers=false' + '&gridlines=false' + '&fzr=false'; var options = { headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() }, muteHttpExceptions: true // 启用以便调试错误 }; var response = UrlFetchApp.fetch(url_base + url_ext, options); // 检查请求是否成功 if (response.getResponseCode() !== 200) { throw new Error('PDF导出失败: ' + response.getContentText()); } return response.getBlob().setName(pdfName + '.pdf'); } // 测试函数 function testMerge() { mergeSheetsToPdf("123"); }
使用说明
- 确保
folder.createFile中的文件夹ID为你需要保存PDF的目标文件夹ID。 - 运行
testMerge函数即可生成包含指定范围内容的单个PDF。 - 临时工作表会自动删除,不会残留到原表格中。
内容的提问来源于stack exchange,提问作者user12736831
相关产品推荐
相关产品推荐

