Честно говоря, не столько из-за недостатка инструментов тестирования, сколько из любопытства подхватила я идею Бориса Ярмахова создать гибкий инструмент тестирования на основе Google-таблиц и Google Apps Script. Если говорить об удобных инструментах для тестирования, то в этот список можно внести NetTest Константина Полякова и инструментарий Moodle, например. Но создать свое собственное детище, во-первых, интересно, а во-вторых, это — возможность преодолеть те ограничения и недостатки, которые есть в готовых продуктах. А у имеющихся разработок можно позаимствовать удачные идеи и решения.
Дни с момента появления публикации Бориса Ярмахова были для меня днями "восстановления навыков вождения". JavaScript подзабыт, навыки профессионального программирования притупились. Так что не судите строго.
Какие изменения и дополнения внесены в версию Бориса Ярмахова?
Пока все. Для информатики (я учитель информатики), в принципе, этого достаточно. Именно в таком виде представлены части A и B в ЕГЭ. Для других предметов — надо думать и развивать идеи дальше.
Инструкция для создания теста:
1. Скопируйте таблицу Тест ЕГЭ Гибрид (Баба ЕГЭ), перейдя по ссылке. Скрипт для создания теста находится в таблице.
Слово "Гибрид" в название теста попало потому, что в одном разделе теста — вопросы по истории, в другом — по информатике, третий — вообще фиктивный. Извините, в режиме отладки жалко времени на не самую нужную работу. Вопросы по истории скопированы из таблицы.
2. Изучите структуру таблицы. Она проста: вопросы записываются в первый столбец (A), правильные ответы — в 6-й столбец (F). В столбец H во время работы скрипта будет записываться информация, этот столбец занимать не стоит. Для вопросов с выбором ответа в столбцы 2-5 (B-E) записываются ответы. Если в строке находится вопрос с вводом короткого ответа, то второй столбец (B) для этой строки обязательно должен остаться пустым. В таблице может быть несколько разделов. Не все разделы обязательно использовать в тесте, но разделы, из которых выбираются вопросы, должны идти подряд, начиная с первого. Это ограничение легко преодолеть, перемещая листы таблицы на момент формирования теста.
3. Замените вопросы на свои собственные.
4. Все дальнейшие шаги — в видеоинструкции.
5. После того, как скрипт отработает, ссылки на формы с тестом и ответами будут находиться на первом листе в ячейках H5 и H6 соответственно.
Удачи!
А сам скрипт такой:
Дни с момента появления публикации Бориса Ярмахова были для меня днями "восстановления навыков вождения". JavaScript подзабыт, навыки профессионального программирования притупились. Так что не судите строго.
Какие изменения и дополнения внесены в версию Бориса Ярмахова?
- Вопросы можно сгруппировать в разделы. В тест попадут вопросы из каждого заданного раздела.
- Можно использовать вопросы с выбором ответа и с вводом короткого ответа
- Кроме формы с вопросами создается форма с правильными ответами для учителя. Эта форма затем поможет создать эталон для оценки теста с помощью Flubaroo
- Мелкие несущественные изменения, связанные с интерфейсом
Пока все. Для информатики (я учитель информатики), в принципе, этого достаточно. Именно в таком виде представлены части A и B в ЕГЭ. Для других предметов — надо думать и развивать идеи дальше.
Инструкция для создания теста:
1. Скопируйте таблицу Тест ЕГЭ Гибрид (Баба ЕГЭ), перейдя по ссылке. Скрипт для создания теста находится в таблице.
Слово "Гибрид" в название теста попало потому, что в одном разделе теста — вопросы по истории, в другом — по информатике, третий — вообще фиктивный. Извините, в режиме отладки жалко времени на не самую нужную работу. Вопросы по истории скопированы из таблицы.
2. Изучите структуру таблицы. Она проста: вопросы записываются в первый столбец (A), правильные ответы — в 6-й столбец (F). В столбец H во время работы скрипта будет записываться информация, этот столбец занимать не стоит. Для вопросов с выбором ответа в столбцы 2-5 (B-E) записываются ответы. Если в строке находится вопрос с вводом короткого ответа, то второй столбец (B) для этой строки обязательно должен остаться пустым. В таблице может быть несколько разделов. Не все разделы обязательно использовать в тесте, но разделы, из которых выбираются вопросы, должны идти подряд, начиная с первого. Это ограничение легко преодолеть, перемещая листы таблицы на момент формирования теста.
3. Замените вопросы на свои собственные.
4. Все дальнейшие шаги — в видеоинструкции.
5. После того, как скрипт отработает, ссылки на формы с тестом и ответами будут находиться на первом листе в ячейках H5 и H6 соответственно.
Удачи!
А сам скрипт такой:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
////////////////////////////////////////////////// | |
// Тест с вопросами двух типов: | |
// выбор правильного ответа и ввод короткого ответа | |
// Основан на коде Б. Ярмахова "Баба ЕГЭ" | |
// Вопросы записываются в первый столбец таблицы | |
// Возможно формирование теста вопросами из нескольких разделов | |
// Ссылка на сгенерированную форму теста - в ячейке H5 первой таблицы | |
// Ссылка на форму с правильными ответами - в ячейке H6 первой таблицы | |
////////////////////////////////////////////////////////// | |
function onOpen() { | |
// Добавляем один пункт в меню теста | |
var ui = SpreadsheetApp.getUi(); | |
ui.createMenu('Баба ЕГЭ_A_B') | |
.addItem('Задать параметры теста', 'setNumQuestions') | |
.addToUi(); | |
} | |
function setNumQuestions() { | |
// Формируем и запоминаем введенные пользователем данные | |
var app = UiApp.createApplication(); | |
var panel = app.createVerticalPanel(); | |
app.setTitle("Создаем структуру теста"); | |
var textBox1 = app.createTextBox(); | |
textBox1.setName('myTextBox1').setId('myTextBox1'); | |
var textBox2 = app.createTextBox(); | |
textBox2.setName('myTextBox2').setId('myTextBox2'); | |
var textBox3 = app.createTextBox(); | |
textBox3.setName('myTextBox3').setId('myTextBox3'); | |
var button = app.createButton('Отправить'); | |
panel.add(app.createLabel("Количество разделов").setId("label1")); | |
panel.add(textBox1); | |
panel.add(app.createLabel("Количество вопросов в разделе").setId("label2")); | |
panel.add(textBox2); | |
panel.add(app.createLabel("Название теста").setId("label3")); | |
panel.add(textBox3); | |
panel.add(button); | |
var clickHandler1 = app.createServerClickHandler("respondToSubmit"); | |
button.addClickHandler(clickHandler1); | |
clickHandler1.addCallbackElement(panel); | |
app.add(panel); | |
var doc = SpreadsheetApp.getActive(); | |
doc.show(app); | |
} | |
function respondToSubmit(e) { | |
// Заносим в таблицу введенные данные - в H2, H3, H4 | |
var app = UiApp.getActiveApplication(); | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var NumberOfSheets = e.parameter.myTextBox1; | |
var NumberOfQuestions = e.parameter.myTextBox2; | |
var NameTest = e.parameter.myTextBox3; | |
var numq = parseInt(NumberOfQuestions); | |
var numsh = parseInt(NumberOfSheets); | |
var s = ss.getSheets()[0]; | |
s.getRange("H4").setValue(NameTest); | |
//Logger.log(numq); | |
//Logger.log(numsh); | |
for (k = 0; k < numsh; k++) | |
{ | |
s = ss.getSheets()[k]; | |
s.getRange("H2").setValue(numsh); | |
s.getRange("H3").setValue(numq); | |
} | |
// Вызываем функцию формирования теста | |
makeRandomTest(e); | |
return app.close(); | |
} | |
//////////////////////////////////// | |
function makeRandomTest(e) { // Основная функция - формирование теста | |
var day = new Date(); | |
day.setDate(day.getDate()) | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
// Берем данные о количестве разделов и вопросов из первой таблицы | |
var s = ss.getSheets()[0]; | |
var num = s.getRange("H3").getValue(); | |
var numsh = s.getRange("H2").getValue(); | |
var NameTest = s.getRange("H4").getValue(); | |
// Создаем две формы: с вопросами и контрольную - с ответами | |
var form = FormApp.create(NameTest).setDescription(day); | |
form.addTextItem().setTitle("Ваше имя?"); | |
var FormAnswers = FormApp.create(NameTest + '. Ответы').setDescription(day); | |
//////////// | |
for (k = 0; k < numsh; k++) // Цикл по количеству разделов | |
{ | |
s = ss.getSheets()[k]; | |
var rows = s.getLastRow(); | |
var rowsNumbers = []; | |
for (j = 2; j <= rows; j++) { | |
rowsNumbers.push(j); //Формируем массив номеров строк с вопросами по порядку | |
} | |
Shuffle(rowsNumbers); // Перемешиваем номера строк (вопросы) | |
for (i = 0; i < num; i++) { // Выбираем первые num вопросов | |
var question = s.getRange(rowsNumbers[i],1).getValue(); // Вопрос | |
var answer = s.getRange(rowsNumbers[i],6).getValue(); // Правильный ответ | |
if ( s.getRange(rowsNumbers[i],2).getValue() == '') // Проверяем тип вопроса (A или B) | |
{ | |
var item = form.addTextItem(); | |
item.setTitle(question); | |
var itemAnswer = FormAnswers.addTextItem(); | |
itemAnswer.setTitle(question).setHelpText(answer); | |
} | |
else { | |
var choice1 = s.getRange(rowsNumbers[i],2).getValue(); | |
var choice2 = s.getRange(rowsNumbers[i],3).getValue(); | |
var choice3 = s.getRange(rowsNumbers[i],4).getValue(); | |
var choice4 = s.getRange(rowsNumbers[i],5).getValue(); | |
var item = form.addMultipleChoiceItem(); | |
item.setTitle(question).setChoiceValues([choice1,choice2,choice3,choice4]); | |
var itemAnswer = FormAnswers.addMultipleChoiceItem(); | |
itemAnswer.setTitle(question).setChoiceValues([choice1,choice2,choice3,choice4]).setHelpText(answer); | |
} | |
} | |
} | |
var idForm = form.getId(); | |
var idFormAnswers = FormAnswers.getId(); | |
s = ss.getSheets()[0]; | |
s.getRange('H5').setValue('https://docs.google.com/forms/d/' + idForm); | |
s.getRange('H6').setValue('https://docs.google.com/forms/d/' + idFormAnswers); | |
} | |
function Shuffle(o) { | |
for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); | |
return o; | |
}; |