4

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

我想换这个...

DriveApp.createFile()

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

4

2 回答 2

6
  • 您希望将活动电子表格中的特定工作表下载为 PDF 文件。

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

  1. Script 是Spreadsheet 的容器绑定脚本。
  2. 您要下载的工作表位于活动的电子表格中。
  3. 运行脚本时,会打开一个对话框。单击该按钮时,活动工作表将作为 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();.

参考:

如果这不是你想要的结果,我很抱歉。

编辑:

  • 您想在下载文件时使用 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");
}
于 2019-05-20T08:10:47.350 回答
1

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

流动:

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

片段:

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..'
  );
}
于 2019-05-21T17:00:48.213 回答