Googleフォーム、スプレッドシート(Excel)、GASなどに詳しい方のお力を借りたいです。展覧会での人気投票の投票フォームをGoogleフォームで作っています。作品に番号を1,2,3,4,5,...と振っておき、「あなたが1番気に入った作品を選んでください」「あなたが2番目に気に入った作品を選んでください」・・・と言った具合に質問項目を設定しています。回答は作品番号をプルダウンから選ぶようにしています。この場合、結果をスプレッドシートに出力した場合、通常は、フォームを送信した人が行となり、列の見出し行には一位、二位、三位、と質問が並ぶようになると思います。これを作品番号毎の結果表へ変換、もしくはそう言った形で結果を出力する方法はありますでしょうか?なお、集計では、単なる票数では同率◯位が多く、再投票となってしまうことが多い為に、「一位に選ぶと5点、2位に選ぶと4点」のような得点制を採用しています。また、作品数は毎度異なり、10点だったり30点だったりします。アドバイスよろしくお願いします。

googleExcel

1件の回答

回答を書く

1121632

2026-02-27 08:35

+ フォロー

できます。フォームの回答をスプレッドシートに出したあと、別シートで作品番号ごとの得点を計算するのが簡単です。

例として、次のように集計できます。

・フォームの回答シート
A列にタイムスタンプ、B列に「1番気に入った作品の番号」、C列に「2番目に気に入った作品の番号」…が入っているとします。

・集計用シートを新しく作成
A列に作品番号を縦に並べます(1、2、3…と作品数ぶん)。
B列に「その作品の合計得点」を計算する式を入れます。

例えば
1位を5点、2位を4点、3位を3点とする場合、
集計シートの B2 に次のような式を書きます(シート名は例です)。

=COUNTIF(‘フォームの回答’!B:B, A2)*5
• COUNTIF(‘フォームの回答’!C:C, A2)*4
• COUNTIF(‘フォームの回答’!D:D, A2)*3

これで「A2の作品番号が1位に選ばれた回数×5点」+「2位に選ばれた回数×4点」…が合計されます。
この式を下にコピーすれば、全作品分の得点表ができます。あとは得点の大きい順に並べ替えれば順位表になります。

作品数が10点でも30点でも、集計シートのA列にある作品番号の分だけ自動で集計されるため、作品数が毎回変わっても対応できます。

GASを使わなくても、基本的にはこのような関数だけで「作品番号ごとの結果表」と「得点制での順位」を出すことができます。


追記


将来的な自動化は、スプレッドシート側を「触らなくてよい形」に作り込んでおき、必要であればGASで得点を自動加算する仕組みを足す、という二段構えにすると運用が楽になります。

まず、関数だけでできる自動化です。
前回のように「作品番号ごとの合計得点」を別シートで出す場合、COUNTIF などの範囲を「B:B」「C:C」のように列全体にしておけば、新しい回答が追加されても自動で集計が更新されます。つまり「式は最初に一度だけ作る」「あとはフォームが送られるたびに勝手に数字が変わる」状態になります。関数が分からない人には「結果シートを見るだけ」にしてもらえばよいので、運用上かなり安全です。

さらに踏み込んで、GASで自動加算する方法です。
イメージとしては、次のような流れになります。

1 フォーム送信時トリガー(onFormSubmit)を設定する
2 スクリプトで、送信された「1番」「2番」などの作品番号を取得する
3 [5点,4点,3点…] といった配列を用意しておき、作品番号ごとに対応する点数を集計シートに加算していく
4 集計シートの1列目を作品番号、2列目を合計点にしておき、その行を探して点数を足す

コードの雰囲気は次のような形です。

onFormSubmit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(“集計”);
var points = [5, 4, 3]; // 1位 2位 3位など
var rankings = [
e.namedValues[“1番目に気に入った作品”][0],
e.namedValues[“2番目に気に入った作品”][0],
e.namedValues[“3番目に気に入った作品”][0]
];
rankings.forEach(function(workNo, i) {
if (!workNo) return;
var row = findRowByWorkNo(sheet, workNo); // 作品番号の行を探す自作関数
var current = sheet.getRange(row, 2).getValue() || 0;
sheet.getRange(row, 2).setValue(current + points[i]);
});
}

このようにしておけば、フォームが送信されるたびに合計点が自動更新されるので、担当者は「フォームを開いて回答を見る」「集計シートで順位を見る」だけで済みます。

最後に、関数やスクリプトが書いてあるシートは保護機能で編集不可にしておき、一般の人は「投票フォーム」と「結果を見るシート」にだけ触れる運用にすると、トラブルも少なくなり扱いやすいと思います。

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有