Экспорт PDF на диск с помощью скрипта

Я пытаюсь создать экспорт в PDF на свой диск. Этот скрипт в настоящее время делает это. Однако я хочу, чтобы экспортировался только определенный диапазон ячеек, и я хотел бы, чтобы имя файла сохранения извлекало информацию из ячейки на листе. Пожалуйста помоги! У меня есть следующий скрипт:

function getpdf2(){
SpreadsheetApp.flush();
   
      var theurl = 'https://docs.google.com/spreadsheets/d/'
      + '1C-ONDP4pZeUrlMYekvg0i8oNceASL1s4_o8oBpQuzHk'  
      + '/export?exportFormat=pdf&format=pdf'
      + '&size=LETTER'
      + '&portrait=false'
      + '&fitw=false'       
      + '&top_margin=0.50'              
      + '&bottom_margin=0.50'          
      + '&left_margin=0.50'             
      + '&right_margin=0.50'           
      + '&sheetnames=false&printtitle=false'
      + '&pagenum=false'
      + '&gridlines=false'
      + '&fzr=FALSE'      
      + '&gid='
      + '1101884643';       

      var token = ScriptApp.getOAuthToken();
      
      var docurl = UrlFetchApp.fetch(theurl, { headers: { 'Authorization': 'Bearer ' +  token } });
      var fileid = DriveApp.createFile(docurl.getBlob()).setName('CAITLYN!B7.pdf').getId();
      
      var pdf = docurl.getBlob().setName('CAITLYN!B7.pdf');
      var pdf = docurl.getBlob().getAs('application/pdf').setName('testss.pdf'); 
      var filetodel = DriveApp.getFileById(fileid);

      if (DriveApp.getFoldersByName("PDF Quotes").hasNext()){
      var folder = DriveApp.getFoldersByName("PDF Quotes").next();
      filetodel.makeCopy(folder);
       }
      DriveApp.removeFile(filetodel);
 }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
92
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

Наконец, мы экспортируем этот временный лист в pdf на нашем диске.

Вот весь рабочий код.

function exportRangeToPdf() {
  // Get the sheet id, sheet name, range of cells you want to export 
  // and the folder ID in your drive where you want to store the pdf
  var sheetId = '1ZzkBAR1EgismFCd-hxOUyC_uZKYucu7Av-lDHhrEMx4';
  var sheetName = 'Sheet1';
  var sheetSrcRange = 'B5:C6';
  var driveId = '0B55C21aJsSBlfk9FTjRqOG8tb3hjR1N4MTU1YjVPNU4weGVhSldfU3F4OXladVVNMF9Ccms';

  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
  var range = sheet.getRange(sheetSrcRange);
  var sheetDstRange = 'A1:' + sheet.getRange(range.getHeight(), range.getWidth()).getA1Notation();
  var rangeValues = range.getValues();
  var folder = DriveApp.getFolderById(driveId);

  // Feel free to modify if needed
  // From sheet name (e.g. Sheet1.pdf)
  var pdfName = sheetName + '.pdf';
  // From specific cell, can be inside or outside your selected range to export (e.g. exportedPDF.pdf)
  // var pdfName = sheet.getRange('C7').getValue() + '.pdf';
  // From the combination of sheet name and range you chose (e.g. Sheet1_B5:C6.pdf)
  // var pdfName = sheetName + '_' + sheetSrcRange + '.pdf';
  
  // Create a blank spreadsheet to be able to export just the range
  var destSpreadsheet = SpreadsheetApp.create('PDF');
  
  // If our range is 2 rows and 2 columns we want it to be copied from A1 to B2
  // Then we can hide the rest of columns and rows and export 
  var sheet2 = destSpreadsheet.getSheetByName('temp');
  if (!sheet2){
    destSpreadsheet.insertSheet('temp').getRange(sheetDstRange).setValues(rangeValues);
    var sheet2 = destSpreadsheet.getSheetByName('temp');
  }
  
  // Hide all the rows and columns that do not have content 
  sheet2.hideRows(sheet2.getLastRow() + 1, sheet2.getMaxRows() - sheet2.getLastRow());
  sheet2.hideColumns(sheet2.getLastColumn() + 1, sheet2.getMaxColumns() - sheet2.getLastColumn());
  // Delete the first sheet that is automatically created when you create a new spreadsheet
  destSpreadsheet.deleteSheet(destSpreadsheet.getSheetByName(sheetName));
  
  // Export our new spreadsheet to PDF
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
  folder.createFile(theBlob);
  
  // Delete the spreadsheet we created to export this range. 
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

Образец данных:

Выход:

Знаете ли вы, какой код мне нужно использовать для pdfName, чтобы он был информацией в конкретной ячейке?

Caitlyn 23.12.2020 15:13

Можете ли вы привести пример вывода, который вы хотите иметь? pdfName. Вы имеете в виду, что если имя листа Sheet1, а диапазон, скажем, B5:D10, pdfName будет Sheet1_B5:D10.pdf? Если так, то да. Если вы имеете в виду, что pdfName получает имя из определенной ячейки, это также возможно.

NightEye 23.12.2020 16:04

@Caitlyn, я обновил ответ выше, чтобы показать возможные варианты экспортированного имени PDF.

NightEye 23.12.2020 17:39

@Кейтлин, я смогла ответить на твой вопрос? Если ваш вопрос был решен, пожалуйста, нажмите кнопку «Принять». Другие люди, у которых такая же проблема, как и вы, могут также обосновать ваш вопрос как вопрос, который можно решить. Если вы не найдете кнопку, не стесняйтесь сказать мне. stackoverflow.com/help/accepted-answer

NightEye 24.12.2020 20:14

Спасибо. Да, это было

Caitlyn 28.12.2020 15:06

Если это так, пожалуйста, примите ответ. Спасибо

NightEye 28.12.2020 15:58

Я решил ту же задачу другим способом, который избавился от кода и эффективно работает для меня. Вместо написания сценария для создания вкладки, копирования данных, удаления ненужных данных и т. д. я просто создаю вкладку «Экспорт» и использую запрос для получения данных, которые хочу экспортировать на регулярной основе.

В моем случае я хочу экспортировать столбцы в другом порядке, поэтому я использую формулу массива, чтобы извлечь отдельные столбцы из вкладки «Основные данные» в массив, а затем выполнить запрос к нему. Обратите внимание, что я также фильтрую данные ("Col7<>'Completed') в запросе, чтобы извлекать только те строки, которые мне нужны. Наконец, вы увидите, что фильтр ссылается на Col7, а не на букву столбца. Когда вы используете формулу массива, вы должны обращаться к столбцам по их положению в массиве (Col1, Col2 и т. д.)

=query(ArrayFormula({'Вкладка основных данных'!AJ:AJ,{'Вкладка основных данных'!G:G}&" "&{'Вкладка основных данных'!I:I},'Вкладка основных данных'!M :M,'Вкладка основных данных'!E:E,'Вкладка основных данных'!F:F,'Вкладка основных данных'!AK:AK,'Вкладка основных данных'!AI:AI,'Вкладка основных данных'!W :W,'Вкладка основных данных'!K:K,'Вкладка основных данных'!B:B,'Вкладка основных данных'!C:C,'Вкладка основных данных'!Y:Y}),"выберите *, где Col7 <>'Завершено' и Col7<>'Отменено'",1)

Вы можете упростить это, просто введя весь лист и используя запрос для выбора столбцов и фильтрации: =query('Вкладка «Первичные данные»'!A:AJ,"выберите A,B,D,G,T,AD, где G<>'Завершено' и G<>'Отменено'",1)

Как только вы это сделаете, данные на вкладке автоматически отобразятся на вкладке «Основные данные», и вы сможете просто экспортировать их в любое время.

Другие вопросы по теме