如何将单页下载为PDF(不导出到Google云端硬盘)

时间:2019-05-20 07:09:55

标签: google-apps-script google-sheets

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

我正在寻找替换它...

DriveApp.createFile()

...还有其他一些东西,它将使用自定义名称发送文件,作为要在我的浏览器中下载的文件。

2 个答案:

答案 0 :(得分:2)

  • 您要在活动电子表格中将特定的表格下载为PDF文件。

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

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

示例脚本:

使用此脚本时,请将该脚本复制并粘贴到脚本编辑器中。脚本是电子表格的容器绑定脚本。运行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();

参考文献:

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

编辑:

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

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

  1. 将PDF文件创建为临时文件。
  2. 创建要下载的URL。
  3. 打开一个对话框,并通过运行Javascript自动下载PDF文件。
  4. 删除临时文件。
  5. 关闭对话框。

示例脚本:

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 :(得分:0)

或者,您可以使用定位标记以自定义名称下载到本地驱动器:

流量:

  • 使用电子表格ID创建用于pdf导出的自定义下载网址
  • 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..'
  );
}