Экспорт PDF, могу ли я предоставить два диапазона?

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

Я использую этот код для экспорта листа в формате PDF.

 {var url_ext = '/export?exportFormat=pdfamp;format=pdf'  
      
        (sheetId ? ('amp;gid='   sheetId) : ('amp;id='   spreadsheetId))
        (shRng ? ('amp;range=A1:L43') : null)
      // following parameters are optional...
        'amp;size=A4'      // paper size
        'amp;portrait=true'    // orientation, false for landscape
        'amp;fitw = true' // fit to width, false for actual size
        'amp;sheetnames=falseamp;printtitle=falseamp;pagenumbers=false'  //hide optional headers and footers
        'amp;gridlines=false'  // hide gridlines
        'amp;fzr=false';       // do not repeat row headers (frozen rows) on each page
      }
  

Есть ли способ предоставить два диапазона и экспортировать их в один и тот же PDF, но на разные страницы? Счет-фактура

Причина этого в том, что я хочу отправить всю электронную таблицу, показанную на изображении, но я хочу, чтобы столбцы M-Z отображались на другой странице. Прямо сейчас я могу указать 1 диапазон (A1: L43), и он печатается нормально.

ИЛИ, может быть, есть способ вставить разрыв страницы, изменить масштаб таблицы перед экспортом, например. другой способ разделения таблицы на две страницы одного и того же PDF, который кто-то может порекомендовать.

Комментарии:

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

2. @Cooper Можете ли вы предоставить какой-нибудь код, чтобы показать, как я мог бы попробовать это? Спасибо.

3. Я мог бы, но если бы я это сделал, вы бы никогда не научились делать это самостоятельно. Сначала попробуйте сделать это самостоятельно. Затем задавайте конкретные целенаправленные вопросы, когда у вас возникнут проблемы.

4. @Cooper чтобы я правильно понял, я должен попытаться поместить данные, содержащиеся в одном диапазоне, во временную таблицу, а затем экспортировать их? Я не понимаю, зачем мне нужен временный лист.

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

Ответ №1:

Если я вас правильно понял, вы хотите экспортировать разные диапазоны с определенного листа в файл PDF (где данные из каждого диапазона должны быть на разных страницах).

Если это так, и предполагается, что диапазоны находятся на активной странице, вы можете выполнить следующие действия:

  • Создайте временную электронную таблицу, которая будет использоваться для экспорта данных в PDF (используйте SpreadsheetApp.create(имя)).
  • Для каждого желаемого обозначения диапазона (в данном случае, я думаю, что диапазоны — это A1:L43 и M1:Z43 ), создайте временный лист и скопируйте диапазон на этот лист, используя insertSheet() и Range.CopyTo(диапазон).
  • Скопируйте каждый временный лист (содержащий данные из каждого диапазона) во временную электронную таблицу, используя Sheet.CopyTo(электронная таблица).
  • Удалите временные листы, используя deleteSheet (лист).
  • Экспортируйте временную электронную таблицу в PDF. В приведенном ниже примере я добавляю экспортированный PDF-файл на диск, используя UrlFetchApp.fetch(url, параметры) и DriveApp.CreateFile(blob).
  • Удалите временную электронную таблицу, используя службу Advanced Drive (вы должны включить ее через Resources > Advanced Google Services... . В противном случае последняя строка в предоставленном скрипте выдаст ошибку).

Пример кода:

 // Copyright 2020 Google LLC.
// SPDX-License-Identifier: Apache-2.0

function MULTIPLE_RANGES_TO_PDF() {
  const ss = SpreadsheetApp.getActive();
  const tempSS = SpreadsheetApp.create("Temporary Spreadsheet");
  const sourceSheet = ss.getActiveSheet();
  const rangeNotations = ["A1:L43", "M1:Z43"];
  rangeNotations.forEach(rangeNotation => {
    const sourceRange = sourceSheet.getRange(rangeNotation);
    const tempSheet = ss.insertSheet();
    sourceRange.copyTo(tempSheet.getRange("A1"));
    tempSheet.copyTo(tempSS);
    ss.deleteSheet(tempSheet);
  });
  tempSS.deleteSheet(tempSS.getSheets()[0]); // Remove first sheet in temp (blank)
  var url = "https://www.googleapis.com/drive/v3/files/"   tempSS.getId()   "/export?mimeType=application/pdf";
  var params = {
    headers: { "Authorization": "Bearer "   ScriptApp.getOAuthToken() }
  }
  var pdf = UrlFetchApp.fetch(url, params).getBlob();
  DriveApp.createFile(pdf).setName("My exported PDF.pdf");
  Drive.Files.remove(tempSS.getId());
}