Come generare automaticamente quiz casuali in Google Moduli utilizzando Google Fogli a Apps Script

In questo articolo mostriamo come generare automaticamente un questionario con poche righe di codice Apps Script, a partire da una serie di domande e risposte raccolte su un Foglio di Google.

L’obiettivo è quello di partire da un Foglio, strutturato come segue:

Nell’esempio è mostrato un elenco nel quale su ogni riga è riportata, sulla prima colonna denominata “QUESITO”, la domanda da porre ai nostri utenti e sulle tre colonne successive, denominate “RISPOSTA 1”, “RISPOSTA 2”, “RISPOSTA 3”, le tre risposte tra le quali l’utente deve scegliere quella giusta.
L’informazione di quale delle tre risposte sia giusta, è contenuta sulla colonna “SOLUZIONE” che indica il numero della risposta corretta.

Supponiamo di avere una batteria di 100 domande e risposte e di voler generare, in maniera automatica, un modulo che riporti, in ordine casuale, un dato numero di domande (ad esempio 10), nelle quali l’ordine delle risposte sia anch’esso casuale.

Attraverso poche righe di codice Apps Script possiamo ottenere questo obiettivo in pochi semplici passi, utilizzando le API di Fogli e Moduli.

COL_SOLUZIONE = "E"
FOLDER_ID = "<ID_FOLDER>"

function main(){
  generate_form("Domande", "Titolo del questionario", "Descrizione del questionario", 3)
}

function generate_form(sheetName, title, description, questionsNumber) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var form = sheet.getSheetByName(sheetName)

  var currRow = form.getLastRow();
  var questionsRange = form.getRange("A2:"+COL_SOLUZIONE+currRow)
  var questions = questionsRange.getValues();

  var folder = DriveApp.getFolderById(FOLDER_ID);
  generateForm(title, description, questions, folder, questionsNumber)
}


function shuffle(items) {
    for (var i = items.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = items[i];
        items[i] = items[j];
        items[j] = temp;
    }
}

function generateForm(title, description, questions, folder, questionsNumber){

  var form = FormApp.create(title);
  form.setTitle(title);
  form.setDescription(description)
  
  form.setIsQuiz(true)
  form.setCollectEmail(true)

  shuffle(questions)
  questions = questions.slice(0, questionsNumber)

  for (var i = 0; i < questions.length; i++){

    var item = form.addMultipleChoiceItem()
    item.setRequired(true)
    item.setTitle(questions[i][0]);
    item.setPoints(1)
   
    var choices = []
    var solution = questions[i][questions[i].length - 1]
    for (var j = 1; j < questions[i].length - 1; j++){
      choices.push(item.createChoice(questions[i][j], (j == solution)));
    }

    shuffle(choices)
    item.setChoices(choices);
  }

  var ss = SpreadsheetApp.create(title);
  form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());
  folder.addFile(DriveApp.getFileById(form.getId()));
  folder.addFile(DriveApp.getFileById(ss.getId()));
}

Lo script imposta inizialmente tue variabili globali

COL_SOLUZIONE = “E”
FOLDER_ID = “<FOLDER_ID>”

La prima indica la colonna che contiene la soluzione (e quindi implicitamente, il numero di risposte per ciascuna domanda, dato che la prima colonna è proprio la domanda).

Il secondo parametro è l’id della cartella dove vogliamo che venga generato il nostro modulo.

L’entry point del nostro script è la funzione “main” che richiama la funzione “generate_form”

generate_form(“Domande”, “Titolo del questionario”, “Descrizione del questionario”, 3)

La funzione si aspetta come parametri il foglio che contiene le domande (“Domande”), un titolo ed una descrizione per il nostro questionario e infine il numero di domande che devono essere selezionate (ovviamente il numero deve essere minore del rotale delle domande disponibili.

La funzione “generate_form” crea un modulo attraverso la riga di codice

var form = FormApp.create(title);

ne imposta titolo, descrizione, la tipologia (quiz) e stabilisce che il modulo deve raccogliere le mail degli utenti.

Quindi viene richiamata la funzione “shuffle” che mescola in ordine casuale le domande e “slice” che ne prende solo il numero prestabilito.

Successivamente cicliamo le domande e creiamo per ciascuna di essa una domanda a risposta multipla

var item = form.addMultipleChoiceItem()

dove aggiungiamo le risposte, impostando la corretta sulla base del valore indicato sulla colonna “SOLUZIONE”

choices.push(item.createChoice(questions[i][j], (j == solution)));

Richiamiamo la funzione “shuffle” anche sulle risposte, per mescolarle in ordine casuale.

Infine creiamo un nuovo Foglio di Google che conterrà le risposte al nostro modulo, associandolo ad esso.

form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());

Modulo e Foglio delle risposte sono poi copiati all’interno della cartella che abbiamo specificato tra i parametri del nostro script.

Eseguendo la funzione main dello script il gioco è fatto!