我试图找出如何将Google Apps脚本部署为网络应用程序,以下载点击后生成的PDF。它几乎可以工作,但生成的文件不是有效的。我无法弄清楚它是否是编码问题或其他原因。
在Apps脚本中,代码看起来很简单:
---
title: "test"
output:
html_document:
css: test.css
---
在浏览器中,有一个点击处理程序:
function makePDF() {
...
var pdfBlob = doc.getAs('application/pdf');
return Utilities.base64Encode(pdfBlob.getBytes());
}
有什么建议吗?
谢谢!
答案 0 :(得分:1)
我想通了,所以如果其他人试图将PDF从Apps脚本传递到客户端javascript,则发布答案。这比我做的简单得多。
不要乱用base64编码,只需传回字节数组:
function makePDF() {
...
var pdfBlob = DocumentApp.openById('1234').getAs('application/pdf');
return pdfBlob.getBytes();
}
现在,在客户端,从ArrayBuffer构造一个新的Blob。这也很简单:
function clickHandler(ev) {
google.script.run
.withSuccessHandler(function(data) {
var arr = new Uint8Array(data);
var blob = new Blob([arr.buffer], {type: 'application/pdf'});
var obj_url = window.URL.createObjectURL(blob);
var hiddenLink = document.getElementById('hiddenPDFLink');
hiddenLink.setAttribute('href', obj_url);
hiddenLink.setAttribute('download', 'filename.pdf');
hiddenLink.click();
})
.makePDF();
}
就是这样!希望其他人认为这有用。
答案 1 :(得分:0)
我假设你的makePDF函数正在做一些其他的东西/计算,最后你需要把这个文件下载到本地计算机。
你可以做的是内部成功处理程序
var link = document.querySelector('#hiddenLink');
link.href = "https://docs.google.com/feeds/download/documents/export/Export?id=**TheIdOfDocumenToBeDownloaded**&exportFormat=pdf";
link.click();
然后它会提示您将文档保存到本地计算机。