google-apps-script - 从 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);
}
任何人有任何想法?
谢谢
解决方案
似乎在您的脚本中,单元格被destRange.setValues(sourcevalues);
. 我认为这可能是您的问题的原因。而且,在您的脚本中,这些值已经被var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))
. 那么在这种情况下,下面的修改呢?
在此修改中,我使用了以下流程。
- 复制第一个选项卡。
- 将数据覆盖到复制的工作表中。
- 将单元格中的图像复制到复制的工作表中。
- 删除临时表。
当这个流程反映到您的脚本时,它变成如下。
修改后的脚本:
从:
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);
参考:
推荐阅读
- python - django.db.utils.DataError: value too long for type character varying(650)
- c++ - C++ - 允许编译器回收已删除的指针变量吗?
- android - 如何让 Last LatLong 使用 FusedLocationProviderClient 进入服务?
- ios - 如何通过 UITapGestureRecognizer 将数据从一个 UIViewController 传递到另一个
- java - JMS 重新交付延迟,如斐波那契数
- node.js - 带有节点 mssql 的 Azure SQL 给出奇怪的错误
- actionscript-3 - 变量定义为字符串
- terminal - 字符显示宽度的终端控制序列?
- listview - 如何删除 Flutter ListView 中的剪辑?
- r - R:如何将相同的变量(行号)添加到列表中的每个数据框?