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

Google Apps Script中getThumbnail函数为何运行不稳定?

解决Google Apps Script中PDF缩略图获取时的Null Blob异常

问题根源

你遇到的Exception: Argument cannot be null: blob错误,是因为新创建的PDF文件在Google Drive中还未完成缩略图生成流程,此时调用getThumbnail()会返回null。Google Drive的文件处理(包括缩略图生成)是异步的,刚创建文件时可能还没完成这一步,导致偶尔失败。

解决方案

方案1:添加等待与重试机制

在创建PDF后,等待一段时间让Drive生成缩略图,或循环重试直到获取到有效的Blob:

function createJPG() {
  let nome = "Filipe Pereira";
  let grad = "3º Sargento";
  let quadro = "QPMP-C";
  let funcao = "Fotógrafo";
  let lotacao = "Assessoria de Comunicação";
  let telefone = "(27) 3636-8717";
  let email = "secretaria@pm.es.gov.br";
  const docFile = DriveApp.getFileById("1EhDglV8aumu__zAOfasdfasrukNKYFDas");
  const folder = DriveApp.getFolderById("1fwAhuCdoYyUdHfasdfaPyjRq5iN97");
  const jpgFolder = DriveApp.getFolderById("14iZ4sS4jR5sadfasdKainJTnurZ9cgvpH");
  const tempFile = docFile.makeCopy(jpgFolder);
  const tempDocFile = SlidesApp.openById(tempFile.getId());
  const slide = tempDocFile.getSlides()[0];
  slide.replaceAllText("{nome}",nome);
  slide.replaceAllText("{grad}",grad);  
  slide.replaceAllText("{quadro}",quadro);
  slide.replaceAllText("{funcao}",funcao);
  slide.replaceAllText("{lotacao}",lotacao);
  slide.replaceAllText("{telefone}",telefone);
  slide.replaceAllText("{email}",email);
  tempDocFile.saveAndClose();
    
  // 创建PDF
  const pdfContentBlob = tempFile.getAs(MimeType.PDF);
  const newPDF = jpgFolder.createFile(pdfContentBlob).setName(nome);
  
  // 等待并重试获取缩略图
  let blob = null;
  const maxRetries = 5;
  let retryCount = 0;
  while (blob === null && retryCount < maxRetries) {
    Utilities.sleep(2000); // 每次等待2秒
    blob = newPDF.getThumbnail();
    retryCount++;
  }
  
  if (blob !== null) {
    const newJPG = jpgFolder.createFile(blob).setName(nome);
  } else {
    console.error("无法获取PDF缩略图,重试次数已达上限");
  }
  
  folder.removeFile(tempFile);
  jpgFolder.removeFile(newPDF);
}

方案2:直接从幻灯片导出图片(更可靠)

跳过PDF转换步骤,直接将编辑后的幻灯片导出为图片,避免依赖Drive的缩略图生成机制:

function createJPG() {
  let nome = "Filipe Pereira";
  let grad = "3º Sargento";
  let quadro = "QPMP-C";
  let funcao = "Fotógrafo";
  let lotacao = "Assessoria de Comunicação";
  let telefone = "(27) 3636-8717";
  let email = "secretaria@pm.es.gov.br";
  const docFile = DriveApp.getFileById("1EhDglV8aumu__zAOfasdfasrukNKYFDas");
  const folder = DriveApp.getFolderById("1fwAhuCdoYyUdHfasdfaPyjRq5iN97");
  const jpgFolder = DriveApp.getFolderById("14iZ4sS4jR5sadfasdKainJTnurZ9cgvpH");
  const tempFile = docFile.makeCopy(jpgFolder);
  const tempDocFile = SlidesApp.openById(tempFile.getId());
  const slide = tempDocFile.getSlides()[0];
  slide.replaceAllText("{nome}",nome);
  slide.replaceAllText("{grad}",grad);  
  slide.replaceAllText("{quadro}",quadro);
  slide.replaceAllText("{funcao}",funcao);
  slide.replaceAllText("{lotacao}",lotacao);
  slide.replaceAllText("{telefone}",telefone);
  slide.replaceAllText("{email}",email);
  tempDocFile.saveAndClose();
  
  // 直接将幻灯片导出为JPG Blob
  const slideId = slide.getObjectId();
  const url = `https://docs.google.com/presentation/d/${tempFile.getId()}/export/png?id=${tempFile.getId()}&pageid=${slideId}`;
  const options = {
    headers: {
      'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
    }
  };
  const response = UrlFetchApp.fetch(url, options);
  const blob = response.getBlob().setName(`${nome}.jpg`);
  
  // 保存图片到指定文件夹
  jpgFolder.createFile(blob);
  
  // 清理临时文件
  jpgFolder.removeFile(tempFile);
}

说明

  • 方案2无需依赖PDF转换,直接通过Google Slides的导出接口生成图片,成功率更高且流程更简洁。
  • 若必须保留PDF转换步骤,方案1的重试机制能有效降低异步处理导致的失败概率。

内容的提问来源于stack exchange,提问作者Filipe Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:50:28