Google 脚本:使用同一个 Goolge Sheet 中的多个页面创建 PDF

问题描述 投票:0回答:1

我正在尝试使用脚本从 Google Sheets 导出 PDF。到目前为止,导出单个页面效果很好。但我想在同一 PDF 的单个页面上导出不同的范围。 你能帮我如何完成这项工作吗?

我是脚本新手,根据我在网上找到的示例修改了此代码。所以不知道这是否可能。

在我的代码中,我从 A1:I44 获取表格并将其作为 pdf 导出到单个页面上。这很好用。 但现在我想在同一 PDF 的第二页上添加范围 A51:I94。

非常感谢您的帮助!

function savePdfRechnung() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet =  ss.getSheetByName('HN_Vorlage');
var rngStr = 'A1:I44';
  var inputs = sheet.getRange('O5:O23').getValues();
  var url = 'https://docs.google.com/spreadsheets/d/' + ss.getId() + '/export?format=pdf&exportFormat=pdf&size=A4&portrait=true&scale=4&top_margin=0&left_margin=0&right_margin=0&bottom_margin=0&range=' + rngStr + '&gid=' + 1929278749;
  var result = UrlFetchApp.fetch(url, {headers:{Authorization:"Bearer "+ScriptApp.getOAuthToken()}});
  var contents = result.getBlob(); //.getContent();
  var folder = DriveApp.getFolderById(inputs[1][0]);
  DriveApp.createFile(contents).setName(inputs[0][0] + ".pdf").moveTo(folder);
}

function fetch(url) {
  var cache = CacheService.getScriptCache();
  var result = cache.get(url);
  if(!result) {
    var response = UrlFetchApp.fetch(url);
    result = response.getContentText();
    cache.put(url, result, 21600);
  }
  return result;
}


google-apps-script pdf google-drive-api google-cloud-storage
1个回答
0
投票

我相信您的目标如下。

  • 您想要使用 Google Apps 脚本将 2 个范围的“A1:I44”和“A51:I94”从工作表 ID 为

    1929278749
    的工作表导出为包含 2 个页面的 PDF 文件。

  • 在你的问题中,你的显示功能

    fetch(url)
    与你的问题无关。

既然如此,下面的修改如何?在此修改中,我使用了我的示例脚本

修改后的脚本:

async function savePdfRechnung() {
  var sheetId = "1929278749"; // This sheet ID is from your showing script.
  var ranges = ['A1:I44', 'A51:I94']; // These ranges are from your question.

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var token = ScriptApp.getOAuthToken();
  var data = ranges.map(r => {
    var url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf&exportFormat=pdf&size=A4&portrait=true&scale=4&top_margin=0&left_margin=0&right_margin=0&bottom_margin=0&range=${r}&gid=${sheetId}`;
    return new Uint8Array(UrlFetchApp.fetch(url, { headers: { Authorization: "Bearer " + token } }).getContent());
  });

  // Load pdf-lib.js
  var cdnUrl = "https://cdn.jsdelivr.net/npm/pdf-lib/dist/pdf-lib.min.js";
  eval(UrlFetchApp.fetch(cdnUrl).getContentText().replace(/setTimeout\(.*?,.*?(\d*?)\)/g, "Utilities.sleep($1);return t();"));
  // Merge PDF data.
  var pdfDoc = await PDFLib.PDFDocument.create();
  for (let i = 0; i < data.length; i++) {
    var pdfData = await PDFLib.PDFDocument.load(data[i]);
    var pages = await pdfDoc.copyPages(pdfData, [...Array(pdfData.getPageCount())].map((_, i) => i));
    pages.forEach(page => pdfDoc.addPage(page));
  }
  var bytes = await pdfDoc.save();
  var contents = Utilities.newBlob([...new Int8Array(bytes)], MimeType.PDF, "sample.pdf");

  // PDF blob is created as a file. This is from your showing script.
  var sheet = ss.getSheetByName('HN_Vorlage');
  var inputs = sheet.getRange('O5:O23').getValues();
  var folder = DriveApp.getFolderById(inputs[1][0]);
  DriveApp.createFile(contents).setName(inputs[0][0] + ".pdf").moveTo(folder);
}
  • 运行此脚本时,工作表 ID
    ['A1:I44', 'A51:I94']
    的工作表的
    1929278749
    范围将转换为 PDF 数据。并且,“A1:I44”和“A51:I94”分别创建为第一页和第二页。

注:

  • 在此修改中,它假设您的工作表 ID
    1929278749
    是有效的工作表 ID,并且用于从底部脚本中的 Blob 创建文件的脚本工作正常。请注意这一点。
© www.soinside.com 2019 - 2024. All rights reserved.