Google Sheets Экспорт в PDF-скрипт - Почему он экспортирует скрытые строки? - PullRequest
1 голос
/ 02 июля 2019

У меня есть скрипт для сохранения отдельного листа Google в виде PDF-документа в заданной папке.

Поскольку содержимое листа динамическое и иногда загружается пустыми строками сетки внизу, явключили метод скрытия строк без содержимого перед экспортом файла.

До недавнего времени это работало так же, как требуется.Теперь функция скрывает строки, но созданный файл показывает строки как невидимые.

Любая идея, если это является результатом недавнего изменения API листов Google и есть ли что-нибудь, что я могу сделать, чтобы вернуться к старой функциональности?

Вот мой блок кода, который раньше работал:

// API function for saving a single sheet without hiding sheets
// *******************************************************************************


function singleSheetAPIExport(){

  // Get active spreadsheet URL
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = 'Example';
  var main = ss.getSheetByName(sheetName)
  var folderID = '1wsxxxxxxblahblah' // Google Drive Folder ID

  Logger.log('maxrows: ' + main.getMaxRows());
  Logger.log('last row: ' + main.getLastRow());

  // Base URL
  var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());

  /* Specify PDF export parameters
  From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
  */

  var url_ext = 'exportFormat=pdf&format=pdf'        // export as pdf / csv / xls / xlsx
  + '&size=letter'                                   // paper size legal / letter / A4
  + '&portrait=true'                                // orientation, false for landscape
  + '&fitw=true&source=labnol'                       // fit to page width, false for actual size
  + '&sheetnames=false&printtitle=false'             // hide optional headers and footers
  + '&pagenumbers=false&gridlines=false'             // hide page numbers and gridlines
  + '&fzr=false'                                     // do not repeat row headers (frozen rows) on each page
  + '&gid=';                                         // the sheet's Id

  var token = ScriptApp.getOAuthToken();

  // Hide All Empty Rows in the Print Sheet
  var maxRows = main.getMaxRows(); 
  var lastRow = main.getLastRow();
  if (maxRows-lastRow != 0){
    main.hideRows(lastRow+1, maxRows-lastRow);
  }

  // Get the response for your specific sheet that can later be converted to blob
  var response = UrlFetchApp.fetch(url + url_ext + main.getSheetId(), {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });

  // Save pdf version
  var saveFolder = 'PDF';
  var parentFolder = DriveApp.getFolderById(folderID);
  var folder, folders = DriveApp.getFoldersByName(saveFolder);
   if (folders.hasNext()) {
     folder = folders.next();
   } else {
     folder = parentFolder.createFolder(saveFolder);
   }
  var name = main.getRange("B8").getValue(); 
  var cleanName = name.replace(/([^a-zA-Z0-9() #%~-])/g, "-");
  folder.createFile(response.getBlob().setName(cleanName));

  // Unhide the rows again
  var fullSheetRange = main.getRange(1,1,main.getMaxRows(), main.getMaxColumns());
  main.unhideRow(fullSheetRange); 

}

Функциональность изменилась между 17 и 19 июня, что может означать изменение API, но я не смог найти ни одногосвидетельство такого изменения.

Ранее я разместил это на сайте веб-приложений в Stack Exchange, но удалил и разместил здесь, поскольку, как я вижу, команда приложений Google рекомендует Stackoverflow для запросов.

1 Ответ

2 голосов
/ 02 июля 2019

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

Проблема в вашем коде состоит в том, что вы создаете свой файл сразу после скрытия пустых строк и отображаете строки сразу после создания файла:

Вы должны знать, что createFile() является асинхронным запросом- как и все вызовы Google API.Это означает, что в случае файла большего размера, где создание может занять больше времени, ваш метод unhideRow() может быть выполнен до создания файла.

Аналогично, если вы выполняете вызов до того, как все строки будут скрыты, это вызовет ту же проблему.Решение заключается в использовании функции SpreadsheetApp.flush();, которая обеспечивает выполнение функции только после завершения предыдущей функции.Вставка SpreadsheetApp.flush(); до и после folder.createFile(response.getBlob().setName(cleanName)); решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...