【问题标题】:Copying charts in a Google Sheets using Google Apps Script使用 Google Apps 脚本在 Google 表格中复制图表
【发布时间】:2013-09-02 21:54:31
【问题描述】:

我在 Google 表格中构建了一个图表。现在我需要复制图表。

图表有UI复制界面。我试图在 Google Apps 脚本中复制它,但没有成功:

function copyChart() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var chart = sheet.getCharts()[0];
  var chartCopy = sheet.newChart();
  chartCopy = chart;
  sheet.insertChart(chartCopy);
}

如何制作一个复制当前电子表格中第一个图表的工作脚本?

【问题讨论】:

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


    【解决方案1】:

    在电子表格服务的当前状态下,无法完全复制现有的 EmbeddedChart。不过,可以复制图表的一部分,然后设置其余选项。

    如果/当 API 变得更完整时,可以扩展此实用程序功能。 (或者如果谷歌完美克隆它可能会被淘汰!)

    /**
     * Returns a new EmbeddedChart instance with some properties 
     * replicated from the original.
     *
     * @param   {EmbeddedChart} original    source chart to be cloned
     * @returns {EmbeddedChart}             new, cloned chart
     */ 
    function cloneChart( original ) {
      original = original.modify();  // Necessary for read-access to some properties(!)
      var clone = SpreadsheetApp.getActiveSheet().newChart();
    
      // Set chart type
      clone.setChartType(original.getChartType());
    
      // Set position - caller should provide unique position
      var originalContainer = original.getContainer();
      var originalPostion = { anchorRowPos: originalContainer.getAnchorRow(),
                              anchorColPos: originalContainer.getAnchorColumn(), 
                              offsetX: originalContainer.getOffsetX(), 
                              offsetY: originalContainer.getOffsetY()
                         };
    
      clone.setPosition(originalPostion.anchorRowPos,
                        originalPostion.anchorColPos, 
                        originalPostion.offsetX, 
                        originalPostion.offsetY);
    
      // Copy ranges
      var ranges = original.getRanges();
      for (r=0; r<ranges.length; r++) {
        clone.addRange(ranges[r]);
      }
    
      return clone.build();
    }
    

    例如:

    function copyChart() {
      var ss = SpreadsheetApp.getActive();
      var sheet = SpreadsheetApp.getActiveSheet();
      var chart = sheet.getCharts()[0];
      var newChart = cloneChart(chart,customLineChart);
      sheet.insertChart(newChart);
    
      var numcharts = sheet.getCharts().length;
      debugger;
      return;
      var chartBlob = chart.getBlob();
      var builder = sheet.newChart();
      chartCopy = chart;
      sheet.insertChart(chartCopy);
    }
    
    /*
     * Customize settings for line charts
     */
    function customLineChart( chartBuilder ) {
      chartBuilder.asLineChart()
                  .setTitle('Chart Title (Copy)')
                  .setOption('legend', {position: 'right', textStyle: {fontSize: 16}})
                  .setOption('height', 350)
                  .setOption('width', 450);
      // ....  
    }
    

    这并不完整,但它是一个开始。 API的这部分内容如此不足,真是太可惜了。

    【讨论】:

    • 如您所说,问题是当前EmbeddedChart API非常有限,所以只能复制一张基本图表。我手动创建了图表并启用了诸如Switch rows / columns 之类的设置以适应水平数据范围,但无法通过API 复制这些设置。我尝试使用getOptions()setOptions() 复制所有设置,但是getOptions() 只返回以编程方式设置的内容,所以在我手动创建的图表模板的情况下......什么都没有:(
    【解决方案2】:

    我知道这是一个非常古老的线程,但我自己最近遇到了这个问题,并使用宏录制作为解决方法。

    只需记录,然后复制(或移动)图表,您就可以在编辑宏时访问其所有详细信息。

    通过复制该部分代码,您可以相对轻松地重新定位或复制图表,这在构建主表和复制它等时非常有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 2020-04-29
      • 1970-01-01
      • 2014-05-18
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多