Hola a continuación le dejo material para que puedan implementar un BOT Whatsapp para realización de exámenes, encuestas y/o otros empleando hoja de calculo google sheet.
¿ Necesitas implementarlo tu mismo para realizar cambios ?
- Crear la hoja Google sheet como indica el video
- Escanear la hoja para obtener token QR
Video Implementación
Página Excel Plantilla
https://docs.google.com/spreadsheets/d/1ftwTqg7ztSEzbEKxW-qFLiQw_cB9kmc0tRDoGmAnGzc/edit?usp=sharing
Código AppScript
var excel_qr = SpreadsheetApp.getActiveSpreadsheet(); var sheet_qr = excel_qr.getSheetByName("Configuracion"); var api_interna = "https://script.google.com/macros/s/AKfycbyoBhxuklU5D3LTguTcYAS85klwFINHxxd-FroauC4CmFVvS0ua/exec"; function onOpen() { createMenus(); } function createMenus() { var menu = SpreadsheetApp.getUi().createMenu("Whatsapp"); menu.addItem('1) Obtener TOKEN Session BOT - QR Whatsapp', 'qrwhatsapp'); menu.addItem('1) Obtener TOKEN Session Notificaciones - QR Whatsapp', 'qrwhatsappnotificacion'); menu.addItem('2) Habilitar BOT - Whatsapp', 'enviarconversacion'); menu.addItem('3) Notificar Examenes', 'enviarexamenes'); menu.addToUi(); } function doPost(e) { var operacion = JSON.parse(e.postData.contents) var respuesta = ""; if (operacion.op == "qr") { respuesta = generar(JSON.stringify(operacion)); } if (operacion.op == "find_conversacion" ){ respuesta = find_conversacion(JSON.stringify(operacion)); }
return ContentService.createTextOutput(respuesta).setMimeType(ContentService.MimeType.JSON); } function generar(informacion) { try { var qr = JSON.parse(informacion); sheet_qr.getRange(2, 2).setValue(encodeURIComponent(qr.qr)); var result, jo = {}; if (qr.numero && qr.qr == "CONECTADO") { if(sheet_qr.getRange(2, 5).getValue()=="BOT"){ sheet_qr.getRange(3, 2).setValue(qr.session); }else{ sheet_qr.getRange(3, 4).setValue(qr.session); } } jo.status = '0'; jo.message = ' Se grabo el registro'; } catch (e) { jo.status = '-1'; jo.message = e.toString(); } var result = JSON.stringify(jo); return result; } function qrwhatsapp() { var response = "No" try { sheet_qr.getRange(2, 5).setValue("BOT"); var response = Browser.msgBox('Seguro que quiere generar QR BOT ahora ?', Browser.Buttons.YES_NO); } catch (e) { Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK); } if (response == "yes") { enviar(); Browser.msgBox('La acción ha sido realizada , escanear registros luego de 10 segundos', Browser.Buttons.OK); } } function qrwhatsappnotificacion() { var response = "No" try { sheet_qr.getRange(2, 5).setValue("NOTIFICACION"); var response = Browser.msgBox('Seguro que quiere generar QR Notificacion ahora ?', Browser.Buttons.YES_NO); } catch (e) { Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK); } if (response == "yes") { enviar(); Browser.msgBox('La acción ha sido realizada , escanear registros luego de 10 segundos', Browser.Buttons.OK); } } function enviar() { var appscript = sheet_qr.getRange(1, 2).getValue(); var payload = { "op": "iniciarqr", "app_script": appscript,"sheet_id":excel_qr.getId(), "fechahora": Utilities.formatDate(new Date(), "GMT-5", "yyMMddHHmmss") }; var options = { 'headers': { "Content-Type": "application/json" }, 'method': "POST", 'payload': JSON.stringify(payload) }; try { var response = UrlFetchApp.fetch(api_interna, options); var json = JSON.parse(response.getContentText()); } catch (e) { } } function enviarexamenes(){ var response = "No" var token_session = ""; try { token_session = sheet_qr.getRange(3, 4).getValue(); var response = Browser.msgBox('Seguro que quiere enviar examenes a los alumnos , el token de session sera : ' + token_session + ' ?', Browser.Buttons.YES_NO); } catch (e) { Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK); } if (response == "yes") { var dataMensajes = []; if (excel_qr.getSheetByName("Alumnos")) { var sheet = excel_qr.getSheetByName("Alumnos"); var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues(); for (var i = 0, l = rows.length; i < l; i++) { try{ var record = {}; record['numero'] = rows[i][1]; record['mensaje'] = (sheet_qr.getRange(4, 2).getValue()).replace("%nombre%",rows[i][2]); sheet.getRange(i+2,4).setValue("INICIADO"); dataMensajes.push(record); } catch (e) { Browser.msgBox('Error en la hoja conversacion revisar valores '+ i, Browser.Buttons.OK); return; } } } var payload = { "op": "registermessage", "token_qr": token_session, "mensajes": dataMensajes }; var options = { 'headers': { "Content-Type": "application/json" }, 'method': "POST", 'payload': JSON.stringify(payload) }; try { var response = UrlFetchApp.fetch(api_interna, options); var json = JSON.parse(response.getContentText()); if (json.status == "0") { Browser.msgBox('Se notificaron los mensajes ', Browser.Buttons.OK); } else { Browser.msgBox('Error al iniciar : ' + json.message, Browser.Buttons.OK); } } catch (e) { Browser.msgBox('Se habilito los mensajes inicie la conversacion ', Browser.Buttons.OK); } } } function enviarconversacion() { var response = "No" var token_session = ""; try { token_session = sheet_qr.getRange(3, 2).getValue(); var response = Browser.msgBox('Seguro que quiere habilitar el BOT con la conversacion , el token de session sera : ' + token_session + ' ?', Browser.Buttons.YES_NO); } catch (e) { Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK); } if (response == "yes") { var dataConversacion = []; if (excel_qr.getSheetByName("Conversacion")) { var sheet = excel_qr.getSheetByName("Conversacion"); var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues(); for (var i = 0, l = rows.length; i < l; i++) { try{ var dataRow = rows[i]; var record = {}; record['evento'] = dataRow[0]; record['entrada'] = dataRow[1]; record['salida'] = JSON.parse(dataRow[2]); record['retornar'] = dataRow[3]; dataConversacion.push(record); } catch (e) { Browser.msgBox('Error en la hoja conversacion revisar valores '+ i, Browser.Buttons.OK); return; } } } var payload = { "op": "registermessage", "token_qr": token_session, "conversacion": dataConversacion }; var options = { 'headers': { "Content-Type": "application/json" }, 'method': "POST", 'payload': JSON.stringify(payload) }; try { var response = UrlFetchApp.fetch(api_interna, options); var json = JSON.parse(response.getContentText()); if (json.status == "0") { Browser.msgBox('Se habilito el BOT inicie la conversacion ', Browser.Buttons.OK); } else { Browser.msgBox('Error al iniciar : ' + json.message, Browser.Buttons.OK); } } catch (e) { Browser.msgBox('Se habilito el BOT inicie la conversacion ', Browser.Buttons.OK); } } } function find_conversacion(informacion){ try{ var venta = JSON.parse(informacion); var excel= SpreadsheetApp.getActiveSpreadsheet(); var sheet_configuracion = excel.getSheetByName("Configuracion"); var numero = (venta.numero).substring(0, (venta.numero).lastIndexOf("@")); var jo={}; // RESERVO EL ARREGLO DE CONVERSACION let arreglo = (JSON.parse(informacion).mensaje).reverse(); //OBTENER EL ULTIMO EVENTO var ultima_conversacion = arreglo[0]; sheet_configuracion.getRange(10,4).setValue(informacion); sheet_configuracion.getRange(10,5).setValue(ultima_conversacion); if(ultima_conversacion.evento=="Iniciar"){ var data_pregunta = {"pregunta":1,"posicion":-1}; var sheet_evaluacion = excel.getSheetByName("Evaluaciones"); try { // SE VALIDA QUE ESTADO SEA INICIADO var sheet_alumnos = excel.getSheetByName("Alumnos"); var rows_alumnos = sheet_alumnos.getRange(2, 1, sheet_alumnos.getLastRow() - 1, sheet_alumnos.getLastColumn()).getValues(); var alumno = rows_alumnos.find(function (row) { return (row[1] + "") == "" + numero; }); if(alumno[3]=="INICIADO"){ var pregunta_anterior = arreglo.find(element => element.evento=="Iniciar_exito" && element.datos_temporal != undefined ); var sheet_datos = excel.getSheetByName("Cuestionario"); var rows_datos = sheet_datos.getRange(2, 1, sheet_datos.getLastRow() - 1, sheet_datos.getLastColumn()).getValues(); if(pregunta_anterior==undefined){ // SE BUSCA RANDOM PREGUNTAS var cuestionario_codigo = Math.floor(Math.random() * rows_datos.length); sheet_configuracion.getRange(10,1).setValue(cuestionario_codigo); sheet_configuracion.getRange(10,2).setValue(rows_datos[cuestionario_codigo][0]); sheet_evaluacion.appendRow([alumno[0],alumno[2],new Date(),new Date(),rows_datos[cuestionario_codigo][0],0,""]); data_pregunta.posicion = sheet_evaluacion.getLastRow(); data_pregunta.cuestionario = rows_datos[cuestionario_codigo][0]; }else{ data_pregunta.cuestionario = pregunta_anterior.datos_temporal.cuestionario; data_pregunta.posicion = pregunta_anterior.datos_temporal.posicion; data_pregunta.pregunta = (pregunta_anterior.datos_temporal.pregunta+1); sheet_evaluacion.getRange(data_pregunta.posicion,(data_pregunta.pregunta+6)).setValue(ultima_conversacion.mensaje); sheet_evaluacion.getRange(data_pregunta.posicion,4).setValue(new Date()); if((ultima_conversacion.mensaje+"").toUpperCase()==(pregunta_anterior.datos_temporal.respuesta_correcta+"").toUpperCase()){ sheet_evaluacion.getRange(data_pregunta.posicion,6).setValue(parseInt(sheet_evaluacion.getRange(data_pregunta.posicion,6).getValue())+parseInt(pregunta_anterior.datos_temporal.puntos)); sheet_evaluacion.getRange(data_pregunta.posicion,(data_pregunta.pregunta+6)).setBackground("#008000"); }else{ sheet_evaluacion.getRange(data_pregunta.posicion,(data_pregunta.pregunta+6)).setBackground("#FF0000"); } } var pregunta = rows_datos.find(function (row) { return (row[2] + "") == "" + data_pregunta.pregunta && (row[0] + "") == "" +data_pregunta.cuestionario; }); if(pregunta==undefined){ jo.message= "Se termino el examen tu puntuacion es "+sheet_evaluacion.getRange(data_pregunta.posicion,6).getValue(); jo.flagclean="1"; jo.terminar_do="false"; jo.datos_temporal = data_pregunta; var codigo_alumno = rows_alumnos.findIndex(function (row) { return (row[1] + "") == "" + numero; }); sheet_alumnos.getRange(codigo_alumno+2,4).setValue("COMPLETADO"); }else{ data_pregunta.respuesta_correcta = pregunta[9]; data_pregunta.puntos = pregunta[10]; jo.message= pregunta[3]+"\n"+(""+pregunta[4]?"a) "+pregunta[4]:"")+"\n"+(""+pregunta[5]?"b) "+pregunta[5]:"")+"\n"+(""+pregunta[6]?"c) "+pregunta[6]:"")+"\n"+(""+pregunta[7]?"d) "+pregunta[7]:"")+"\n"+(""+pregunta[8]?"e) "+pregunta[8]:""); jo.datos_temporal = data_pregunta; jo.terminar_do="false"; } }else{ jo.message= "Lo siento su examen no esta iniciado ";; jo.flagclean="1"; jo.terminar_do="false"; } } catch (e) { sheet_configuracion.getRange(11,7).setValue("error"+e); } jo.conversacion = { "mensaje": "@find_conversacion@", "evento": "Iniciar_exito", "retornar": ultima_conversacion.retornar }; } jo.status = '0'; } catch (e) { jo.status = '-1'; jo.message = e.toString(); } var result = JSON.stringify(jo); return result; } |
HABILITAR BOT 24 x 7 :
La solución BOT emplea Web Whatsapp para recibir y enviar mensajes , por lo cual es necesario la contratación de un servidor para el BOT este operativo 24 x 7 , debido a ello existe un pago mensual de $ 8.00 .
ASESORIA PERSONALIZADA :
En caso necesites alguna asesoría personalizada agéndame un espacio.