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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

1716閲覧

gojiGASでGoogle formの各ラジオボタンの投票回数を制限したい

persimmon

総合スコア4

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/03/08 19:42

編集2020/03/08 19:43

前提・実現したいこと

Google formで特定の回数投票されたら、選択肢が自動で消去されるようにしたいです。

該当のソースコード

Google Apps Script

1 2function endFormCheck(){ 3 var spreadsheet = SpreadsheetApp.openById('id'); 4 var form = FormApp.openById('id'); 5 var dataValues = spreadsheet.getSheetByName('項目データ').getDataRange().getValues(); 6 var workdateValues = generateArray(dataValues, 2); 7 var LIMIT_COUNT =3; //ここで上限を設定 8 var ANSWER_LENGTH = 30; //時間帯の数 9 var answerCount = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];//カウント用:時間帯の数分配列を準備します 10 var itemID = 0; 11 var formResponses = form.getResponses(); // 全回答内容を取得 12 13for (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 for (var k = 0; k < ANSWER_LENGTH ; k++){ 23 if(answer == workdateValues [k]){answerCount[k]++;} 24 } 25 } 26 } 27 28 // LIMIT_COUNTになっている選択肢があるかチェック 29 var answerCheck = 0; 30 var choiceArray = []; 31 var arrayCount = 0; 32 for(var i = 0; i < ANSWER_LENGTH; i++){ 33 if(answerCount[i] == LIMIT_COUNT){ 34 answerCheck++; 35 } 36    else{ // LIMIT_COUNTになっていない選択肢は残す 37 choiceArray[arrayCount] = workdateValues [i]; arrayCount++; } 38 39 } 40 41 42 43 // LIMIT_COUNTになっていない選択肢を「勤務予定時間帯」の選択肢に設定する 44 if( (answerCheck != ANSWER_LENGTH) && (answerCheck >= 1)){ 45 var items = form.getItems(); 46 for (var i= 0; i< items.length; i++ ){ 47 var item = items[i]; 48 if( item.getTitle() == '勤務予定時間帯' ){ 49 var choice = item.asMultipleChoiceItem().getChoices(); 50 item.asMultipleChoiceItem().setChoiceValues(choiceArray); 51 } 52 } 53 } 54} 55function generateArray(values, column){ 56 var i = 1; 57 var array = []; 58 for(var i = 1; i < values.length; i++){ 59 if(values[i][column]){ 60 array.push(values[i][column]); 61 } 62 } 63 return array; 64} 65} 66 67workdateValues = generateArray(dataValues, 2)の1次元配列 68選択肢 699日午前(10時~13時) 709日昼(13時~15時) 719日昼過ぎ(15時~17時) 729日夕方(17時~19時) 739日夜(19時~22時) 7410日午前(10時~13時) 7510日昼(13時~15時) 7610日昼過ぎ(15時~17時) 7710日夕方(17時~19時) 7810日夜(19時~22時) 79 80 81```選択肢を自動追加するコード 82function createEventForm(){ 83var spreadsheet = SpreadsheetApp.openById('ID'); 84 var form = FormApp.openById('id'); 85  var dataValues = spreadsheet.getSheetByName('項目データ').getDataRange().getValues(); 86 var workdateValues = generateArray(dataValues, 2); 87 88var listItem =form.getItems();//既存の全LISTを取得 89 90 for (var i = 0; i< listItem.length; i++){ 91 if (listItem[i].getTitle()=='勤務予定時間帯'){//タイトルが一致するLISTを選択 92 var qui = listItem[i].asMultipleChoiceItem()//変数quiにobjectを格納 93 break; 94 } 95 } 96 97 if (i == listItem.length){//forloopが完走してしまった場合 98 Logger.log("指定したタイトルのMultipleChoiceItemが存在しない") 99 return 100 } 101 102 var choices = [] 103 104 for (var j = 0; j < workdateValues .length; j++){ 105 choices.push(qui.createChoice( workdateValues [j])); 106 } 107 qui.setChoices(choices) 108 109 110 111 112 113function generateArray(values, column){ 114 var i = 1; 115 var array = []; 116 for(var i = 1; i < values.length; i++){ 117 if(values[i][column]){ 118 array.push(values[i][column]); 119 } 120 } 121 return array; 122}
### 試したこと 試しに投票して動作確認しましたが、選択肢は消えません でした。 ### 補足情報(FW/ツールのバージョンなど) https://yukaobu.wordpress.com/2016/10/23/googleform-2/ を参考にしました

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

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

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

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

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

guest

回答1

0

q245962 を Form の送信時トリガーとして設定します。

javascript

1const q245962 = (e) => { 2 const workhour = "勤務時間帯"; 3 const limit = 1; 4 const form = e.source; 5 const responses = form.getResponses().map(r=>r.getItemResponses().reduce((a,c)=> a !== "" ? a : (c.getItem().getTitle() === workhour ? c.getResponse() : "" ),"")).filter(s => s !== "").reduce((a,c) => a[c] ? {...a, [c]:a[c] + 1} : {...a, [c]:1},{}) 6 const choices = generateChoices().filter(e=> !responses[e] || responses[e] < limit); 7 if(choices.length < 1) { 8 form.setAcceptingResponses(false); 9 return; 10 } 11 form.getItems().forEach(i=> { 12 if(i.getTitle() !== workhour) return; 13 i.asMultipleChoiceItem().setChoiceValues(choices); 14 }); 15} 16const generateChoices = () => { 17 const bookId = ""; 18 const sheetName = "項目データ"; 19 const colC = 2; 20 return SpreadsheetApp.openById(bookId).getSheetByName(sheetName).getDataRange().getValues().map(e=>e[colC]); 21}

動きをみていましたが、直後に開くと実行が終わっていないので、定員の回答が得られてしまいますし、多分同時に一斉に回答があったときにも対応できないので、業務で実用するには不安があります。

投稿2020/03/09 14:21

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問