【问题标题】:Updating Embedded Charts in Google Docs with Google Apps Script使用 Google Apps 脚本更新 Google Docs 中的嵌入式图表
【发布时间】:2018-03-29 17:40:03
【问题描述】:

TLDR;如何使用文档中的脚本编辑器更新文档中嵌入的表格图表?

我知道有一个脚本可以为 Google 幻灯片执行此操作,但我正在尝试在 Google 文档中执行此操作,但找不到任何文档。

https://developers.google.com/slides/how-tos/add-chart#refreshing_a_chart

具体来说,我有一个 Google Doc。该文档包含大约三十个表格和嵌入式图表,它们都链接到单独的 Google 表格。所有 30 个都来自一个 Google 表格。现在,每次电子表格更改时,我都可以让我们的非极客用户点击所有 30 个“更新”悬停按钮,但我希​​望电子表格会发生很大变化,我想对文档进行白痴验证以确保它始终处于运行状态-迄今为止。据我所知,这不是 Google Apps 开箱即用的功能,所以我想编写一个脚本来实现它。

但我找不到从 Google Doc 访问 EmbeddedChart 的任何方法。

如果我可以像在表格中那样运行类似的东西,我可能会弄明白,但我不能:

var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];
    var charts = sheet.getCharts();
    for (var i in charts) {
       var chart = charts[i];
       // Update the chart
    }
}

虽然 docs 具有以下函数 DocumentApp.getActiveDocument(),但对象 Document 不包含函数 getCharts()。我相信它们被认为是图像,但图像没有更新功能。

是否甚至可以使用脚本访问/更新文档中的 EmbeddedChart?也许通过编辑电子表格运行脚本并从那里更新文档?似乎很奇怪,您可以在所有内容的幻灯片中做到这一点,但在文档中却不行。

【问题讨论】:

  • 您能找到解决方案吗?
  • 我没有。我们最终使用了 MS Office。我们确实在寻找一种跨平台的解决方案,但从未找到。

标签: charts google-apps-script google-sheets google-docs


【解决方案1】:

在 Google Docs DOM 图表中作为 InlineImages 这里是记录图像属性的脚本。但它们看起来是只读的,并且此方法的文档以死胡同结束:“如果元素包含此属性的多个值,则为 null。” https://developers.google.com/apps-script/reference/document/inline-image#getLinkUrl()

function myFunction() {
  var doc = DocumentApp.getActiveDocument()
  var body = doc.getBody()
  var pars = body.getParagraphs()
  var atts = img.getAttributes();
  // Log the paragraph attributes.
  for (var att in atts) {
    Logger.log(att + ":" + atts[att]);
  }
  
  for (var par in pars) {
    Logger.log(pars[par].getText());
    var chN = pars[par].getNumChildren()
    Logger.log(chN);
    if(chN>0){
      var type = pars[par].getChild(0).getType()
      Logger.log(type);
      if(type=="INLINE_IMAGE"){
            
        var atts = pars[par].getChild(0).getAttributes()
        Logger.log(JSON.stringify(atts));
          for (var att in atts) {
            Logger.log(att + ":" + atts[att]);
          }
      }
    
    }
  }
  return
}

【讨论】:

    【解决方案2】:

    目标是更新每个图表的范围,以包含该范围引用的工作表的列数和行数。

    方法是枚举所有工作表中所有图表中的所有范围,清除范围并以正确的大小重新添加。 getDataRange() 函数是获取合适大小范围的便捷方法。唯一棘手的部分是您不直接更新图表 - 您需要获取它的构建器,修改它,重新构建它,然后使用构建的对象更新图表。

    for (const sheet of SpreadsheetApp.getActive().getSheets()) {
      for (const chart of sheet.getCharts()) {
        const embeddedChartBuilder = chart.modify();
        const ranges = chart.getRanges();
        embeddedChartBuilder.clearRanges();
        for (const range of ranges) {
          const dataRange = range.getSheet().getDataRange();
          embeddedChartBuilder.addRange(dataRange);
        }
        const embeddedChart = embeddedChartBuilder.build();
        sheet.updateChart(embeddedChart);
      }
    }
    

    代码示例假定您的范围旨在包含所引用工作表的所有列和行。

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多