【问题标题】:How to add multiple charts into 1 google slides from google sheets如何从谷歌表格将多个图表添加到 1 个谷歌幻灯片中
【发布时间】:2020-11-06 05:55:26
【问题描述】:

我正在尝试使用应用程序脚本从指定的谷歌表格将多个图表添加到谷歌幻灯片中。 所以我的一张幻灯片会有 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);
     }});
    }
  1. 每当我运行代码时,我都无法在 1 张幻灯片中插入 2 个或更多独特的图表。
  2. 当代码运行时,它会创建不必要的重复项,在这种特殊情况下,幻灯片只需复制一次。
  3. 复制后,代码无法识别要插入到 Google 幻灯片中的正确图表。

请帮忙解决这个问题,或者请指出正确的方向!任何帮助深表感谢:) 以下是相关文件链接: 谷歌幻灯片:https://docs.google.com/presentation/d/1CyUkJ7S4eq00MRol3RzcdyAG1m6ovUFBK0H9fxfu-28/edit?usp=sharing 谷歌表格:https://docs.google.com/spreadsheets/d/1tPc0KU2uYuN4rO32tW-s6lql_IW57kbDUdSR8ZSkVXY/edit?usp=sharing

免责声明:我是一个新手,我所掌握的有关应用程序脚本的任何知识都是完全自学的,以使我的日常工作更轻松。当然,我对代码及其应用程序真的很感兴趣

【问题讨论】:

  • 更新 我意识到我更新了错误的幻灯片,现在在谷歌幻灯片的代码中已修复。只需要帮助将超过 1 个图表添加到 1 张幻灯片中 :)
  • 虽然我不确定我是否能正确理解你的问题,但我提出了一个修改后的脚本作为答案。你能确认一下吗?如果我误解了您的问题,我深表歉意。
  • 是的,您完全理解!我真的不明白这是如何工作的,如果我请你解释一下,你会非常介意吗?还有 1 个问题,如果我在幻灯片上有一些占位符文本,我想根据复制到幻灯片的图表来更新,这也可能吗?
  • 感谢您的回复。我很高兴你的问题得到了解决。关于新问题,我想支持你。我认为您的新问题也许可以实现。但在这种情况下,需要修改我的答案和您的示例幻灯片中的脚本。这样,您的初始问题就会被评论更改。当您的初始问题被评论更改时,看到您的问题的其他用户会感到困惑。那么,您可以将其发布为新问题吗?这样,包括我在内的用户都可以想到您的新问题并回答它。如果您能理解并配合解决您的新问题,我很高兴。
  • 我已经问过这个链接在这里的问题!再次感谢您的帮助。:)) stackoverflow.com/questions/64711900/…

标签: javascript google-apps-script google-sheets charts google-slides


【解决方案1】:

我相信你的目标如下。

  • 您想用 Google 幻灯片中的电子表格图表替换 {{placeholder for chart}}
  • 在您的模板幻灯片中,有 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页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多