Assistatut: añadida la funcionalidad para que las familias consulten datos

zfTal y como anunciaba en el último artículo, ya he terminado el desarrollo de un complemento para que las familias puedan consultar los datos de asistencia y las incidencias de sus alumnos. Si en un centro todos los profesores utilizan el Cuaderno Virtual del profesor y tiene también implementado el Assistatut, con las siguientes instrucciones se podrá crear una web para que las familias puedan consultar los datos de su alumnos, de una forma sencilla.
Sigue leyendo «Assistatut: añadida la funcionalidad para que las familias consulten datos»

¿Por qué utilizo un cuaderno de seguimiento de alumnos realizado en Google Drive?

qvYa hace unos años que he ido desarrollando mi propio Cuaderno virtual del profesor, para hacer el seguimiento de los alumnos. Actualmente lo tengo hecho con Google Drive y son varias las personas que me han preguntado porque no utilizo aplicaciones que se pueden encontrar para tabletas (tipo Idoceo). En este artículo expongo los 4 motivos que tengo.

Sigue leyendo «¿Por qué utilizo un cuaderno de seguimiento de alumnos realizado en Google Drive?»

Assistatut: control de asistencia de alumnos con Google Drive

faltes (1)Hace un mes presentaba la nueva versión del Cuaderno virtual del profesor, una plantilla para hacer el seguimiento de los alumnos (asistencia, notas, competencias …). Hoy presento una nueva plantilla, Assistatut, en versión BETA, que junto con la otra permite al tutor hacer el seguimiento de las ausencias y retrasos de los alumnos de su grupo.

Sigue leyendo «Assistatut: control de asistencia de alumnos con Google Drive»

Creando un Google apps script

Primero hay que tener en cuenta que los Google apps script se basan en Javascript. No hay que ser un experto programador, pero si que hay que dominar un poco la sintaxis del lenguaje. Por lo tanto, si no se conoce la sintaxis del Javascript, yo recomiendo se acceda al siguiente enlace y se realicen las actividades que se proponen. Son 16 módulos que se pueden hacer en unas 10 horas, pero tampoco hay que hacerlos todos. Con los 5 o 6 primeros ya es suficiente. http://www.codecademy.com/tracks/javascript

Una vez conocida la sintaxis del Javscript, centrémonos en un ejemplo de script. En este caso, haremos un script para conseguir que un formulario llegue por correo electrónico a la persona que lo contesta. En la web de mi centro tenemos un formulario por si alguna persona de la comunidad educativa quiere hacer llegar a la dirección alguna queja o sugerencia. Es un formulario hecho con Google que sólo tiene 4 campos: Nombre y Apellidos / Dirección de correo / Curso (sólo si es alumno o familia) / Descripción de la queja o sugerencia. Lo que debe hacer el script que quiero presentar es enviar una copia de las respuestas a la persona que conteste el formulario. Si se tiene un GAFE esto se puede hacer obligando al usuario a iniciar sesión, pero en este caso queremos que contesten el formulario personas que no están en nuestro GAFE (familias, empresas …). Primero, lógicamente, hay que crear el formulario de Google y acceder a la hoja de cálculo donde irán a parar las respuestas del formulario. Dentro de esta hoja de cálculo, accederemos a Herramientas / Editor de script

script1

Crearemos un script en blanco y escribiremos el seguiente código:

script2

/**
* Enviar las respuestas de un formulario 
* por mail 
*/ 

function onChange() { 
//Preparamos el inicio del mail 
var cap="Se ha enviado su sugerencia o queja correctamente. A continuación se adjuntan sus respuestas:"; 
var asunto= "Confirmación queja o sugerencia"; 

var cuerpomensaje=cap; 
var dest = ""; 
var camp = ""; 
var libroActual = SpreadsheetApp.getActiveSpreadsheet(); 
var hojaresp = libroActual.getSheets()[0]; 
var rangresp = hojaresp.getDataRange(); 
var ul_fila= rangresp.getNumRows(); 
var encontrado=0; 
//Miramos la última fila de la hoja de respuestas
for (j=1; j<rangresp.getNumColumns()+1;j++){ 
camp = rangresp.getCell(ul_fila,j).getValue(); 
for (i=0;i<camp.length;i++){ if (camp.charAt(i)==='@'){ 
encontrado=1; 
} 
}
if (encontrado===1){ 
dest=camp; 
encontrado=0; 
} else { 
cuerpomensaje= cuerpomensaje+rangresp.getCell(1,j).getValue()+": "+camp+""; 
}
}
//Mandamos el mail 
GmailApp.sendEmail(dest, asunto, '',{ htmlBody: cuerpomensaje}); 
};

Analicemos un poco este código y veamos enlaces interesantes para seguir profundizando. El inicio sólo sirve para definir variables (Asunto del correo que se enviará / Cabecera del correo) y otras variables de programación. Hay que mencionar a tres concretas:

var libroActual = SpreadsheetApp.getActiveSpreadsheet(); 
var hojaresp = libroActual.getSheets()[0]; 
var rangresp = hojaresp.getDataRange();

Para entender estas variables, nos irá muy bien la ayuda de Google. Se encuentra en https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app
Nos muestran todos los objetos propios de las aplicaciones de Google y sus propiedades. En las variables que he definido en el script, la variable libroActual es un libro de cálculo entero. Concretamente el libro activo. La variable hojaresp, es la primera hoja de cálculo del libro. La variable rangresp es un conjunto de celdas, todas las que tienen datos. Hubiéramos podido obtener directamente la última variable, rangresp, escribiendo

var rangresp = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getDataRange()

pero así de entrada quizás hubiera sido más difícil de entender. Todos los scripts se basan en esto, objetos y propiedades. Con la ayuda de Google, podemos encontrar cualquier cosa de las aplicaciones de Google (valores celdas, destinatarios de correos, número de filas, texto de ¡un documento …). Siguiendo con el ejemplo,

var ul_fila= rangresp.getNumRows(); 
var encontrado=0; 
//Miramos la última fila de la hoja de respuestas
for (j=1; j<rangresp.getNumColumns()+1;j++){ 
camp = rangresp.getCell(ul_fila,j).getValue(); 
for (i=0;i<camp.length;i++){ if (camp.charAt(i)==='@'){ 
encontrado=1; 
} 
}
if (encontrado===1){ 
dest=camp; 
encontrado=0; 
} else { 
cuerpomensaje= cuerpomensaje+rangresp.getCell(1,j).getValue()+": "+camp+""; 
}
}

miramos celda por celda de la última fila. Para ello definimos una variable ul_fila que es el número de filas del rango con datos. Justamente la última tiene la respuesta que queremos enviar. Podemos mirar el valor de cada celda haciendo un bucle for, así miraremos todas las celdas. Para acceder a su valor, utilizamos las propiedades getCell (para fijar la celda) y getValue (para obtener el valor). Como no sabemos en qué campo el usuario nos indicará el mail, lo que hacemos es mirar letra por letra si esa celda tiene el símbolo @. Para ello, utilizamos un segundo for, que compara cada letra con la @.

Ya sólo queda crear el cuerpo del mensaje, donde pondremos el nombre del campo (que está en la primera fila) y a continuación la respuesta.

El script termina enviando el correo

//Mandamos el mail 
GmailApp.sendEmail(dest, asunto, '',{ htmlBody: cuerpomensaje});

Para ello utilizamos otro objeto de Google. No es de hojas de cálculo, sino de correo. En otro apartado de la página de ayuda de Google podemos encontrar los objetos de Gmail: https://developers.google.com/apps-script/reference/gmail/

Una vez hecho el script y entendido su funcionamiento, sólo nos falta programar que se ejecute cada vez que alguien responda el formulario. Lo haremos con los disparadores.

script4

Configuraremos que el script que acabamos de crear se ejecute cada vez que alguien responda el formulario.

script5

Aquí es importante qué usuario está activando el disparador, ya que este será el usuario que envía el mail. Si estamos creando el script con usuario de profesor, pero queremos que el mail lo envíe a un usuario de centro, deberemos compartir la hoja con el usuario de centro en modo edición y que éste active el disparador.

Si se desea ver cómo funciona este script en la práctica, a continuación hay el enlace a un formulario. Si se contesta, se recibirá un correo mío con la confirmación.

https://docs.google.com/a/insestatut.cat/forms/d/1k_0VSP6qP0S5f66MWe0vwztw-EzJi4sXVcFRhS14zx8/viewform

Creo que los Google apps scripts son una gran herramienta, ya que nos puede servir para infinidad de operaciones (copiar datos entre hojas, combinar información de documetos y hojas de cálculo y mandarolo por email…). Si sabe algo de programación no es difícil entrar en su forma de funcionar y se puede hacer lo que se quiera. Son ideales para automatizar procesos que de otro modo se realizarán de forma manual.

Cosas a tener en cuenta si compartimos estructuras de carpetas en Google Drive

Ya aviso de entrada que lo que voy a contar no será sencillo de entender. Si no se está familiarizado con compartir estructuras de carpetas entre usuarios y se conocen los permisos que Google permite, no será sencillo que se pueda seguir la explicación. Si se está familiarizado, no prometo nada, pero intentaré ser claro.

Compartir una estructura de carpetas solo puede tener un inconveniente: que en algunas carpetas demos permiso de edición a muchos usuarios (normalmente a todo el claustro de profesores).
Si la estructura se utiliza en un solo sentido, es decir, unos pocos usuarios cuelgan información (normalmente el equipo directivo) y un grupo numeroso de usuarios sólo visualizan esta información (normalmente el profesorado), no hay ningún problema. Como los profesores sólo pueden ver las carpetas y ficheros, si el equipo directivo tiene claro el funcionamiento del Drive, todo funciona correctamente. Los profesores pueden arrastrarse la estructura de carpetas a su unidad o destacarla para encontrarla con facilidad.

El problema está cuando, en algunas carpetas, el profesorado tiene permiso de escritura, porque tendrá que subir archivos (programaciones, listas de alumnos, actas de reuniones…). En este caso hay que vigilar, ya que sin tener ninguna intención, los profesores pueden hacer que algunas carpetas desaparezcan del Drive de todos los demá profesores. Y que sólo la pueda encontrar el propietario, a través del buscador.

Vayamos por partes y explico un caso concreto de carpetas compartidas con edición que pueden desaparecer. Supongamos que el equipo directivo crea la siguiente estructura de carpetas para compartir con todos los profesores del centro. Supongamos también que tenemos cuatro grupos creados : profes , profes_eso , profes_batx y profes_ciclos.

Entre paréntesis indico el permiso que tienen los profesores (entiendo que el equipo directivo tiene permiso de edición en todas partes):

  • Organitzación general curso XX (profes visualización)
    • Evaluaciones (profes visualización)
      • ESO (profes_eso visualización)
      • BATX (profes_batx visualización)
      • Ciclos (profes_ciclos visualización)
    • Disciplina (profes visualización)
      • ESO (profes eso edición / profes visualización)
        • 1o ESO (profes eso edición / profes visualización)
        • 2o ESO (profes eso edición / profes visualización)
        • 3o ESO (profes eso edición / profes visualización)
        • 4o ESO (profes eso edición / profes visualización)
      • BATX (profes batx edición / profes visualización)
        • 1o Batx (profes batx edición / profes visualización)
        • 2o Batx (profes batx edición / profes visualización)
      • Ciclos (profes ciclos edición / profes visualización)
    • Guardias (profes visualización)
    • Horarios (profes visualización)
      • ESO (profes visualización)
      • BATX (profes visualización)
      • Ciclos (profes visualización)
    • Poyectos de centro (profes visualización)

Hay que fijarse que hay unas carpetas (Disciplina) donde los profesores pueden editar, así pueden colgar documentos explicando las incidencias que tienen en el aula o similar.

Si los profesores entras en el apartado Compartidos conmigo de su Google Drive verán las carpetas compartidas. Y, ojo, que no sólo verán la carpeta Organización general curso XX, sino que también verán las carpetas donde tienen permiso de edición.

gd4

¿Qué debe hacer el profesor?

  • Primera opción: arrastrar toda la carpeta Organización general curso XX en su unidad de Drive. No hay problema, en esta carpeta solo tiene permiso de visualización. Una vez allí, podrá desplegar las carpetas y arrastrar archivos que ya tenga en otras carpetas de su unidad dentro de la estructura de carpetas (donde tiene edición).

gd5

Inconveniente: si el profesor tiene instalada la aplicación Google Drive en su ordenador, de golpe se le empiezan a bajar un montón de documentos en su disco duro. Según sea el centro, estos documentos pueden tener un tamaño importante.

  • Segunda opción: destacar la carpeta Organización general curso XX (por encontrarla con facilidad) y arrastrar a su carpeta sólo aquellas carpetas donde deba poner documentos. Así evitamos que se le copien un montón de documentos en el disco duro.
    En el caso de un profe de ESO (pongamos de 1 º) sería la carpeta Disciplina/ESO/1r de ESO.
    Y aquí tenemos el problema.
    Como en la carpeta superior (Disciplina / ESO) tiene permiso de edición, si mueve esta carpeta, la está moviendo para todos los usuarios. O sea que está sacando la carpeta de la estructura de carpetas. Él la tendrá en su unidad, pero el resto de profesores dejarán de verla. Incluso el propietario dejará de verla (aunque utilizando el buscador podrá encontrarla y colocarla de nuevo en su sitio).
    Puesto que Google ya ve que esto es peligroso, al usuario le muestra un mensaje. Pero habitualmente los profesores dicen Mover y listos.

gd6

Hay que tener en cuenta que es difícil formar a los profesores. Si el profesor arrastra a su unidad una carpeta de la estructura que está dentro de una carpeta donde sólo tiene permiso de visualización, todo funciona bien.
El problema está en arrastrar a su unidad una carpeta de la estructura que está dentro de una carpeta donde tiene permiso de edición.

Y, normalmente, el profesor no tiene ni idea si tiene permiso de edición o de visualización.

Soluciones

  • Hay centros que optan por pedir a su profesorado que no arrastre una carpeta compartida a su unidad (a no ser que explícitamente se lo indiquen). Pero esta solución, desde el punto de vista de la seguridad, no es aceptable. Siempre puede haber algún profesor que por ignorancia arrastre la carpeta que no toca y la haga desaparecer.
  • Otra solución es no compartir carpetas con permiso de edición para los profesores. Pero así perdemos uno de los grandes ventajas de Google Drive: poder compartir información entre todos los miembros del centro en todas direcciones. Y que todo el mundo la pueda localizar fácilmente.
  • La tercera solución es que las carpetas donde los profesores tengan permiso de edición no tengan subcarpetas. Es decir, sólo pueden ser de edición las últimas carpetas de la estructura . De esta manera no hay peligro de hacer desaparecer carpetas.
    Alguien me dirá que entonces lo que se puede hacer desaparecer son los documentos que haya en estas últimas carpetas. Y tendrá razón. Pero arrastrar documentos sueltos ya es más difícil que se realice.
  • La última, y la más complicada pero más segura, es que primero se compartan con permiso de edición las carpetas donde los profesores (o subgrupos de profesores) deben tener derecho. Se comparten las carpetas, sin ponerlas dentro de la estructura.
    Aquellos con quienes hemos compartido la carpeta, la arrastran a su unidad.
    Una vez esto ya ha sido hecho, entonces el propietario ya puede arrastrar la carpeta dentro de la estructura y dar permiso de visualización al resto.
    Como los que la necesitan ya se la han arrastrado, ya no lo vuelven a hacer y por lo tanto, no sacan la carpeta de la estructura.
    Y los otros, los que solo deben visionar, la podrán encontrar dentro de la estructura.
    Evidentemente tampoco es una solución perfecta, ya que si durante el curso los permisos deben cambiar, las cosas se nos complican.

No hay ninguna solución perfecta, al menos de momento. Lo ideal sería que Google permitiera compartir una carpeta con permiso de edición, pero sin permiso de mover su contenido. Pero, de momento, eso no existe.

Espero no haber aburrido demasiado y que se haya entendido (cosa que no tengo muy clara) . Si alguien en su centro utiliza alguna otra solución, estaré encantado de conocerla a través de los comentarios.