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

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

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

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

Google Apps Script

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

Q&A

3回答

6045閲覧

Googleフォームで複数選択可能なチェックボックスに制限数を付けたい

pontaq

総合スコア31

Google フォーム

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/01/24 11:09

Googleフォームを使って、チェックボックスごとに申込できる数の制限をかけたいと思っております。

やりたいことは
・複数回答可能(チェックボックス)
・各回答ごとに制限を設ける
・制限数は各項目で変わる

予約の時間帯によって、受入人数が変わるが、通し参加も可能という状態です。

gs

1function myFunction() { 2 //var LIMIT_COUNT = 10; //ここで席数上限を設定 3 var ANSWER_LENGTH = 5; //時間帯の数 4 var answerCount = [0,0,0,0,0];//カウント用:時間帯の数分配列を準備します 5 // テスト用 6 var limitCnt = [2, 1, 1, 1, 2]; 7 var itemID = 0; 8 9 var form = FormApp.getActiveForm(); //アクティブフォームを取得 10 11 var formResponses = form.getResponses(); // 全回答内容を取得 12 13 for (var i = 0; i < formResponses.length; i++) { 14 var formResponse = formResponses[i]; // 回答ひとつ分を取得 15 var itemResponses = formResponse.getItemResponses(); // 質問項目を取得 16 17 for (var j = 0; j < itemResponses.length; j++) { // 回答内容をひとつずつチェック 18 var itemResponse = itemResponses[j]; 19 var question = itemResponse.getItem().getTitle(); 20 var answer = itemResponse.getResponse(); 21 if(question == '参加する時間'){ // 申込み数カウント 22 if(answer == '11時〜'){ answerCount[0]++; } 23 else if( answer == '13時〜'){ answerCount[1]++; } 24 else if( answer == '15時〜'){ answerCount[2]++; } 25 else if( answer == '17時〜'){ answerCount[3]++; } 26 else if( answer == '19時〜'){ answerCount[4]++; } 27 } 28 } 29 } 30 31 // LIMIT_COUNTになっている選択肢があるかチェック 32 var answerCheck = 0; 33 var choiceArray = []; 34 var arrayCount = 0; 35 for(var i = 0; i < ANSWER_LENGTH; i++){ 36 if(answerCount[i] == limitCnt[i]){ 37 answerCheck++; 38 } 39 else{ // LIMIT_COUNTになっていない選択肢は残す 40 if ( i == 0 ){ choiceArray[arrayCount] = '11時〜'; arrayCount++; } 41 else if( i== 1 ){choiceArray[arrayCount] = '13時〜'; arrayCount++;} 42 else if( i== 2 ){choiceArray[arrayCount] = '15時〜'; arrayCount++;} 43 else if( i== 3 ){choiceArray[arrayCount] = '17時〜'; arrayCount++;} 44 else if( i== 4 ){choiceArray[arrayCount] = '19時〜'; arrayCount++;} 45 } 46 } 47 48 // 全てLIMIT_COUNTなら申込みフォームを受付終了 49 if(answerCheck == ANSWER_LENGTH){ 50 form.setAcceptingResponses(false); 51 } 52 53 // LIMIT_COUNTになっていない選択肢を「参加する時間」の選択肢に設定する 54 if( (answerCheck != ANSWER_LENGTH) && (answerCheck >= 1)){ 55 var items = form.getItems(); 56 for (var i= 0; i< items.length; i++ ){ 57 var item = items[i]; 58 if( item.getTitle() == '時間帯' ){ 59 var choice = item.asMultipleChoiceItem().getChoices(); 60 item.asCheckboxItem().setChoiceValues(choiceArray); 61 } 62 } 63 } 64} 65

https://yukaobu.wordpress.com/2016/10/23/googleform-2/
参考にしたのは上記サイトです。もともと使われていなかったものはそのままにしてます。

トリガーはフォーム送信時に設定してます。
今の状況は、リミット1のものにチェックをいれた状態で送信しても、次にフォーム遷移した時に変わっていない状態です。
実行ログにエラーは出てません。
助言よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

参考にされたリンク先のサイトにも記載がありますが、

今回は、「参加する時間」の選択肢はラジオボタンで作成しました。チェックボックスやプロダウンで作成する場合、スクリプトの内容が少し変更になります。

となってるのに、記述の諸々がラジオボタンのままだからです。
ざっと見た限り、回答の照合部分と、選択肢の設定部分がチェックボックスの記述になって無いっぽいです。

answer をログ出力してみると配列になってるはずで、チェックが1個だけなら今の記述で一致と判断されるかもしれませんが、2つ以上チェックすると if(answer == の部分がいずれもヒットせず arrayCountが 0 のままで処理が終了し、エラーが出ないんじゃないでしょうか?

変更箇所が多いので、まずはチェックボックスの記述を検索して、自力で修正してみることをお勧めします。

投稿2021/01/27 04:23

編集2021/01/27 04:30
sawa

総合スコア3002

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

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

0

11時枠は 2席しかないので、2人がそれを選択したらそれ以降は選べないようにってことですよね。
(と質問文に書いていただけるとよかったですね。初見でこれを理解するのは難しい)

へーそんなことができるんだって感じですが、formResponses の内容もわからないのでなかなか回答が難しいですね。

各ループでの変数値などを文字列化して、フォームの適当な箇所にデバッグ情報として表示できませんか?

投稿2021/01/27 02:46

68user

総合スコア2005

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

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

ken11

2021/01/29 16:43

なるほどそういう質問だったのですね。
guest

0

回答の収集ではなく、formの質問の設定に関わることなので、
質問の設定時に下記のようなスクリプトを書く必要があります。

gas

1var checkBoxItem = form.addCheckboxItem(); 2checkBoxItem.setTitle('What two condiments would you like on your hot dog?'); 3checkBoxItem.setChoices([ 4 checkBoxItem.createChoice('Ketchup'), 5 checkBoxItem.createChoice('Mustard'), 6 checkBoxItem.createChoice('Relish') 7]); 8var checkBoxValidation = FormApp.createCheckboxValidation() 9 .setHelpText(“Select two condiments.”) 10 .requireSelectExactly(2) 11 .build(); 12checkBoxItem.setValidation(checkBoxValidation);

(参考)
https://developers.google.com/apps-script/reference/forms/checkbox-validation-builder

※質問を手動で設定したなら、オプションに最小数最大数の設定はあります。
https://www.ec-create.jp/google-forms/%E4%BD%BF%E3%81%84%E6%96%B9/how-to-restrict-the-number-using-the-google-form-checkbox/

投稿2021/01/26 12:19

ken11

総合スコア13

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

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

pontaq

2021/01/26 14:09

回答ありがとうございます。やりたいことはチェックする数を制限することではなく、 チェックできる回数に制限をつけることなので、少し違うようです。 コードの例だと、5人Googleフォームから申し込むとして、最初の2人が11時を選択したら、次の一人の時に11時のチェックボックスは非表示にするということがしたいのです。また、最初の2人は11時だけではなく、他の時間も選択できます。なのでラジオボタンではなくチェックボックスで処理したいのです。
ken11

2021/01/27 02:06

未だに チェックする数を制限することと、チェックできる回数を制限することの違いがわかりません。。 フォームの画像などで示していただい方がいいのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問