Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno

힘센캥거루
2024년 12월 23일
31
python

Cada escuela es diferente, pero si hay una gran demanda por parte de los estudiantes, hay una alta probabilidad de que se implemente el estudio nocturno.

Por eso, en nuestra escuela todavía tenemos estudio nocturno.

El nombre del estudio nocturno es 독서삼도.

Hasta ahora hemos realizado el control de asistencia de forma manual.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-1

Antes de entrar a la sala de estudio, los estudiantes debían escribir su número de estudiante y nombre en una lista con el esquema de los asientos, que luego el profesor encargado del estudio debía recorrer para verificar los nombres de los estudiantes.

Por eso, antes del estudio nocturno, los estudiantes hacían fila frente a la lista para anotar sus nombres.

Al final del semestre, también se requería una estadística de los estudiantes que participaron en el estudio nocturno.

Todo esto era manual.

Así que decidimos intentar la digitalización y la implementamos exitosamente durante un semestre.

Se adjunta un formulario de Google pre-completado y una hoja de cálculo.

1. Idea

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-2

Se identificaron los aspectos más importantes para el control de asistencia en el estudio nocturno.

  • Debe ser posible realizar el control de forma fácil y sencilla.
  • Debe permitir correcciones después de la entrega.
  • Es necesaria la verificación del profesor encargado.

Se pensó que para cumplir con estos tres puntos, una solución sería crear un código QR con la cadena de consulta del formulario de Google y distribuirlo.

Cada asiento tendría un código QR con la cadena de consulta incluida y los estudiantes escanearían el código QR y enviarían el formulario.

Los datos recopilados de esta manera se agregarían fila por fila a cierta hora con la fecha usando Apps Script de la hoja de cálculo.

De esta manera, el profesor encargado del estudio nocturno también podría agregar o modificar contenido en la lista de asistencia desde su móvil.

Además, se podría reunir información sobre la participación de los estudiantes al final del semestre.

Veamos ahora cómo realizar esta configuración.

2. Creación del formulario y hoja de cálculo para el estudio nocturno

En el formulario de Google, el contenido comprende sólo el número de asiento, número de estudiante y nombre.

El contenido a ingresar debe ser lo más conciso posible.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-3

Y en la esquina superior derecha, hay una opción para obtener enlaces pre-completados.

Entramos en ese enlace.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-4

En nuestra escuela, los asientos no están asignados, así que dejaremos en blanco el número de estudiante y el nombre, y sólo completaremos el número de asiento.

Al hacer clic en copiar enlace, obtendremos una dirección como la siguiente.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-5

https://docs.google.com/forms/d/e/1FAIpQLScXgTn9UK5HETv3fCipGiRMl-et9IezB1OSZp2r9-Nj8b54Fg/viewform?usp=pp_url&entry.1738725719=23&entry.7330080=20366&entry.1354978010=%EC%BA%A5%EA%B1%B0%EB%A3%A8

Aquí, lo que sigue a viewform? es la cadena de consulta.

La cadena de consulta transmite pares de claves y valores después del signo de interrogación.

Creé una dirección para un asiento número 23, un número de estudiante 20366 y un nombre de 캥거루.

https://docs.google.com/forms/d/e/1FAIpQLScXgTn9UK5HETv3fCipGiRMl-et9IezB1OSZp2r9-Nj8b54Fg/viewform?usp=pp_url
&entry.1738725719=23 // Número de asiento
&entry.7330080=20366 // Número de estudiante
&entry.1354978010=%EC%BA%A5%EA%B1%B0%EB%A3%A8 // Nombre

Por lo tanto, la dirección que necesitamos generar es la siguiente.

Al acceder a la siguiente dirección

https://docs.google.com/forms/d/e/1FAIpQLScXgTn9UK5HETv3fCipGiRMl-et9IezB1OSZp2r9-Nj8b54Fg/viewform?usp=pp_url&entry.1738725719=23

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-6

Pasemos a crear y escribir una hoja de cálculo para ese formulario.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-7

3. Configuración de la hoja de cálculo

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-8

Al entrar en la hoja, hay un apartado para respuestas del formulario.

Aquí se acumulan las respuestas del formulario en orden cronológico.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-9

El libro de asistencia intermedia se encarga de depurar las respuestas del formulario.

Este es el más importante.

Primero, usamos la función query para traer datos donde la marca de tiempo coincide con la fecha actual.

=QUERY('Respuestas del formulario1'!$A:$D,"SELECT B,C,D WHERE A<DATE'"&YEAR('Sala de estudio autodirigido'!C1)&"-"&MONTH('Sala de estudio autodirigido'!C1)&"-"&DAY('Sala de estudio autodirigido'!C1)+1&"' AND A>=DATE'"&YEAR('Sala de estudio autodirigido'!C1)&"-"&MONTH('Sala de estudio autodirigido'!C1)&"-"&DAY('Sala de estudio autodirigido'!C1)&"' ORDER BY A",1)

Al traer así los datos, podemos pensar en algunos problemas posibles.

  • Si los estudiantes cambian de asiento, puede haber nombres duplicados en diferentes asientos.
  • Dos estudiantes pueden estar registrados para un mismo asiento.

Se resolvió esto usando las funciones unique y xlookup.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-10

Primero, en las columnas "Número de estudiante" y "Nombre" usamos =UNIQUE(F:G) para traer los valores únicos.

En la pestaña "Silla ocupada", usamos =XLOOKUP(J2,F:F,E:E,,,-1) para traer el último valor ingresado del número de estudiante.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-11

Finalmente, determinamos qué estudiante ocupa cada número de asiento.

=XLOOKUP($A2,$I:$I,J:J,"",,-1) para traer el último valor ingresado de los asientos.

Con esto, la depuración de datos está completa.

A partir de aquí podemos crear varias hojas que correspondan a los números de asiento con su correspondiente número de estudiante y nombre.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-12

La hoja de la sala de estudio autodirigido es para que la vean los profesores.

Usamos la función today() de la hoja de cálculo para mostrar la fecha de hoy.

Se creó una tabla de asientos basada en esa información y se trajo el número de estudiante y nombre desde el libro de asistencia intermedia para ese asiento.

Usamos estilos condicionales para que los asientos ocupados se coloreen de verde.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-13

Finalmente, se creó una hoja para chequeos y estadísticas de asistencia.

Está destinada a mantener estadísticas de los estudiantes que participan en el estudio nocturno.

Si un estudiante participa en al menos 2/3 del estudio nocturno, se puede registrar en su expediente.

Aquí se requiere la configuración de Apps Script.

4. Configuración de Apps Script

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-14

En el menú superior, en extensiones, encontramos la pestaña de Apps Script.

Podemos introducir comandos para la hoja como si fuera javascript.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-15

Para programar en Excel, se debe aprender Visual Basic, pero en hojas de cálculo de Google, solo se necesita javascript para implementar las funciones deseadas. Eso fue realmente conveniente.

Introducimos el siguiente código en donde se escriben los comandos.

Nombré a la función addRowDaily, pero podría ser cualquier cosa.

La explicación detallada está en los comentarios.

function addRowDaily() {
  // Crea un objeto para llamar a la hoja
  let checkSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Estadísticas de asistencia");
  let data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Libro de asistencia intermedia");
 
  // Información de fecha para utilizar como índice de columnas
  let date = new Date()
  let month = date.getMonth() + 1;
  let day = date.getDate();
  let time = date.getHours();

  // Insertar columna en el medio y obtener la última fila
  let lastColumn = 3
  let rowRange = checkSheet.getLastRow()

  // Insertar la columna en el medio, el nombre de la columna es mes, día, hora y es formato de checkbox
  checkSheet.insertColumnAfter(lastColumn-1);
  checkSheet.getRange(1, lastColumn).setValue(`${month}${day}${time}시`);
  checkSheet.getRange(2, lastColumn, rowRange-1, 1).insertCheckboxes();

  // Guarda las filas donde están los nombres de los estudiantes en un mapa. El número de estudiante es la clave, el número de fila es el valor.
  let studentMap = new Map();
  checkSheet.getRange("A1:B6").getValues().forEach((row, idx) => {
    studentMap.set(row[0], idx+1)
  });

  // Recorre las filas que tienen firma y trae el número de estudiante. Busca el número de estudiante en el mapa y marca [true] en esa fila.
  let checkedStudents = data.getRange("A2:C64").getValues();
  checkedStudents.forEach((rows) => {
    let seatNumbers = rows[0];
    let studentIdNumber = rows[1];
    let studentName = rows[2];
    if (studentIdNumber ===""){
      return
    };
    checkSheet.getRange(studentMap.get(studentIdNumber), lastColumn).setValue([true]);
  })
}

// Monitorea los cambios de celda. Si la celda A11 de la hoja de estadísticas de asistencia cambia, ejecuta la función
function onEdit(e){
  let rg = e.range;
  if (rg.getA1Notation() === "A11" && rg.isChecked() && rg.getSheet().getName() === "Estadísticas de asistencia"){
    addRowDaily();
    rg.uncheck();
  };
}

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-16

Al final se designó un disparador para ejecutar la función.

Si te preguntas por qué se usa una checkbox como botón, consulta stackoverflow.

Ahora, hacemos clic en probar y aparece un mensaje extraño.

Pulsa en "Revisar permisos".

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-17

Aparece una advertencia sobre una app no verificada, pero como es mi código, no se necesita revisión adicional.

Ve a configuración avanzada y haz clic en el enlace al final.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-18

Luego, al regresar a la hoja de cálculo, se ve que se ha agregado una fila.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-19

Designamos el disparador en la celda A11, así que creamos una casilla de verificación en esa celda.

Prueba a clicar en la casilla de verificación.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-20

La función se ejecuta y la casilla se desmarca tras completar la acción.

Ahora que tenemos la estructura básica, pasemos a crear el código QR.

5. Creación del código QR

Usamos la librería qrcode de python para crear códigos QR.

Si no está instalada, usa pip para instalar qrcode.

pip install qrcode

El uso de qrcode es muy simple e intuitivo.

Con hacer y guardar es suficiente para obtener un código QR.

import qrcode

checkqr = qrcode.make('https://naver.com')
checkqr.save('./qr.png')

Después de conocer esta librería, sólo uso python para crear códigos QR.

De todos modos, lo que necesitamos es generar códigos QR para los números de asiento, así que utilizamos un bucle para crearlos.

Usamos la dirección introducida anteriormente.

import qrcode

for i in range(1,44):
    url = f"https://docs.google.com/forms/d/e/1FAIpQLScXgTn9UK5HETv3fCipGiRMl-et9IezB1OSZp2r9-Nj8b54Fg/viewform?usp=pp_url&entry.1738725719={i}"
    qr = qrcode.make(url)
    qr.save(f"./qr/{i}번.png")

Así, se generarán códigos QR hasta el número de asiento deseado.

Para usarlos, necesitamos un formato estándar que incluya instrucciones sobre el uso del código QR y cómo realizar el control de asistencia, etc.

Lo resolví utilizando pywin32.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-21

Igual que antes, se crean controles de arrastrar previamente en las posiciones para el número de asiento y la imagen.

Ejecuta el siguiente código.

import win32com.client as win32
import os
import time

hwpdir = os.getcwd()
hwpfiles = hwpdir + "/2.hwpx"

maxnum = 43 // Hasta el número de asiento deseado

hwp = win32.gencache.EnsureDispatch('HWPFrame.HwpObject')
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
hwp.Open(hwpfiles)
field_list = [i for i in hwp.GetFieldList().split('\x02')]
time.sleep(0.5)
hwp.MovePos(3)
hwp.Run('SelectAll')
hwp.Run('Copy')
hwp.MovePos(3)

for i in range(0,maxnum):
    hwp.MovePos(3)
    hwp.Run('Paste')
    hwp.MovePos(3)
    
for page in range(0,maxnum):
    hwp.PutFieldText(f'자리번호{{{{{page}}}}}', page+1)
    hwp.MoveToField(f'qr코드{{{{{page}}}}}')
    hwp.InsertPicture(f'{hwpdir}/2qr/{page+1}번.png', True, 1, False, False, 0, 60, 60)
   al
hwp.SaveAs(hwpfiles+".hwpx")
hwp.Quit()

Así, se completa el documento para los números deseados que se pegarán en los asientos.

Al imprimir en papel A4, el tamaño es demasiado grande, así que utiliza la división de páginas para imprimir.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-22

6. Reseñas de uso

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-23

El método se diseñó en abril y se usó satisfactoriamente hasta julio.

Con los resultados de 739 participantes, junto con los estudiantes del club, investigamos la tendencia de participación y las preferencias de asientos en el estudio nocturno.

No utilizamos el sistema en el segundo semestre, debido a los cambios en la lista ya que el estudio nocturno se unificó para estudiantes de primero a tercero.

Tampoco fue fácil involucrarme en la operación unificada sobre la que no era responsable.

Automatización de tareas escolares - Automatización del control de asistencia en el estudio nocturno-24

El próximo año, espero mejorar el formato e intentar recomendarlo al encargado.

Si funcionó bien este año, es probable que se utilice nuevamente el próximo año.

Espero que muchas partes de la escuela se automaticen.

댓글을 불러오는 중...