LoginSignup
18
19

More than 5 years have passed since last update.

Google App Script で集計してグラフをつくるサンプル

Last updated at Posted at 2016-03-31

例えば、たとえばですけど次のようなデータをもらったとします。

スクリーンショット 2016-03-31 15.33.48.png

すると、

だいたい次のようにしたいと思います。

スクリーンショット 2016-03-31 15.49.39.png

  • セミコロンで分割して
  • 要素をカウントして
  • グラフをつくる

上のサンプルはカラムが3つくらいですが、僕がもらったデータは膨大で、一個一個つくるのが大変そうでしたので、Google App Scriptを用いることで、【ボタンをクリックしたら自動で、シート作成&グラフ表示】できるようにしてみました。

gas_sample.gif

早すぎて、よくわからないと思いますが。

  1. [処理メニュー] > [集計]をクリック
  2. シートが3つ自動でできる
  3. 各シートごとに文字列を分割して集計してグラフを設置

という流れで進んでいます。

以下のソースをスクリプトに設置すると動きます。
※急ぎでつくったので、ソースは改善の余地が多いと思います。

analytics.gs

/*
メニューに追加
*/
function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [
    {name: "集計", functionName: "creatSheet"}
  ];
  ss.addMenu("処理メニュー", menu);
}


/*
分析対象のカラム別にシートを作成。さらにグラフ作成
*/
function creatSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lastColumn = sheet.getLastColumn();
  var lastRow = sheet.getLastRow();

  // 対象のカラムを配列で持ちたい.
  var columnNames = [
    '好きな食べ物',
    '嫌いな食べ物'
  ];

  // 対象カラムのcolumnを取得する。
  var targetColumn = 0;  
  for (i = 1; i <= lastColumn; i++) {
    var range = sheet.getRange(1, i);
    var columnName = range.getValue();    

    var exists = columnNames.indexOf(columnName);

    if (exists >= 0) {
      Logger.log(i);
      Logger.log(range.getValue());

      targetRange = sheet.getRange(1, i, lastRow, 1);
      var values = targetRange.getValues();

      // 存在しなければ挿入
      if (!ss.getSheetByName(columnName)) {
        ss.insertSheet(columnName);
        targetSheet = ss.getSheetByName(columnName);  
        for (j = 0; j < values.length; j++) {  
          var range = targetSheet.getRange(j + 1, 1);
          range.setValue(values[j]);    
        }
        createGraphBySheetName(columnName);
      }
    }
  }  
}


/*
グラフ作成
*/
function createGraphBySheetName(sheetName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var lastRow = sheet.getLastRow();
  var outputArr = {}
  var outputKeyColumn = 4;
  var outputValueColumn = outputKeyColumn + 1;

  // 集計
  for (i = 2; i <= lastRow; i++) {
    var range = sheet.getRange(i, 1);
    var text = range.getValue();
    var splitArr = text.split(";");

    // スプリットして連想配列にいれる(存在すれば+1、なければ1をセット)
    for (j = 0; j < splitArr.length; j++) {
      var outputKey = splitArr[j];
      if (outputArr[outputKey] == null) {
       outputArr[outputKey] = 1;
      } else {
        outputArr[outputKey]++;
      }
    }  
  }  

  // アウトプットの表示
  var outputKeyRange = sheet.getRange(1, outputKeyColumn);
  var outputValueRange = sheet.getRange(1, outputValueColumn);
  outputKeyRange.setValue("項目");
  outputValueRange.setValue("count");
  var outputLabelRange = sheet.getRange(1, outputKeyColumn, 1, 2);
  outputLabelRange.setBackground("yellow");

  var i = 2;
  for (key in outputArr) {
    var keyRange = sheet.getRange(i, outputKeyColumn);
    var valueRange = sheet.getRange(i, outputValueColumn);
    keyRange.setValue(key);
    valueRange.setValue(outputArr[key]);
    i++;   
  }

  // ソートする
  var height = Object.keys(outputArr).length;
  var sortRange = sheet.getRange(2, outputKeyColumn, height + 1, 2);
  sortRange.sort({column: outputValueColumn, ascending: false});

  // グラフを埋め込む
  var chartRange = sheet.getRange(1, outputKeyColumn, height + 1, 2);
  var chartBuilder = sheet.newChart();
  chartBuilder.addRange(chartRange)
  .setChartType(Charts.ChartType.PIE)
  .setOption('title', 'My Chart!')
  .setPosition(1, outputValueColumn + 1, 20, 20); 
  sheet.insertChart(chartBuilder.build());
}

以上です。ありがとうございました。

18
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
19