如何将 google 张表格中的多个图表添加到 1 google 张幻灯片中
How to add multiple charts into 1 google slides from google sheets
我正在尝试使用应用程序脚本从指定的 google sheet 添加多个图表到 Google 幻灯片。
所以我的一张幻灯片将有 2 个图表,如果我需要插入 2 个以上的图表,幻灯片应该自动复制自己,然后可以插入更多图表。但是我无法插入正确的图表,当它复制幻灯片时,它似乎一遍又一遍地插入相同的图表。
然而,我 运行 遇到了一些需要帮助的问题,但我无法自己找到答案。
这是代码,下面是我 运行 关注的问题:
function importpieCharts() {
var dataSpreadsheetUrl = "https://docs.google.com/spreadsheets/d/1tPc0KU2uYuN4rO32tW-s6lql_IW57kbDUdSR8ZSkVXY/edit#gid=0"; //make sure this includes the '/edit at the end
var ss = SpreadsheetApp.openByUrl(dataSpreadsheetUrl);
var deck = SlidesApp.getActivePresentation();
var deckTitle = SlidesApp.getActivePresentation().getName();
var sheet = ss.getSheetByName(deckTitle);
var charts = sheet.getCharts();
var slides = deck.getSlides();
var pieChartTemplate = slides[1];
charts.forEach(function(chart){
if(chart.modify().getChartType() == "PIE"){
pieChartTemplate.duplicate();
var updateSlide = deck.getSlides()[1];
var pageElements = updateSlide.getPageElements();
pageElements.forEach(function(pageElement){
if(pageElement.getPageElementType() == "SHAPE"){
if(pageElement.asShape().getShapeType() == "RECTANGLE"){
pageElement.asShape().replaceWithSheetsChart(chart);
}}});
var presLength = deck.getSlides().length;
updateSlide.move(presLength-2);
}});
}
- 每当我 运行 代码时,我都无法将 2 个或更多独特的图表插入到 1 张幻灯片中。
- 当代码 运行s 时,它创建了比必要更多的重复项,在这种特殊情况下,幻灯片只需要复制一次。
- 复制后,代码无法识别要插入 google 张幻灯片的正确图表。
请帮忙解决这个问题,或者请给我指明正确的方向!任何帮助深表感谢:)
以下是相关文件链接:
Google 张幻灯片:https://docs.google.com/presentation/d/1CyUkJ7S4eq00MRol3RzcdyAG1m6ovUFBK0H9fxfu-28/edit?usp=sharing
Google 张:https://docs.google.com/spreadsheets/d/1tPc0KU2uYuN4rO32tW-s6lql_IW57kbDUdSR8ZSkVXY/edit?usp=sharing
免责声明:我是一个新手,我对应用程序脚本的任何了解都是完全自学的,以使我的日常工作更轻松。我当然对代码及其应用真正感兴趣
我相信你的目标如下。
- 您想将
{{placeholder for chart}}
替换为 Google 幻灯片中的电子表格图表。
- 在您的模板幻灯片中,有 2 个
{{placeholder for chart}}
。此外,Google 电子表格中有多个图表。
- 您想用每个电子表格图表按图表顺序替换
{{placeholder for chart}}
。
修改点:
- 在您的脚本中,使用了 2 个循环。而在内部循环中,一个
chart
用于替换。这样,每张幻灯片都有相同的 2 个图表。我认为这可能是您遇到问题的原因。
- 为了将
{{placeholder for chart}}
按图表顺序替换为每个电子表格图表,只需要在内部循环中替换一张图表。为此,我建议增加一个检查复制模板幻灯片的条件。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
function importpieCharts() {
var dataSpreadsheetUrl = "https://docs.google.com/spreadsheets/d/1tPc0KU2uYuN4rO32tW-s6lql_IW57kbDUdSR8ZSkVXY/edit#gid=0"; //make sure this includes the '/edit at the end
var ss = SpreadsheetApp.openByUrl(dataSpreadsheetUrl);
var deckTitle = SlidesApp.getActivePresentation().getName();
var sheet = ss.getSheetByName(deckTitle);
var charts = sheet.getCharts();
var slides = deck.getSlides();
var pieChartTemplate = slides[1];
// I modified below script.
var copy = true;
var updateSlide;
charts.forEach(function(chart, idx, a) {
if(chart.modify().getChartType() == "PIE"){
if (copy) {
updateSlide = pieChartTemplate.duplicate();
var presLength = deck.getSlides().length;
updateSlide.move(presLength - 2);
copy = false;
}
var pageElements = updateSlide.getPageElements();
for (var i = 0; i < pageElements.length; i++) {
var pageElement = pageElements[i];
if (pageElement.getPageElementType() == "SHAPE" && pageElement.asShape().getShapeType() == "RECTANGLE") {
pageElement.asShape().replaceWithSheetsChart(chart);
break;
}
}
if (!pageElements.some(function(p) {return p.getPageElementType() == "SHAPE" && p.asShape().getShapeType() == "RECTANGLE"})) {
copy = true;
}
// When the following script is used, the template sheet is removed at the last loop.
// if (idx == a.length - 1) deck.getSlides().pop().remove();
}
});
}
- 在此修改后的脚本中,当脚本完成时,模板幻灯片位于最后一张幻灯片。如果要删除它,请在上面的脚本中使用
if (idx == a.length - 1) deck.getSlides().pop().remove();
。
注:
- 作为附加信息,在上面的脚本中,当
updateSlide.move(presLength - 2)
修改为 updateSlide.move(presLength)
时,当脚本完成时,模板幻灯片是 Google 幻灯片的第 2 页。
我正在尝试使用应用程序脚本从指定的 google sheet 添加多个图表到 Google 幻灯片。 所以我的一张幻灯片将有 2 个图表,如果我需要插入 2 个以上的图表,幻灯片应该自动复制自己,然后可以插入更多图表。但是我无法插入正确的图表,当它复制幻灯片时,它似乎一遍又一遍地插入相同的图表。
然而,我 运行 遇到了一些需要帮助的问题,但我无法自己找到答案。
这是代码,下面是我 运行 关注的问题:
function importpieCharts() {
var dataSpreadsheetUrl = "https://docs.google.com/spreadsheets/d/1tPc0KU2uYuN4rO32tW-s6lql_IW57kbDUdSR8ZSkVXY/edit#gid=0"; //make sure this includes the '/edit at the end
var ss = SpreadsheetApp.openByUrl(dataSpreadsheetUrl);
var deck = SlidesApp.getActivePresentation();
var deckTitle = SlidesApp.getActivePresentation().getName();
var sheet = ss.getSheetByName(deckTitle);
var charts = sheet.getCharts();
var slides = deck.getSlides();
var pieChartTemplate = slides[1];
charts.forEach(function(chart){
if(chart.modify().getChartType() == "PIE"){
pieChartTemplate.duplicate();
var updateSlide = deck.getSlides()[1];
var pageElements = updateSlide.getPageElements();
pageElements.forEach(function(pageElement){
if(pageElement.getPageElementType() == "SHAPE"){
if(pageElement.asShape().getShapeType() == "RECTANGLE"){
pageElement.asShape().replaceWithSheetsChart(chart);
}}});
var presLength = deck.getSlides().length;
updateSlide.move(presLength-2);
}});
}
- 每当我 运行 代码时,我都无法将 2 个或更多独特的图表插入到 1 张幻灯片中。
- 当代码 运行s 时,它创建了比必要更多的重复项,在这种特殊情况下,幻灯片只需要复制一次。
- 复制后,代码无法识别要插入 google 张幻灯片的正确图表。
请帮忙解决这个问题,或者请给我指明正确的方向!任何帮助深表感谢:) 以下是相关文件链接: Google 张幻灯片:https://docs.google.com/presentation/d/1CyUkJ7S4eq00MRol3RzcdyAG1m6ovUFBK0H9fxfu-28/edit?usp=sharing Google 张:https://docs.google.com/spreadsheets/d/1tPc0KU2uYuN4rO32tW-s6lql_IW57kbDUdSR8ZSkVXY/edit?usp=sharing
免责声明:我是一个新手,我对应用程序脚本的任何了解都是完全自学的,以使我的日常工作更轻松。我当然对代码及其应用真正感兴趣
我相信你的目标如下。
- 您想将
{{placeholder for chart}}
替换为 Google 幻灯片中的电子表格图表。 - 在您的模板幻灯片中,有 2 个
{{placeholder for chart}}
。此外,Google 电子表格中有多个图表。 - 您想用每个电子表格图表按图表顺序替换
{{placeholder for chart}}
。
修改点:
- 在您的脚本中,使用了 2 个循环。而在内部循环中,一个
chart
用于替换。这样,每张幻灯片都有相同的 2 个图表。我认为这可能是您遇到问题的原因。 - 为了将
{{placeholder for chart}}
按图表顺序替换为每个电子表格图表,只需要在内部循环中替换一张图表。为此,我建议增加一个检查复制模板幻灯片的条件。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
function importpieCharts() {
var dataSpreadsheetUrl = "https://docs.google.com/spreadsheets/d/1tPc0KU2uYuN4rO32tW-s6lql_IW57kbDUdSR8ZSkVXY/edit#gid=0"; //make sure this includes the '/edit at the end
var ss = SpreadsheetApp.openByUrl(dataSpreadsheetUrl);
var deckTitle = SlidesApp.getActivePresentation().getName();
var sheet = ss.getSheetByName(deckTitle);
var charts = sheet.getCharts();
var slides = deck.getSlides();
var pieChartTemplate = slides[1];
// I modified below script.
var copy = true;
var updateSlide;
charts.forEach(function(chart, idx, a) {
if(chart.modify().getChartType() == "PIE"){
if (copy) {
updateSlide = pieChartTemplate.duplicate();
var presLength = deck.getSlides().length;
updateSlide.move(presLength - 2);
copy = false;
}
var pageElements = updateSlide.getPageElements();
for (var i = 0; i < pageElements.length; i++) {
var pageElement = pageElements[i];
if (pageElement.getPageElementType() == "SHAPE" && pageElement.asShape().getShapeType() == "RECTANGLE") {
pageElement.asShape().replaceWithSheetsChart(chart);
break;
}
}
if (!pageElements.some(function(p) {return p.getPageElementType() == "SHAPE" && p.asShape().getShapeType() == "RECTANGLE"})) {
copy = true;
}
// When the following script is used, the template sheet is removed at the last loop.
// if (idx == a.length - 1) deck.getSlides().pop().remove();
}
});
}
- 在此修改后的脚本中,当脚本完成时,模板幻灯片位于最后一张幻灯片。如果要删除它,请在上面的脚本中使用
if (idx == a.length - 1) deck.getSlides().pop().remove();
。
注:
- 作为附加信息,在上面的脚本中,当
updateSlide.move(presLength - 2)
修改为updateSlide.move(presLength)
时,当脚本完成时,模板幻灯片是 Google 幻灯片的第 2 页。