Google Script Web App导出Sheet为PDF编码错误问题求助
解决Google Script Web App导出Sheet为PDF时的编码损坏问题
我看你遇到的问题是Web App生成的PDF里部分字符变成问号,直接用export链接下载却完全正常——核心问题出在你把二进制的PDF文件当成文本字符串来处理了,多余的转码和编码操作直接破坏了原始二进制数据结构。
修复后的Google Script代码
function doGet(e) { return HtmlService.createTemplateFromFile('index').evaluate(); } function test() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getActiveSheet(); var url = spreadsheet.getUrl().replace(/edit$/, ''); var url_ext = 'export?exportFormat=pdf&format=pdf&gid=' + sheet.getSheetId(); var options = { headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken(), } }; var response = UrlFetchApp.fetch(url + url_ext, options); var blob = response.getBlob(); // 直接对Blob的二进制字节做base64编码,跳过字符串转码步骤 return Utilities.base64Encode(blob.getBytes()); }
修复后的HTML JavaScript代码(index.html)
<script> function downloadURI(uri, name) { var link = document.createElement('a'); link.download = name; link.href = uri; document.body.appendChild(link); link.click(); document.body.removeChild(link); delete link; } google.script.run.withSuccessHandler((data) => { // base64本身就是URL兼容格式,不需要额外encodeURIComponent var uri = 'data:application/pdf;base64,' + data; downloadURI(uri, 'test.pdf'); }).withFailureHandler((err) => { console.log(err); }).test(); </script>
为什么原来的代码会出错?
- PDF是二进制文件,不是文本:你之前用
blob.getDataAsString(charset)把二进制PDF转成ISO-8859-1字符串,这个过程会丢失二进制中无法用该编码表示的字节,直接导致文件损坏。 encodeURIComponent完全多余:base64编码本身就是为了安全传输二进制数据设计的,已经兼容URL规则,再次编码会进一步破坏数据结构,让PDF阅读器无法解析。
补充优化建议
如果需要自定义PDF导出样式,可以在url_ext里添加更多参数,比如:
var url_ext = 'export?exportFormat=pdf&format=pdf&gid=' + sheet.getSheetId() + '&size=A4&portrait=true&gridlines=false&printtitle=false';
参数说明:
size:指定纸张大小(如A4、Letter)portrait:控制横竖版(true为竖版,false为横版)gridlines:是否显示表格网格线printtitle:是否显示文档标题
内容的提问来源于stack exchange,提问作者skaarj
相关产品推荐
相关产品推荐

