You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Tanaike的PDF合并Google Apps Script Web App返回文件ID?

解决Google Apps Script Web App异步合并PDF无法返回文件ID的问题

核心问题在于Google Apps Script的doGet默认是同步执行逻辑,直接调用异步函数mergePdf会导致函数提前返回Promise对象,而非最终的文件ID结果。以下是针对性的修改方案:

修改要点

  1. 将doGet改为异步函数,通过await等待mergePdf的异步操作全部完成后再返回结果
  2. 明确指定返回内容的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:21:36