質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

1回答

6142閲覧

Googleフォームで,定員のある選択肢が2問以上あるアンケートを作成したいです。

ookk

総合スコア0

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2020/10/24 01:23

https://qiita.com/GMA/items/e672c18b09d84c753973 このリンクの方法を2個ならべました。選択肢の作成・更新は,2問ともできましたが,定員のある選択肢とはなっていませんでした。1問目のみ,定員のある選択肢となりました。
スプレッドシートには,シートを分けて,「フォームの回答」「候補A」「候補B」を作りました。

////
// 【基本設定】
// ここを編集するだけで使用できます
////

//「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください
var spreadSheetID = 'xxx'; //実際は入力しています。

// 候補日と定員を書くシート名
var sheetName = '候補A';

// 回答のシート名
var answerSheetName = 'フォームの回答';

// 定員のある項目の名前
var questionName = 'Aの利用希望(各日定員50名です。)';

////
// 【フォームを更新する関数】
////
function updateForm(){
////
// 【スプレッドシートの情報を取得】
// 候補と定員を取得し、定員に満たない候補のみを取得します
////

// スプレッドシートをIDで取得
var sheets = SpreadsheetApp.openById(spreadSheetID);

// 候補と回答のシートを取得
var sheet = sheets.getSheetByName(sheetName);
var answerSheet = sheets.getSheetByName(answerSheetName);

// 候補のシートのA行の2行目から下の値を配列で取得する
var sheetLastRow = sheet.getLastRow();
if (sheetLastRow > 1) {
// 候補と定員を取得
var candidate = sheet.getRange(2, 1, sheetLastRow - 1, 2).getValues();
} else {
return;
}

// 回答のシートの2行目から下の値を配列で取得する
var answerSheetLastRow = answerSheet.getLastRow();
if (answerSheetLastRow > 1) {
var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues();
var colCount = questionNames[0].indexOf(questionName);
// 必要な部分だけ取得
var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues();
}

////
// 【Googleフォームの選択肢の上書き】
////

// フォームの取得
var form = FormApp.getActiveForm();

// 質問項目をすべて取得
var items = form.getItems();

// 選択肢の作成、更新
items.forEach(function(item){
// 質問項目がquestionNameの項目を探す
if(item.getTitle() === questionName){
var listItemQuestion = item.asListItem();
// 選択肢を入れる配列
var choices = [];

// 候補日を一つ一つ見ていく
// nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員
candidate.forEach(function(nameAndCapacity){
if(nameAndCapacity[0] != ""){
// 定員無制限かどうか。また、回答が一件もない場合もこっち
if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){
choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
} else {
// 定員がある場合は定員以上になっていないか確認
var counter = 0;
// 何人分キャパが埋まっているかカウント
for(var i = 0; i < answerData.length; i++){
if (nameAndCapacity[0] == answerData[i]){
counter++;
}
}
// まだキャパがあれば選択肢に追加
if (counter < nameAndCapacity[1]){
choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
}
}
}
});

if (choices.length > 0) {
// フォームの回答を受け付ける
form.setAcceptingResponses(true);
// 選択肢を上書き
listItemQuestion.setChoices(choices);
} else {
// 満員につき、回答受付終了
form.setAcceptingResponses(false);
}
return;
}
});
}////
// 【基本設定(2問目の質問)】
//
////

//「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください
var spreadSheetID = 'xxx';

// 候補日と定員を書くシート名
var sheetName2 = '候補B';

// 回答のシート名
var answerSheetName = 'フォームの回答';

// 定員のある項目の名前
var questionName2 = 'Bの利用希望(各日定員30名です。)';

////
// 【フォームを更新する関数】
////
function updateForm(){
////
// 【スプレッドシートの情報を取得】
// 候補と定員を取得し、定員に満たない候補のみを取得します
////

// スプレッドシートをIDで取得
var sheets = SpreadsheetApp.openById(spreadSheetID);

// 候補と回答のシートを取得
var sheet2 = sheets.getSheetByName(sheetName2); //「Sheet2」とした
var answerSheet = sheets.getSheetByName(answerSheetName);

// 候補のシートのA行の2行目から下の値を配列で取得する
var sheetLastRow = sheet2.getLastRow();    //「Sheet2」とした
if (sheetLastRow > 1) {
// 候補と定員を取得
var candidate = sheet2.getRange(2, 1, sheetLastRow - 1, 2).getValues();   //「Sheet2」とした
} else {
return;
}

// 回答のシートの2行目から下の値を配列で取得する
var answerSheetLastRow = answerSheet.getLastRow();
if (answerSheetLastRow > 1) {
var questionNames2 = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues();
var colCount2 = questionNames2[0].indexOf(questionName2);
// 必要な部分だけ取得
var answerData = answerSheet.getRange(2, colCount2 + 1, answerSheetLastRow - 1).getValues();
}

////
// 【Googleフォームの選択肢の上書き】
////

// フォームの取得
var form = FormApp.getActiveForm();

// 質問項目をすべて取得
var items = form.getItems();

// 選択肢の作成、更新
items.forEach(function(item){
// 質問項目がquestionNameの項目を探す
if(item.getTitle() === questionName2){   //「questionName2」とした
var listItemQuestion = item.asListItem();
// 選択肢を入れる配列
var choices = [];

// 候補日を一つ一つ見ていく
// nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員
candidate.forEach(function(nameAndCapacity){
if(nameAndCapacity[0] != ""){
// 定員無制限かどうか。また、回答が一件もない場合もこっち
if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){
choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
} else {
// 定員がある場合は定員以上になっていないか確認
var counter = 0;
// 何人分キャパが埋まっているかカウント
for(var i = 0; i < answerData.length; i++){
if (nameAndCapacity[0] == answerData[i]){
counter++;
}
}
// まだキャパがあれば選択肢に追加
if (counter < nameAndCapacity[1]){
choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
}
}
}
});

if (choices.length > 0) {
// フォームの回答を受け付ける
form.setAcceptingResponses(true);
// 選択肢を上書き
listItemQuestion.setChoices(choices);
} else {
// 満員につき、回答受付終了
form.setAcceptingResponses(false);
}
return;
}
});
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

function updateForm()が2つ書かれていて、グローバル定義が2重になっているので、片方しか動きません。

GAS

1}//// 2// 【基本設定(2問目の質問)】 3// 4//// 5 6//「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください 7var spreadSheetID = 'xxx'; 8 9// 候補日と定員を書くシート名 10var sheetName2 = '候補B'; 11 12// 回答のシート名 13var answerSheetName = 'フォームの回答'; 14 15// 定員のある項目の名前 16var questionName2 = 'Bの利用希望(各日定員30名です。)'; 17 18//// 19// 【フォームを更新する関数】 20//// 21function updateForm(){

から

GAS

1// 候補日と定員を書くシート名 2var sheetName2 = '候補B'; 3// 定員のある項目の名前 4var questionName2 = 'Bの利用希望(各日定員30名です。)';

のみ残して他を削除してください。

投稿2021/01/19 11:08

hiroshi0240

総合スコア640

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問