google-apps-script - 以 PNG 格式保存到云端硬盘的 Google 表格图表的透明背景
问题描述
我在尝试将具有透明背景的图表保存到云端硬盘时遇到了一些问题。我可以.setOption('backgroundColor', 'transparent');
,但这并没有设置图表所在“容器”的背景,因此图表仍然显示为具有白色背景。
有谁知道如何引用和设置图表所在容器的背景颜色?
谢谢尼克
function saveChartstoGdrive(){
//Getting chart from the current spreadsheet
var targetspreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = targetspreadsheet.getSheetByName('Sales Graph');
var charts = sheet.getCharts();
var chartBlobs=new Array(charts.length);
var filePrefix="scrlxz";
//loop through charts saving each to gdrive
for(var i=0;i<charts.length;i++){
//build each chart
var builderChart = charts[i].modify();
builderChart.setOption('width', 1400);
builderChart.setOption('height', 900);
builderChart.setOption('title', 'Updated!');
builderChart.setOption('backgroundColor', 'transparent');
var newChart =builderChart.build();
//create PNG blob of chart for writing
chartBlobs[i]= newChart.getAs('image/png');
//make sure we have the correct file and prepare for saving
var fileName = filePrefix+[i]+".png";
var fileId = DriveApp.getFilesByName(fileName).next().getId();
var contentBlob = chartBlobs[i];
//save file to ggdrive
var myVar = Drive.Files.update({mimeType: 'image/png'}, fileId, contentBlob);
}
}
解决方案
我相信你的目标如下。
- 您想用透明背景修改工作表上的图表。
- 您希望将修改后的图表导出为具有透明背景的 PNG 文件。
- 您想使用 Google Apps 脚本实现此目的。
修改点:
最近,我报道了使用 Google Apps Script 创建带有 Alpha 通道的 PNG 图像。当我看到你的问题时,我认为这份报告可能有用。该报告的流程用于您的情况,如下所示。
- 检索图表并修改图表。
- 更新图表。
- 创建新的 Google 幻灯片作为临时文件。
- 将幻灯片的背景颜色更改为透明。
- 插入修改后的图表。图表的背景颜色是透明的。
- 将幻灯片导出为带有 Alpha 通道的 PNG。
- 图表将返回到原始图表。
- 删除临时文件。
- 将导出的 PNG 数据创建为文件。在这种情况下,当文件存在时,文件将被覆盖。当找不到文件时,将文件创建为新文件。
而且,当我看到你的脚本时,现有图表被修改为透明背景。所以你从
var newChart =builderChart.build();
. 在这种情况下,我发现修改后的图表仍然没有反映到newChart
. 因此,在这个修改后的脚本中,图表由修改后的图表更新。并且,在检索到更新的图表后,该图表将返回到原始图表。而且,在这个修改后的脚本中,当文件
fileName
存在时,文件会被新图表覆盖。当未找到文件时,将使用新图表作为新文件创建文件。
当以上几点反映到您的脚本时,它变成如下。
修改后的脚本:
请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。并且,此脚本假定工作表“销售图表”具有图表。请注意这一点。并且,请再次确认 Drive API 是否已经在 Advanced Google services 中启用。
function saveChartstoGdrive() {
var targetspreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = targetspreadsheet.getSheetByName('Sales Graph');
var charts = sheet.getCharts();
var chartBlobs = new Array(charts.length);
var filePrefix = "scrlxz";
for (var i = 0; i < charts.length; i++) {
// 1. Retrieve chart and modify chart.
var orgChart = charts[i]; // Added
var builderChart = charts[i].modify();
builderChart.setOption('width', 1400);
builderChart.setOption('height', 900);
builderChart.setOption('title', 'Updated!')
builderChart.setOption('backgroundColor', 'transparent');
var newChart = builderChart.build();
// --- I added below script.
// 2. Update chart.
sheet.updateChart(newChart); // It seems that this is required to be used for reflecting the settings.
// 3. Create new Google Slides as the temporal file.
var temp = SlidesApp.create("temp");
var slide = temp.getSlides()[0];
var id = temp.getId();
slide.getShapes().forEach(s => s.remove());
// 4. Change the background color of slide to the transparent.
slide.getBackground().setTransparent();
// 5. Insert the modified chart. The background color of chart is the transparent.
slide.insertSheetsChart(newChart);
temp.saveAndClose();
// 6. Export the slide as PNG with the alpha channel.
var url = `https://docs.google.com/feeds/download/presentations/Export?id=${id}&exportFormat=png`;
var blob = UrlFetchApp.fetch(url, {headers: {authorization: "Bearer " + ScriptApp.getOAuthToken()}}).getBlob();
// 7. The chart is returned back to the original one.
sheet.updateChart(orgChart); // Here, the updated chart is returned back to the original one.
// 8. Remove the temporal file.
DriveApp.getFileById(id).setTrashed(true);
// --- I modified below script.
// 9. Create the exported PNG data as a file. In this case, when the file is existing, the file is overwritten. When the file is not found, the file is created as new file.
chartBlobs[i] = blob;
var fileName = filePrefix + [i] + ".png";
var contentBlob = chartBlobs[i];
var file = DriveApp.getFilesByName(fileName);
if (file.hasNext()) {
var fileId = file.next().getId();
var myVar = Drive.Files.update({ mimeType: 'image/png' }, fileId, contentBlob);
} else {
DriveApp.createFile(contentBlob.setName(fileName));
}
}
}
结果:
为以下工作表运行上述脚本时,将获得具有 alpha 通道的 PNG 文件。
为了确认PNG文件的透明背景,作为一个例子,当创建的PNG文件插入到电子表格时,它变成如下。您可以看到图像的背景是透明的。
参考:
推荐阅读
- r - 在 R 中创建特殊形式的矩阵和越界错误
- pytorch - RuntimeError:预期所有张量都在同一设备上,但在使用 LayerNorm 时发现至少两个设备
- google-cloud-spanner - 使用 Spring Data Spanner 按交错表字段查询
- google-chrome - Chrome 和 Edge 的一个非常奇怪的行为,但不是 IE
- angular - i18n Angular App 的 htaccess 配置不起作用
- sql-server - 如果表具有依赖关系,如何截断多个表
- javascript - 如何存储axios获取对变量的响应
- elixir - 无法获得通过 Elixir 管道推送的 URL 列表
- logging - 在 .NET 5.0 控制台应用程序中调用 ServiceProvider.GetRequiredService 时出现异常
- sql - 手动查询 vs 触发函数输出