見出し画像

アンケート集計ツール

仕事でアンケート集計をすることが増えてきたため、誰でも集計まではできるようにGASを組みました。

グラフの大きさや位置の微調整はまだ人の手が必要そうで、課題ポイントです。

アンケートのデモ

ABC列の5段階評価をシート2に集計、円グラフ化
DE列はシート3にまとめ、内容を分析できるよう集計

列番号を変えればカスタマイズ可能!!!

実際のコード

function updateSurveyResults() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // シートの取得または作成
  let sheet1 = ss.getSheetByName('シート1');
  if (!sheet1) {
    throw new Error('シート1が見つかりません。スクリプトを実行する前に「シート1」を作成してください。');
  }

  let sheet2 = ss.getSheetByName('シート2');
  if (!sheet2) {
    sheet2 = ss.insertSheet('シート2');
  } else {
    sheet2.clear(); // シートをクリア
    // 既存のグラフを削除
    const charts = sheet2.getCharts();
    charts.forEach(chart => sheet2.removeChart(chart));
  }

  let sheet3 = ss.getSheetByName('シート3');
  if (!sheet3) {
    sheet3 = ss.insertSheet('シート3');
  } else {
    sheet3.clear(); // シートをクリア
  }

  // シート1のデータを取得
  const data = sheet1.getDataRange().getValues();
  const headers = data.shift(); // ヘッダー行を取り除く

  // 各列の回答数をカウントするためのオブジェクト
  const counts = {
    A: [0, 0, 0, 0, 0], // A列の1~5の回答数
    B: [0, 0, 0, 0, 0], // B列の1~5の回答数
    C: [0, 0, 0, 0, 0]  // C列の1~5の回答数
  };

  let totalResponses = [0, 0, 0]; // A, B, C列の回答者数
  let totalScores = [0, 0, 0];   // A, B, C列の合計スコア

  // コメント用配列
  const goodPoints = [];
  const badPoints = [];

  // データをループして集計
  data.forEach(row => {
    // A列 (項目1)
    if (row[0] >= 1 && row[0] <= 5) {
      counts.A[row[0] - 1]++;
      totalScores[0] += row[0];
      totalResponses[0]++;
    }
    // B列 (項目2)
    if (row[1] >= 1 && row[1] <= 5) {
      counts.B[row[1] - 1]++;
      totalScores[1] += row[1];
      totalResponses[1]++;
    }
    // C列 (項目3)
    if (row[2] >= 1 && row[2] <= 5) {
      counts.C[row[2] - 1]++;
      totalScores[2] += row[2];
      totalResponses[2]++;
    }

    // コメントの収集
    if (row[3]) goodPoints.push(row[3]); // D列:良かった点
    if (row[4]) badPoints.push(row[4]); // E列:改善点
  });

  // 平均値を計算
  const averages = totalScores.map((score, index) => score / totalResponses[index]);

  // シート2に集計結果を書き込む
  sheet2.appendRow(['', '今回のセミナーの満足度', 'セミナーの速度の適切さ', 'セミナーのわかりやすさ']); // ヘッダー
  for (let i = 0; i < 5; i++) {
    sheet2.appendRow([i + 1, counts.A[i], counts.B[i], counts.C[i]]);
  }
  sheet2.appendRow(['平均値', averages[0], averages[1], averages[2]]);
  sheet2.appendRow(['合計回答者数', totalResponses[0], totalResponses[1], totalResponses[2]]);

  // 円グラフを作成(サイズ調整あり)
  ['A', 'B', 'C'].forEach((key, index) => {
    const chart = sheet2.newChart()
      .setChartType(Charts.ChartType.PIE)
      .addRange(sheet2.getRange(2, index + 2, 5, 1)) // 1~5の回答数範囲を指定
      .setPosition(12, index * 6 + 1, 0, 0) // 横並びに配置
      .setOption('title', sheet2.getRange(1, index + 2).getValue() + 'の回答分布')
      .setOption('width', 200) // 幅を200ピクセルに設定(小さくする)
      .setOption('height', 200) // 高さを200ピクセルに設定(小さくする)
      .build();
    sheet2.insertChart(chart);
  });

  // シート3にコメントをまとめる
  sheet3.appendRow(['良かった点', '悪かった点・改善点']); // ヘッダー
  const maxLength = Math.max(goodPoints.length, badPoints.length);
  for (let i = 0; i < maxLength; i++) {
    sheet3.appendRow([goodPoints[i] || '', badPoints[i] || '']);
  }
}

// メニューを追加
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('カスタムメニュー')
    .addItem('アンケート集計', 'updateSurveyResults')
    .addToUi();
}

気づき

今回はデモでChatGPTに100人分のアンケート結果を出してもらいました。
これを作ったことで、集計が苦手でしたが一瞬で可能になりました!!!

いいなと思ったら応援しよう!