4

Google スプレッドシートでグラフを作成しました。次に、チャートを複製する必要があります。

チャート用の UI コピー インターフェイスがあります。私はそれをGoogle Apps Scriptで複製しようとしましたが、うまくいきませんでした:

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

現在のスプレッドシートの最初のグラフを複製する作業スクリプトを作成するにはどうすればよいですか?

4

2 に答える 2

2

スプレッドシート サービスの現在の状態では、既存の 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 のこの部分が不十分であることは本当に残念です。

スクリーンショット

于 2013-09-13T21:26:59.767 に答える
0

これが非常に古いスレッドであることは知っていますが、最近この問題が発生し、回避策としてマクロ記録を使用しました。

チャートを記録してからコピー (または移動) するだけで、マクロを編集するときにすべての詳細にアクセスできます。

コードのその部分をコピーすることで、比較的簡単にチャートの位置を変更したりコピーしたりできます。これは、マスター シートを作成して複製する場合などに役立ちます。

于 2018-09-24T21:10:38.913 に答える