Как загрузить один лист в формате PDF (не экспортировать в Google Drive) - PullRequest
1 голос
/ 20 мая 2019

Я натолкнулся на несколько сценариев, которые можно использовать с Google Sheets, которые позволят мне экспортировать один лист в файл на моем Google Диске. Однако вместо того, чтобы отправить его туда, я хочу, чтобы он был загружен на мой компьютер напрямую.

Я хочу заменить это ...

DriveApp.createFile()

... с чем-то еще, что отправит файл с настроенным именем в виде файла для загрузки в моем браузере.

Ответы [ 2 ]

3 голосов
/ 20 мая 2019
  • Вы хотите загрузить определенный лист в активной электронной таблице в виде файла PDF.

Если мое понимание верно, как насчет этого примера сценария?Этот пример сценария предполагает следующие пункты.

  1. Скрипт - это связанный с контейнером сценарий электронной таблицы.
  2. Лист, который вы хотите загрузить, находится в активной электронной таблице.
  3. Когда скрипт запускается, открывается диалоговое окно.При нажатии кнопки активный лист загружается в виде файла PDF на локальный компьютер.
    • В этом сценарии файл PDF загружается Javascript.Поэтому я использовал диалог для выполнения Javascript.

Пример сценария:

При использовании этого сценария, пожалуйста, скопируйте и вставьте этот сценарий в редактор сценариев.Скрипт - это связанный с контейнером скрипт 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. Откройтедиалоговое окно и файл PDF автоматически загружается при запуске Javascript.
  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");
}
0 голосов
/ 21 мая 2019

В качестве альтернативы, вы можете использовать тег привязки для загрузки на локальный диск с пользовательским именем:

Flow:

  • Создание пользовательского URL-адреса загрузки для экспорта в PDF с использованием идентификатора электронной таблицы
  • 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..'
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...