使用Google Apps脚本更新Google文档中的嵌入式图表

时间:2017-10-17 22:25:50

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

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

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

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

具体来说,我有一个Google Doc。此文档包含大约30个表和嵌入式图表,这些表格都链接到单独的Google表格。所有三十个来自一张Google表格。现在,我可以让我们非常讨厌的人点击所有30个"更新"每次电子表格更改时都会悬停按钮,但我希​​望电子表格能够发生很大的变化,我希望对文档进行笨拙的证明,以确保它始终保持最新状态。据我所知,这不是Google Apps开箱即用的功能,所以我想编写一个脚本来实现它。

但我找不到任何方法可以从Google文档访问EmbeddedChart。

如果我能在Sheets中像你一样运行这样的东西,我可能会想出来,但我不能:

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
    }
}

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

是否可以使用脚本访问/更新Docs中的EmbeddedChart?也许通过编辑电子表格运行脚本并从那里更新文档?看起来很奇怪,你可以在所有事物的幻灯片中完成它,但不是文档。

2 个答案:

答案 0 :(得分:0)

在Google文档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
}

答案 1 :(得分:0)

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

该方法是枚举所有工作表中所有图表内的所有范围,清除范围并以正确的大小重新添加。 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);
  }
}

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