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
相关产品推荐
相关产品推荐

