
前提
イベントの申し込みフォームをGoogleフォームを使用して作成したいと考えています。
そこで、Googleフォームのチェックボックスの集計をGASで行いたいのですが、方法が分かりません。
ネットで見つけたサイト様のコードが大変参考になったので、そのコードを参考に試行錯誤しており、そのコード内ではラジオボタンの集計が実装されています。
その集計部分をラジオボタンのコードからチェックボックス向けに変更すれば良いとは思うのですが、実際にはチェックボックスが複数選択された場合などもあり、どこを修正してよいかわかりません。
ちなみに、プログラミングについての知識は乏しく、業務の一環として今回このようなプログラミングを行うことになり期限も迫っているため困っています。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- ▲▲機能を動作するようにする
イベントの日程(2日間)について参加申し込みを募り、それぞれの日で50名に達したところで申し込みフォームの当該日の選択をできないようにしたいです。
その際、申し込みフォーム上に、残り人数を表示させたいです。
なお、両日参加の方を想定して、両方の日を選択できるようにしたいです。
該当のソースコード
1const form = FormApp.getActiveForm(); 2const spreadSheet = SpreadsheetApp.openById("*************************"); 3const reserveSheet = spreadSheet.getSheetByName("予約"); 4const listSheet = spreadSheet.getSheetByName("日程"); 5 6// *--------------------* 7// フォーム送信時の処理 8// *--------------------* 9function receivedApplication(e) { 10 11 // フォームの送信内容 12 const email = e.response.getRespondentEmail(); 13 const items = e.response.getItemResponses(); 14 const preferredDate = ( items[0].getItem().getTitle() === "参加希望日" ? items[0].getResponse() : "" ); 15 let result = ""; 16 17 if ( preferredDate ){ 18 // 日程シートチェック&更新 19 result = checkAvailability(preferredDate); 20 // 予約シートに申込内容を書き込み 21 if ( result = "OK" ){ reserveSheet.appendRow([email, preferredDate]); } 22 // フォームを更新 23 editForm(); 24 } else { 25 result = "NG"; 26 } 27 28 // メール送信 29 sendEmail(email, preferredDate, result); 30 31} 32 33// *---------------------* 34// 予約状況をチェックする 35// *---------------------* 36function checkAvailability(preferredDate){ 37 38 // 日程シートを配列に格納 39 const list = listSheet.getDataRange().getValues(); 40 list.shift(); 41 42 // リストから予約日を探し、定員を確認する 43 for ( let i = 0; i < list.length; i++ ){ 44 if ( list[i][0] == preferredDate ){ 45 // 予約済 < 定員であればOK 46 if ( list[i][2] < list[i][1] ){ 47 listSheet.getRange(i + 2, 3).setValue( list[i][2] + 1); 48 return "OK"; 49 } else { 50 return "NG"; 51 } 52 } 53 } 54 55 // 希望日がリストに存在しなかった場合はNG 56 return "NG"; 57 58} 59 60// *----------------------* 61// 予約結果をメール送信する 62// *----------------------* 63function sendEmail(email, preferredDate, result){ 64 65 const mailTitle = "予約結果について"; 66 let mailBody; 67 68 if ( result == "OK" ){ 69 mailBody = "予約が完了しました。\n" 70 + `予約日:${preferredDate}` 71 } else { 72 mailBody = "定員超過のため予約できませんでした。\n" 73 + "下記のフォームから再度申請してください\n" 74 + form.getPublishedUrl(); 75 } 76 77 // 結果メール送信 78 GmailApp.sendEmail(email, mailTitle, mailBody); 79 80} 81 82// *-----------------* 83// フォームを更新する 84// *-----------------* 85function editForm(){ 86 87 let infoText = ""; // 「空き状況」部分のテキスト 88 let choiceValues = []; // 「参加希望日」部分の選択肢 89 90 // 日程シートを配列に格納 91 const list = listSheet.getDataRange().getValues(); 92 list.shift(); 93 94 // 日程シートのデータからフォームの内容を作成する 95 for ( const record of list ){ 96 if ( record[2] < record[1] ){ 97 // 空きがある日程は「空き状況」に記載+選択肢として設定 98 infoText += `${record[0]} : 残り ${record[1] - record[2]} 名\n`; 99 choiceValues.push(record[0]); 100 } else { 101 // 空きがない日程は「空き状況」に満員を記載+選択肢にはしない 102 infoText += `${record[0]} : 満員(申込不可)\n`; 103 } 104 } 105 106 // 選択肢が1つもない場合、選択肢は「全日程申込不可」としフォームをクローズ 107 if ( !choiceValues.length ) { 108 choiceValues.push("全日程申込不可"); 109 form.setAcceptingResponses(false); 110 } 111 112 // フォームに変更を反映 113 const items = form.getItems(); 114 items[0].setHelpText(infoText); 115 items[1].asMultipleChoiceItem().setChoiceValues(choiceValues); 116 117} 118
試したこと
115行目の asMultipleChoiceItem は asCheckboxItem にすべきだとは思うのですが、それ以外どこを修正すべきかわからずにいます。
どうぞよろしくお願いいたします。


回答1件
あなたの回答
tips
プレビュー