Actividad en preparación
La docente debe editar las preguntas y sus tiempos en Code.gs antes de publicarla.
'); } const tpl = HtmlService.createTemplateFromFile('Index'); tpl.config = JSON.stringify({ titulo:CONFIG.titulo, actividad:CONFIG.actividad, videoId:CONFIG.videoId, preguntas:CONFIG.preguntas.map(q=>({id:q.id,fraccion:q.fraccion,texto:q.texto,opciones:q.opciones})) }); return tpl.evaluate().setTitle(CONFIG.titulo) .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); } function registrar(payload){ if (!payload || typeof payload !== 'object') throw new Error('Solicitud inválida'); const nombre=String(payload.nombre||'').trim().slice(0,120); const grupo=String(payload.grupo||'').trim().slice(0,40); const grado=String(payload.grado||'').trim().slice(0,20); if(nombre.length<5 || !grupo || !grado) throw new Error('Completa nombre, grado y grupo.'); const respuestas=payload.respuestas || {}; if(CONFIG.preguntas.some(q=>!Number.isInteger(respuestas[q.id]) || respuestas[q.id]<0 || respuestas[q.id]>=q.opciones.length)){ throw new Error('Debes contestar todas las preguntas.'); } const correctas=CONFIG.preguntas.reduce((n,q)=>n+(respuestas[q.id]===q.correcta?1:0),0); const puntos=Math.round(correctas/CONFIG.preguntas.length*100); const ss=SpreadsheetApp.getActiveSpreadsheet(); if(!ss) throw new Error('El proyecto debe crearse desde una hoja de Google Sheets.'); const lock=LockService.getScriptLock();lock.waitLock(20000); try{ let hoja=ss.getSheetByName('VideoQuiz'); if(!hoja){hoja=ss.insertSheet('VideoQuiz');hoja.appendRow(['Fecha','Actividad','Nombre','Grado','Grupo','Correctas','Total','Calificación /100','Respuestas','Folio']);hoja.setFrozenRows(1);} const fecha=new Date(); const folio=Utilities.getUuid().slice(0,8).toUpperCase(); // Los campos del estudiante se fuerzan a texto para evitar inyección de fórmulas. const seguro=s=>/^\s*[=+@\-]/.test(s)?"'"+s:s; hoja.appendRow([fecha,CONFIG.actividad,seguro(nombre),seguro(grado),seguro(grupo),correctas,CONFIG.preguntas.length,puntos,JSON.stringify(respuestas),folio]); return {ok:true,fecha:Utilities.formatDate(fecha,Session.getScriptTimeZone(),'yyyy-MM-dd HH:mm'),actividad:CONFIG.actividad,folio,nombre,grado,grupo,correctas,total:CONFIG.preguntas.length,puntos}; }finally{lock.releaseLock();} }
No hay comentarios:
Publicar un comentario