Этот блог - рабочий дневник учителя информатики. Здесь собираются и анализируются материалы к урокам, профессиональные статьи, видеоролики и проч. - все, что мне интересно с профессиональной точки зрения. Но профессия, основательно заполняя жизненное пространство, тем не менее оставляет место и другим радостям жизни :) Что также находит отражение на этих страницах.
Заранее благодарю всех, перелистывающих страницы блога,за оставленные комментарии, советы и пожелания.
"Только для себя мы пишем одну-единственную вещь: список покупок, чтобы не забыть, что нужно купить, а возвратившись из магазина, порвать и выбросить его за ненадобностью. Любой другой текст мы пишем, чтобы что-то кому-то сказать"./Умберто эко/

среда, 23 апреля 2014 г.

Тесты на основе Google SpreadSheets и Google Apps Script

Перепост с Учимся вместе с Google и другими
Заметка на память: Борис Ярмахов о программировании GAS
Честно говоря, не столько из-за недостатка инструментов тестирования, сколько из любопытства подхватила я идею Бориса Ярмахова создать гибкий инструмент тестирования на основе Google-таблиц и Google Apps Script. Если говорить об удобных инструментах для тестирования, то в этот список можно внести NetTest  Константина Полякова и инструментарий Moodle, например. Но создать свое собственное детище,  во-первых, интересно, а во-вторых, это  возможность преодолеть те ограничения и недостатки, которые есть в готовых продуктах. А у имеющихся разработок можно позаимствовать удачные идеи и решения.
Дни с момента появления публикации Бориса Ярмахова были для меня днями "восстановления навыков вождения". JavaScript подзабыт, навыки профессионального программирования притупились. Так что не судите строго.

Какие изменения и дополнения внесены в версию Бориса Ярмахова?
  1. Вопросы можно сгруппировать в разделы. В тест попадут вопросы из каждого заданного раздела.
  2. Можно использовать вопросы с выбором ответа и с вводом короткого ответа
  3. Кроме формы с вопросами создается форма с правильными ответами для учителя. Эта форма затем поможет создать эталон для оценки теста с помощью Flubaroo
  4. Мелкие несущественные изменения, связанные с интерфейсом

Пока все. Для информатики (я учитель информатики), в принципе, этого достаточно. Именно в таком виде представлены части A и B в ЕГЭ. Для других предметов  надо думать и развивать идеи дальше.

Инструкция для создания теста:

1. Скопируйте таблицу Тест ЕГЭ Гибрид (Баба ЕГЭ), перейдя по ссылке. Скрипт для создания теста находится в таблице.
Слово "Гибрид" в название теста попало потому, что в одном разделе теста  вопросы по истории, в другом  по информатике, третий  вообще фиктивный. Извините, в режиме отладки жалко времени на не самую нужную работу. Вопросы по истории скопированы из таблицы.
2. Изучите структуру таблицы. Она проста: вопросы записываются в первый столбец (A), правильные ответы  в 6-й столбец (F). В столбец H во время работы скрипта будет записываться информация, этот столбец занимать не стоит. Для вопросов с выбором ответа в столбцы 2-5 (B-E) записываются ответы. Если в строке находится вопрос с вводом короткого ответа, то второй столбец (B) для этой строки обязательно должен остаться пустым. В таблице может быть несколько разделов. Не все разделы обязательно использовать в тесте, но разделы, из которых выбираются вопросы, должны идти подряд, начиная с первого. Это ограничение легко преодолеть, перемещая листы таблицы на момент формирования теста.
3. Замените вопросы на свои собственные.
4. Все дальнейшие шаги  в видеоинструкции.
5. После того, как скрипт отработает, ссылки на формы с тестом и ответами будут находиться на первом листе в ячейках H5 и H6 соответственно.


Удачи!

А сам скрипт такой:

//////////////////////////////////////////////////
// Тест с вопросами двух типов:
// выбор правильного ответа и ввод короткого ответа
// Основан на коде Б. Ярмахова "Баба ЕГЭ"
// Вопросы записываются в первый столбец таблицы
// Возможно формирование теста вопросами из нескольких разделов
// Ссылка на сгенерированную форму теста - в ячейке 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;
};
view raw BabaEge hosted with ❤ by GitHub

Комментариев нет:

Отправить комментарий