
アンケート集計ツール
仕事でアンケート集計をすることが増えてきたため、誰でも集計まではできるように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人分のアンケート結果を出してもらいました。
これを作ったことで、集計が苦手でしたが一瞬で可能になりました!!!