如何将Google表格单元格值设为导出PDF的打印标题而非URL
解决方案
实现逻辑:直接调用Google Sheets的PDF导出接口时默认会使用文档/工作表名作为下载文件名,要自定义标题需要将导出内容转为Blob后通过HTML5的download属性手动指定文件名,具体修改代码如下:
步骤1:修改Google Apps Script代码
// 定义你要作为PDF标题的单元格位置,示例为A1,可按需修改 const TITLE_CELL = "A1"; function printSelectedRange() { SpreadsheetApp.flush(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var formS = ss.getActiveSheet(); var range = formS.setActiveRange(formS.getRange("B7:J58")); // 读取指定单元格内容作为PDF标题,同时清理文件名非法字符 var pdfTitle = formS.getRange(TITLE_CELL).getValue().toString().replace(/[<>:"/\\|?*]/g, '').trim(); // 兜底标题,避免单元格为空时出错 pdfTitle = pdfTitle || "PurchaseRequest"; var gid = formS.getSheetId(); var printRange = objectToQueryString({ 'c1': range.getColumn() - 1 , 'r1': range.getRow() - 1, 'c2': range.getColumn() + range.getWidth() -1 , 'r2': range.getRow() + range.getHeight() }); var url = ss.getUrl().replace(/edit$/, '') + 'export?format=pdf' + PDF_OPTS + printRange + "&gid=" + gid; var htmlTemplate = HtmlService.createTemplateFromFile('js'); htmlTemplate.url = url; // 向模板传递授权令牌和PDF标题 htmlTemplate.token = ScriptApp.getOAuthToken(); htmlTemplate.title = pdfTitle; SpreadsheetApp.getUi().showModalDialog(htmlTemplate.evaluate().setHeight(10).setWidth(400),'Purchase Request by '); } function objectToQueryString(obj) { return Object.keys(obj).map(function(key) { return Utilities.formatString('&%s=%s', key, obj[key]); }).join(''); }
步骤2:修改HTML模板代码
<html> <head> <base target="_top"> </head> <body> <script> (async () => { // 带授权请求PDF内容 const res = await fetch('<?=url?>', { headers: { 'Authorization': 'Bearer <?=token?>' } }); // 转为Blob对象 const blob = await res.blob(); // 创建临时下载链接 const a = document.createElement('a'); a.href = URL.createObjectURL(blob); // 指定下载文件名 a.download = '<?=title?>.pdf'; document.body.appendChild(a); a.click(); // 清理临时元素 a.remove(); URL.revokeObjectURL(a.href); google.script.host.close(); })(); </script> </body> </html>
自定义调整说明
- 如需修改标题对应的单元格,直接修改代码开头
TITLE_CELL的取值即可,比如要取C3单元格就改为const TITLE_CELL = "C3" - 标题会自动清理文件名不允许的特殊字符,单元格为空时会默认使用
PurchaseRequest作为文件名
内容的提问来源于stack exchange,提问作者redcodelloyd
相关产品推荐
相关产品推荐

