前回書いた記事の更新版です。
グリッド式の選択肢が作れるようになりました。
※この記事の内容は、Google Apps Script(GAS)を扱える知識が必要です。
こちらを開いてコピーを作成すると早いです。
一応、一から作る手順は以下の通りです。
手順1 スプレッドシートを作成する
フォームのタイトルや説明、質問事項を記入したスプレッドシートを作成します。
スクリプトの都合上、質問等の選択肢は最大10個までにしています。編集すれば増やせます。
手順2 シートにApp Scriptを記述する
以下のコードをすべて貼り付けます。
(シートをコピーした場合は、既に入っています。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
function createForm() { const ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシート const ssId = ss.getId(); // スプレッドシートIDを取得 const parentFolder = DriveApp.getFileById(ssId).getParents(); // IDからスプレッドシートのファイルを取得⇒親フォルダを取得 const folderId = parentFolder.next().getId(); // 親フォルダIDを取得 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // フォームのタイトルをB1から取得 const formTitle = sheet.getRange('B1').getDisplayValue(); // フォームの説明をB2から取得 const formDescription = sheet.getRange('B2').getDisplayValue(); const firstRow = 5; const lastRow = sheet.getLastRow(); const dataRows = lastRow - (firstRow - 1); //質問の選択肢は、N列(14)までの最大10個 var questionList = sheet.getRange(firstRow, 1, dataRows, 14).getDisplayValues(); questionList = questionList.map(question => { return { title: question[0], //質問のタイトル helpText: question[1], //質問の説明 type: question[2], //回答の種類 must: question[3], //必須かどうか choices: [question[4], question[5], question[6], question[7], question[8],question[9],question[10],question[11],question[12],question[13]] } }); //フォームのタイトルを設定 const form = FormApp.create(formTitle); //フォームの説明を設定 form.setDescription(formDescription); //グリッド用データ保存場所 let gridRows = []; let gridColumns = []; let gridContent = gridColumns.length; let gridQ = 0 ; let gTitle = ''; let gHelpText = ''; let gTrue = ''; //以下、質問の種類による分岐 questionList.forEach(question => { //グリッド要素 if (question.type == '選択式(グリッド)') { console.log('選択式(グリッド)'); gridQ = 1; gTitle = question.title; gHelpText = question.helpText; gTrue = question.must; question.choices.forEach((choice) => { if (choice != '') { gridColumns.push(choice); }; gridContent = gridColumns.length; }); } else if (question.type == 'チェックボックス(グリッド)') { gridQ = 2; gTitle = question.title; gHelpText = question.helpText; gTrue = question.must; question.choices.forEach((choice) => { if (choice != '') { gridColumns.push(choice); }; gridContent = gridColumns.length; }); } else if (gridContent > 0){ //どちらかのグリッド形式だったら if (gridQ == 1 ){ var choiceItem = form.addGridItem(); } else if (gridQ == 2){ var choiceItem = form.addCheckboxGridItem(); } question.choices.forEach((choice) => { if (choice != '') { gridRows.push(choice); } }); choiceItem.setTitle(gTitle) .setHelpText(gHelpText) .setRows(gridRows) .setColumns(gridColumns); if (gTrue =='必須'){ choiceItem.setRequired(true) } //グリッド要素を初期化 gridRows = []; gridColumns = []; gridQ = 0; gridContent = gridRows.length; } else if (question.type == '記述式'){ console.log('記述式') var choiceItem = form.addTextItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == '段落'){ console.log('段落') var choiceItem = form.addParagraphTextItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == 'ラジオボタン') { console.log('ラジオボタン') var choiceItem = form.addMultipleChoiceItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { let choiceObj = choiceItem.createChoice(choice); choiceList.push(choiceObj); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setChoices(choiceList); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == 'チェックボックス') { console.log('チェックボックス') var choiceItem = form.addCheckboxItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { let choiceObj = choiceItem.createChoice(choice); choiceList.push(choiceObj); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setChoices(choiceList); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == 'プルダウン') { console.log('プルダウン') var choiceItem = form.addListItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { let choiceObj = choiceItem.createChoice(choice); choiceList.push(choiceObj); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setChoices(choiceList); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == '均等目盛') { console.log('均等目盛') var choiceItem = form.addScaleItem(); var choiceList = []; question.choices.forEach((choice) => { if (choice != '') { choiceList.push(choice); } }); choiceItem.setTitle(question.title) .setHelpText(question.helpText) .setBounds(choiceList[0],choiceList[1]) .setLabels(choiceList[2],choiceList[3]); if (question.must =='必須'){ choiceItem.setRequired(true) }; } else if (question.type == '日付'){ console.log('日付') var choiceItem = form.addDateItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == '時刻'){ console.log('時刻') var choiceItem = form.addTimeItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else if (question.type == '日時'){ console.log('日時') var choiceItem = form.addDateTimeItem(); choiceItem.setTitle(question.title) .setHelpText(question.helpText) if (question.must =='必須'){ choiceItem.setRequired(true) } } else{ Browser.msgBox('「'+ question.title +'」は作成できない問題形式です'); } }); //作成したフォームのアドレスをB3セルに入力 sheet.getRange('B3').setValue(form.getEditUrl()); Browser.msgBox('「' + formTitle + '」の作成が完了しました'); //作成したフォームをスプレッドシートのフォルダに移動 const formFile = DriveApp.getFileById(form.getId()) DriveApp.getFolderById(folderId).addFile(formFile) // 作成したフォームを開く var url = form.getPublishedUrl(); var script = "<script>window.open('" + url + "', '_blank').focus()</script>"; var html = HtmlService.createHtmlOutput(script); SpreadsheetApp.getUi().showModalDialog(html, '作成したフォームを開きます ' ); // 通常のURLをログに表示 console.log('URL= ' + url); // 短縮したURLをログに表示 console.log('短縮URL= ' + form.shortenFormUrl(url)); } |
サンプルExcelの中にも、コードは記述してあります。
手順3 ボタンにスクリプトを割り当てる
最後に、スプレッドシートのボタンにスクリプトを割り当てれば完成です。
ボタンを押すと、スプレッドシートと同じ場所にフォームが出来ています。
※押したら押した分だけ次々にできるので気を付けましょう…
あとは、集計するスプレッドシートは、フォームから作るのがいいでしょう。自動で作ると、どのファイルか分からなくなりますので…。あとは、やはり作ったら動作確認を忘れずに…
今後の予定
選択肢によって、違うページに飛ぶようにしたい。技術的には可能です。
しかし、飛ぶページを最初に作成し、選択肢を考えておくなど、最初の設計が出来ていないと作れないマクロしか作れていません…。
終わりに…
同じですが、多くの学校でこういったものはどんどん使われるようになっているのだから、本当は個人で作るよりは…、と思ってしまいますね。
Hi, its good post regarding media print, we all be familiar with
media is a great source of data.