使用Google脚本在Google文档中复制图表

时间:2013-09-02 21:54:32

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

我在google doc(谷歌表)中构建了一个图表。现在我需要复制图表。 Google文档不提供图表的本机复制/粘贴界面。我尝试在谷歌脚本中做到这一点,没有运气:

function copyChart() {

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

 }

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

2 个答案:

答案 0 :(得分:3)

使用电子表格服务的当前状态,无法完全复制现有的EmbeddedChart。但是,可以复制图表的某些部分,然后设置其余选项。

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

/**
 * 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的这一部分是如此不足。

Screenshot

答案 1 :(得分:0)

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

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

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