首页 > 解决方案 > 从 Google 表格导出 pdf 脚本时显示的“CELLIMAGE”文本代替图像

问题描述

嗨,那些比我聪明的人!

我有一个 Google 脚本可以从 Google 表格中导出 pdf,效果很好。但是,我在导出的 pdf 中未显示的单元格中有一个图像,它只是显示“CELLIMAGE”。如果我手动导出 pdf,它会正确显示图像...

在此处输入图像描述

在此处输入图像描述

我的代码是:

function exportFl() {

var sheetName = "FL" 
//var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
//var allsheets = ss.getSheets();
//for (var s in allsheets){
//var sheet=allsheets[s]
//var maxRows = ss.getMaxRows(); 
//var lastRow = ss.getLastRow();
//if (maxRows-lastRow != 0){
//ss.deleteRows(lastRow+1, maxRows-lastRow);}

var value = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName).getRange('E7').getValue();
var folderID = "1x0tBqOP07e2XIzXHgvYqAaBiu7Zd7DfV"; // Folder id to save in a folder.

var timeZone = Session.getScriptTimeZone();
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);

//Copy whole spreadsheet
var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

//delete redundant sheets
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];
//repace cell values with text (to avoid broken references) 
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);

//save to pdf

// --- I added below script.
var r = destSheet.getDataRange();
var startRow = r.getNumRows() + 1;
var number = destSheet.getMaxRows() - startRow + 1;
if (number > 0) destSheet.deleteRows(startRow, number);
SpreadsheetApp.flush(); // This might not be required to be used.
// ---

var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
var newFile = folder.createFile(theBlob);

//Delete the temporary sheet
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

任何人有任何想法?

谢谢

标签: google-apps-scriptgoogle-sheets

解决方案


似乎在您的脚本中,单元格被destRange.setValues(sourcevalues);. 我认为这可能是您的问题的原因。而且,在您的脚本中,这些值已经被var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder)). 那么在这种情况下,下面的修改呢?

在此修改中,我使用了以下流程。

  1. 复制第一个选项卡。
  2. 将数据覆盖到复制的工作表中。
  3. 将单元格中的图像复制到复制的工作表中。
  4. 删除临时表。

当这个流程反映到您的脚本时,它变成如下。

修改后的脚本:

从:

var destSheet = destSpreadsheet.getSheets()[0];
//repace cell values with text (to avoid broken references) 
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);

至:

var tempSheet = destSpreadsheet.getSheets()[0];

// 1. Copy the 1st tab.
var destSheet = tempSheet.copyTo(destSpreadsheet);

// 2. Overwrite the data to the copied sheet.
var sourceRange = sourceSheet.getRange(1, 1, sourceSheet.getMaxRows(), sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);

// 3. Copy the images in the cells to the copied sheet.
sourcevalues.forEach((r, i) => {
  r.forEach((c, j) => {
    if (c.toString() == "CellImage") {
      tempSheet.getRange(i + 1, j + 1).copyTo(destSheet.getRange(i + 1, j + 1), {contentsOnly: true}); // Modified
    }
  });
});

// 4. Delete the temporal sheet.
destSpreadsheet.deleteSheet(tempSheet);

参考:


推荐阅读