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

Google Apps Script批量生成PDF代码超时无报错,求排查解决

问题描述

我并非开发者,此前跟随YouTube教程实现从表格数据生成PDF,一切正常。但修改表格列并新建项目适配代码后,程序运行仅出现超时,调试无任何报错。以下是隐藏隐私ID后的代码:

function createBulkPDFs() {
  
  const docFile = DriveApp.getFileById("doc-id-");
  const tempFolder = DriveApp.getFolderById("folder-id");
  const pdfFolder = DriveApp.getFolderById("folder-id");
  const currentSheet = SpreadsheetApp.openById("sheet-id").getSheetByName("produtos");

  const data = currentSheet.getRange(4, 2, currentSheet.getLastRow()-3, 33).getValues();

  let errors = [];

  data.forEach(row => {
    try{
    createPDF(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12],row[13],row[14], row[15], row[16], row[17], row[18], row[19], row[20], row[21], row[22], row[23], row[24], row[25], row[26], row[27], row[28], row[29],row[30], row[31], row[32], row[0] + " " + row[1], docFile, tempFolder, pdfFolder);

    errors.push([""]);
    } catch(err){
      errors.push(["Failed"]);
    }
  });

  currentSheet.getRange(4, 35, currentSheet.getLastRow()-2, 1).setValues(errors);

}

function createPDF(tipo, nome, po, referencia, pack, statuscom, calculadora, statusatmkt, auto, disponibilidade, unidade, descricao,resumo,faz, nfaz, atencao, input, output, segmentos, dores, beneficios, complementar, similar, kit, pagina, op, ip, oa, ia, fin, seg, ben, data, pdfName, docFile, tempFolder, pdfFolder) {

  const tempFile = docFile.makeCopy(tempFolder);
  const tempDocFile = DocumentApp.openById(tempFile.getId());
  
  const body = tempDocFile.getBody();
    body.replaceText("[tipo]", tipo);
    body.replaceText("[nome]", nome);
    body.replaceText("[po]", po);
    body.replaceText("[referencia]", referencia);
    body.replaceText("[pack]", pack);
    body.replaceText("[statuscom]", statuscom);
    body.replaceText("[calculadora]", calculadora);
    body.replaceText("[statusatmkt]", statusatmkt);
    body.replaceText("[auto]", auto);
    body.replaceText("[disponibilidade]", disponibilidade);
    body.replaceText("[unidade]", unidade);
    body.replaceText("[descricao]", descricao);
    body.replaceText("[resumo]", resumo);
    body.replaceText("[faz]", faz);
    body.replaceText("[nfaz]", nfaz);
    body.replaceText("[atencao]", atencao);
    body.replaceText("[input]", input);
    body.replaceText("[output]", output);
    body.replaceText("[segmentos]", segmentos);
    body.replaceText("[dores]", dores);
    body.replaceText("[beneficios]", beneficios);
    body.replaceText("[complementar]", complementar);
    body.replaceText("[similar]", similar);
    body.replaceText("[kit]", kit);
    body.replaceText("[pagina]", pagina);
    body.replaceText("[op]", op);
    body.replaceText("[ip]", ip);
    body.replaceText("[oa]", oa);
    body.replaceText("[ia]", ia);
    body.replaceText("[fin]", fin);
    body.replaceText("[seg]", seg);
    body.replaceText("[ben]", ben);
    body.replaceText("[data]", data);

  tempDocFile.saveAndClose();

  const pdfContentBlob = tempFile.getAs(MimeType.PDF);
  pdfFolder.createFile(pdfContentBlob).setName(pdfName);
  tempFolder.removeFile(tempFile);
}
排查与解决思路
  • 先做小范围测试:只取1-2行数据运行,确认是单条数据处理卡壳还是批量数据触发超时。Google Apps Script单脚本执行上限为6分钟,批量生成大量PDF很容易触发超时。
  • 校验数据范围准确性:检查getRange(4, 2, currentSheet.getLastRow()-3, 33)的行数计算是否正确。如果表格存在空白行,getLastRow()会以最后一个非空行为准,可能导致取到多余的空数据行,空行处理时可能出现隐性阻塞。
  • 优化参数传递逻辑:当前逐个传递33个列数据,极易出现参数顺序错误(新增列后对应关系混乱)。建议直接传入整个row数组,在createPDF内通过索引取值,既不易出错,代码也更简洁:
    // 调用createPDF时修改为
    createPDF(row, `${row[0]} ${row[1]}`, docFile, tempFolder, pdfFolder);
    
    // 重写createPDF函数定义
    function createPDF(row, pdfName, docFile, tempFolder, pdfFolder) {
      const tipo = row[0];
      const nome = row[1];
      const po = row[2];
      // ...其余参数按索引依次对应
      const body = tempDocFile.getBody();
      body.replaceText("[tipo]", tipo);
      body.replaceText("[nome]", nome);
      // ...其余替换逻辑不变
    }
    
  • 添加日志定位卡点:在createPDF的关键步骤前后添加日志输出,比如:
    console.log(`开始处理文件:${pdfName}`);
    const tempFile = docFile.makeCopy(tempFolder);
    console.log(`临时文档已创建:${tempFile.getId()}`);
    tempDocFile.saveAndClose();
    console.log(`临时文档已保存,开始生成PDF`);
    
    执行后通过【查看】→【日志】查看程序卡在哪个环节,精准定位超时原因。
  • 拆分批量任务:如果是数据量过大导致超时,将批量处理拆分为多个小批次,使用时间触发器分批次执行,避免单次执行时间过长。
  • 检查模板占位符:确认新增列对应的占位符(如[ben]、[data])在模板文档中确实存在;同时检查是否有占位符对应超长文本,这类数据可能导致文本替换过程缓慢。

内容的提问来源于stack exchange,提问作者Erick Coelho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:31:08