如何修改Tanaike的PDF合并Google Apps Script Web App返回文件ID?
解决Google Apps Script Web App异步合并PDF无法返回文件ID的问题
核心问题在于Google Apps Script的doGet默认是同步执行逻辑,直接调用异步函数mergePdf会导致函数提前返回Promise对象,而非最终的文件ID结果。以下是针对性的修改方案:
修改要点
- 将
doGet改为异步函数,通过await等待mergePdf的异步操作全部完成后再返回结果 - 明确指定返回内容的MIME类型,避免解析异常
修改后完整代码
async function doGet(e) { const pdfIds = JSON.parse(e.parameter.pdfIds); const filename = e.parameter.filename; return await mergePdf(pdfIds, filename); } async function mergePdf(pdfIds, filename) { const ids = pdfIds; const data = ids.map((id) => new Uint8Array(DriveApp.getFileById(id).getBlob().getBytes())); // 加载pdf-lib库 const cdnjs = "https://cdn.jsdelivr.net/npm/pdf-lib/dist/pdf-lib.min.js"; eval(UrlFetchApp.fetch(cdnjs).getContentText()); const pdfDoc = await PDFLib.PDFDocument.create(); for (let i = 0; i < data.length; i++) { const pdfData = await PDFLib.PDFDocument.load(data[i]); const pageIndices = [...Array(pdfData.getPageCount())].map((_, idx) => idx); const pages = await pdfDoc.copyPages(pdfData, pageIndices); pages.forEach(page => pdfDoc.addPage(page)); } const bytes = await pdfDoc.save(); // 创建合并后的PDF文件并获取ID const mergedPdfBlob = Utilities.newBlob([...new Int8Array(bytes)], MimeType.PDF, filename); const mergedPdf = DriveApp.createFile(mergedPdfBlob); const fileId = mergedPdf.getId(); return ContentService.createTextOutput(fileId).setMimeType(ContentService.MimeType.TEXT); }
额外注意事项
- 重新部署Web App时,需选择“创建新版本”,并根据需求设置执行权限(如“任何人,甚至匿名”)
- 确保脚本拥有Drive文件的读写权限,能访问传入的PDF文件并创建新文件
内容的提问来源于stack exchange,提问作者Metric Rat
相关产品推荐
相关产品推荐

