我正在尝试使用脚本从 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 脚本将 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);
}
['A1:I44', 'A51:I94']
的工作表的 1929278749
范围将转换为 PDF 数据。并且,“A1:I44”和“A51:I94”分别创建为第一页和第二页。1929278749
是有效的工作表 ID,并且用于从底部脚本中的 Blob 创建文件的脚本工作正常。请注意这一点。