Google Sheets脚本导出PDF时单元格图片显示CELLIMAGE问题求解
问题原因
- 导出PDF丢失单元格图片的核心原因是你代码中多余的覆写值逻辑:
var sourcevalues = sourceRange.getValues(); var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns()); destRange.setValues(sourcevalues);
getValues()方法仅能读取单元格内的文本、公式结果等纯值内容,无法读取插入到单元格内的图片对象,执行setValues()后相当于直接把原单元格的图片替换成了固定文本CELLIMAGE,自然导出的PDF不会显示图片。- 你创建的临时表格本身是原表的完整副本,自带所有单元格图片和格式,这步覆写值属于多余操作,反而破坏了原始内容。
修复后的完整代码
function exportFl() { var sheetName = "FL" var value = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange('E7').getValue(); var folderID = "1x0tBqOP07e2XIzXHgvYqAaBiu7Zd7DfV"; // 保存PDF的文件夹ID var timeZone = Session.getScriptTimeZone(); var date = Utilities.formatDate(new Date(), timeZone, "YYMMdd"); var pdfName = value+"_FSL Conformance_"+ date; var sourceSpreadsheet = SpreadsheetApp.getActive(); var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName); var folder = DriveApp.getFolderById(folderID); // 复制整个原表作为临时表格,保留所有格式和单元格图片 var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder)) // 删除不需要的其他工作表 var sheets = destSpreadsheet.getSheets(); for (i = 0; i < sheets.length; i++) { if (sheets[i].getSheetName() != sheetName){ destSpreadsheet.deleteSheet(sheets[i]); } } var destSheet = destSpreadsheet.getSheets()[0]; // 删除多余空白行 var r = destSheet.getDataRange(); var startRow = r.getNumRows() + 1; var number = destSheet.getMaxRows() - startRow + 1; if (number > 0) destSheet.deleteRows(startRow, number); SpreadsheetApp.flush(); // 导出PDF var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName); folder.createFile(theBlob); // 删除临时文件 DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true); }
核心修改点
- 移除了原代码中
getValues()、setValues()的覆写逻辑,保留临时表自带的原始图片和格式 - 其余原有功能(删除多余工作表、清理空白行、导出PDF、清理临时文件)均保留,不影响原有业务逻辑
- 修改后导出的PDF即可正常显示单元格图片,和手动导出效果完全一致
内容的提问来源于stack exchange,提问作者Jon Bowles
相关产品推荐
相关产品推荐

