如何将单张 PDF 文件直接下载到我的本地设备(不导出到 Google Drive)?

Posted

技术标签:

【中文标题】如何将单张 PDF 文件直接下载到我的本地设备(不导出到 Google Drive)?【英文标题】:How to download single sheet as PDF to my local device directly (not export to Google Drive)? 【发布时间】:2019-10-06 12:38:08 【问题描述】:

我遇到了一些与 Google 表格一起使用的脚本,这些脚本可以让我将单个表格导出到我的 Google 云端硬盘上的文件中。但是,我不想将其发送到那里,而是希望将其直接下载到我的计算机上。

我正在寻找替换它...

DriveApp.createFile()

使用其他可以将具有自定义名称的文件作为要在我的浏览器中下载的文件发送的东西。

【问题讨论】:

【参考方案1】:

或者,您可以使用锚标签下载到具有自定义名称的本地驱动器:

流程:

使用电子表格 ID 为 pdf 导出创建自定义下载 url UrlFetchApp 获取 pdf 使用锚标签将 pdf 作为 Data URI 提供 使用锚标签的download 属性为下载提供自定义名称

片段:

function downloadPdfToDesktop() 
  var ss = SpreadsheetApp.getActive(),
    id = ss.getId(),
    sht = ss.getActiveSheet(),
    shtId = sht.getSheetId(),
    url =
      'https://docs.google.com/spreadsheets/d/' +
      id +
      '/export' +
      '?format=pdf&gid=' +
      shtId;
  var val = 'PDFNAME';//custom pdf name here 
  val += '.pdf';
  //can't download with a different filename directly from server
  //download and remove content-disposition header and serve as a dataURI
  //Use anchor tag's download attribute to provide a custom filename
  var res = UrlFetchApp.fetch(url, 
    headers:  Authorization: 'Bearer ' + ScriptApp.getOAuthToken() ,
  );
  SpreadsheetApp.getUi().showModelessDialog(
    htmlService.createHtmlOutput(
      '<a target ="_blank" download="' +
        val +
        '" 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..'
  );

【讨论】:

【参考方案2】: 您希望将活动电子表格中的特定工作表下载为 PDF 文件。

如果我的理解是正确的,那么这个示例脚本怎么样?此示例脚本假设以下几点。

    Script 是电子表格的容器绑定脚本。 您要下载的表格位于活动电子表格中。 运行脚本时,会打开一个对话框。单击该按钮时,活动工作表将作为 PDF 文件下载到本地 PC。 在此脚本中,PDF 文件是通过 javascript 下载的。所以我使用了一个对话框来执行 Javascript。

示例脚本:

当您使用此脚本时,请将此脚本复制并粘贴到脚本编辑器中。 Script 是Spreadsheet 的容器绑定脚本。当您运行downloadSheetAsPDF() 时,会在电子表格上打开一个对话框。请检查一下。当您单击该按钮时,将下载 PDF 文件。

function downloadSheetAsPDF() 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetId = ss.getActiveSheet().getSheetId();
  var url = "https://docs.google.com/a/mydomain.org/spreadsheets/d/" + ss.getId() + "/export?exportFormat=pdf&gid=" + sheetId + "&access_token=" + ScriptApp.getOAuthToken();
  var str = '<input type="button" value="Download" onClick="location.href=\'' + url + '\'" >';
  var html = HtmlService.createHtmlOutput(str);
  SpreadsheetApp.getUi().showModalDialog(html, "sample");

注意:

这是一个简单的示例脚本。因此,请根据您的情况进行修改。 如需下载具体工作表名称,请修改为var sheetId = ss.getSheetByName("sheetName").getSheetId();

参考资料:

Class HtmlService Class Ui

如果这不是您想要的结果,我深表歉意。

编辑:

您希望在下载文件时使用 PDF 文件的特定文件名。 您希望在脚本运行时自动下载。

如果我的理解是正确的,那么这个示例脚本怎么样?该示例脚本的流程如下。我认为您的情况可能有几个答案。因此,请将此视为几个答案之一。

    PDF 文件被创建为临时文件。 创建下载 URL。 打开一个对话框,通过运行 Javascript 自动下载 PDF 文件。 删除临时文件。 关闭对话框。

示例脚本:

function downloadSheetAsPDF2() 
  var filename = "sampleFilename.pdf"; // Please set the filename here.

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetId = ss.getActiveSheet().getSheetId();

  // Creat PDF file as a temporary file and create URL for downloading.
  var url = "https://docs.google.com/a/mydomain.org/spreadsheets/d/" + ss.getId() + "/export?exportFormat=pdf&gid=" + sheetId + "&access_token=" + ScriptApp.getOAuthToken();
  var blob = UrlFetchApp.fetch(url).getBlob().setName(filename);
  var file = DriveApp.createFile(blob);
  var dlUrl = "https://drive.google.com/uc?export=download&id=" + file.getId();

  // Open a dialog and run Javascript for downloading the file.
  var str = '<script>window.location.href="' + dlUrl + '"</script>';
  var html = HtmlService.createHtmlOutput(str);
  SpreadsheetApp.getUi().showModalDialog(html, "sample");
  file.setTrashed(true);

  // This is used for closing the dialog.
  Utilities.sleep(3000);
  var closeHtml = HtmlService.createHtmlOutput("<script>google.script.host.close()</script>");
  SpreadsheetApp.getUi().showModalDialog(closeHtml, "sample");

【讨论】:

这更接近我正在寻找的东西。 1.有什么办法可以更改目标文件的默认名称吗? 2. 有什么方法可以让它自动下载而不弹出“下载”按钮? @Wolfie 感谢您的回复。抱歉,由于我的英语水平不佳,我的回答与您的目标不一样。我添加了一个示例脚本。你能确认一下吗?如果这不是您想要的结果,我深表歉意。 您无需为任何事情道歉,您正在为我提供帮助,而且方向正确。您提供的编辑/秒功能正在做我想要的,非常感谢! @Wolfie 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。 @Tanaike 感谢您的回复。这是帖子'***.com/questions/58723534/…'。请帮忙。

以上是关于如何将单张 PDF 文件直接下载到我的本地设备(不导出到 Google Drive)?的主要内容,如果未能解决你的问题,请参考以下文章

从服务器下载 PDF 文件到客户端

如何在 Vue 中下载 PDF

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?

Databricks:将dbfs:/ FileStore文件下载到我的本地计算机?

如何测量从 URL 下载的 PDF 的大小

如何创建 POST 请求以从本地路径将文件存储在服务器上 - React Native