Google Script问题:如何仅将指定工作表存为PDF至Drive指定文件夹
解决Google Script仅保存指定工作表为PDF到Drive文件夹的问题
问题根源
你当前保存到Drive的代码是直接将整个电子表格转换为PDF Blob,而非使用已经通过导出URL获取到的指定工作表的PDF内容:
SpreadsheetApp.getActiveSpreadsheet() .getBlob() .getAs(`application/pdf`)
这段代码会导出整个工作簿,而非你需要的JSA工作表。
修改方案
- 直接复用之前通过
UrlFetchApp.fetch获取到的PDF内容(也就是res对象的内容),因为这部分已经是指定工作表的PDF。 - 修正文件名变量的重复拼接问题,避免生成错误的文件名。
修改后的完整代码
function downloadPdf() { var ss = SpreadsheetApp.getActive(), id = ss.getId(), // 直接获取目标工作表JSA,而非当前活动表 sht = ss.getSheetByName("JSA"), shtId = sht.getSheetId(), url = 'https://docs.google.com/spreadsheets/d/' + id + '/export' + '?format=pdf&gid=' + shtId + '&size=letter' // 纸张大小 legal / letter / A4 + '&portrait=false' // 方向,false为横向 + '&scale=2' // 缩放比例 1=正常100% / 2=适配宽度 / 3=适配高度 / 4=适配页面 + '&fitw=true' // 适配宽度,false为实际尺寸 + '&top_margin=0.25' // 必须设置四个边距! + '&bottom_margin=0.25' // 必须设置四个边距! + '&left_margin=0.25' // 必须设置四个边距! + '&right_margin=0.25' // 必须设置四个边距! + '&sheetnames=false&printtitle=false' // 隐藏可选页眉页脚 + '&pagenum=false&gridlines=false' // 隐藏页码和网格线 + '&fzr=false' // 每页不重复行标题(冻结行) + '&horizontal_alignment=CENTER' // 水平对齐 LEFT/CENTER/RIGHT + '&vertical_alignment=TOP'; // 垂直对齐 TOP/MIDDLE/BOTTOM // 获取自定义文件名内容 var val = SpreadsheetApp.getActive().getRange('H2').getValue();// 用getValue()而非getValues(),避免数组问题 var val2= Utilities.formatDate(SpreadsheetApp.getActive().getRange("N2").getValue(), ss.getSpreadsheetTimeZone(), "MM/dd/YY"); var val3= " - "; var pdfFileName = val + val3 + val2 + '.pdf'; // 获取指定工作表的PDF内容 var res = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() }, }); // 触发前端下载 SpreadsheetApp.getUi().showModelessDialog( HtmlService.createHtmlOutput( '<a target ="_blank" download="' + pdfFileName + '" href = "data:application/pdf;base64,' + Utilities.base64Encode(res.getContent()) + '">Click here</a> to download, if download did not start automatically' + '<script> \ var a = document.querySelector("a"); \ a.addEventListener("click",()=>{setTimeout(google.script.host.close,10)}); \ a.click(); \ </script>' ).setHeight(50), 'Downloading PDF..' ); // 保存PDF到指定Drive文件夹 const folderName = `Test`; // 找到目标文件夹 const targetFolder = DriveApp.getFoldersByName(folderName).next(); // 使用已获取的PDF内容创建文件 targetFolder.createFile( res.getBlob().setName(pdfFileName) ); }
关键修改点说明
- 指定目标工作表:将
sht = ss.getActiveSheet()改为sht = ss.getSheetByName("JSA"),确保导出的是固定的目标工作表,而非当前活动表。 - 修正文件名获取:将
getValues()改为getValue(),避免返回数组导致文件名拼接错误;同时新建pdfFileName变量统一管理文件名,避免重复拼接。 - 复用PDF内容:保存到Drive时,直接使用
res.getBlob(),这是已经通过导出URL获取到的JSA工作表的PDF内容,而非整个工作簿的Blob。 - 代码可读性优化:拆分文件夹查找和文件创建步骤,让逻辑更清晰。
内容的提问来源于stack exchange,提问作者J.Raab
相关产品推荐
相关产品推荐

