Hola a continuación le dejo material para que puedan implementar un BOT de Reserva de Cita Medica para hospitales clinicas y/o otros casos de uso donde se necesite trabajar con un horario empleando hoja de calculo google sheet.
¿ Deseas solo probarlo YA?
1) Ingresar a la siguiente pagina
https://anlusoftware.blogspot.com/
2) Seleccionar la opcion "GENERAR TOKEN WHATSAPP PARA BOT" y luego el BOT que deseas activar "Whatsapp chatbot reserva citas medicas con google sheets"
3) Si todo esta OK se le mostrara mensaje confirmacion
4) Conversele al numero de celular .
5) El BOT trabaja con la siguiente hoja sheet se iran almacenado los registros ahi,
https://docs.google.com/spreadsheets/d/1d1tq3Si4ubunzzXP-1D_wAqRXNH8GX0aqTgpdQt9_vM/edit?usp=sharing
¿ Necesitas implementarlo tu mismo para realizar cambios ?
- Crear la hoja Google sheet como indica el video
- Escanear la hoja para obtener token QR
- Whatsapp version android no business
Video Implementación
Página Excel Plantilla (BOT Texto)
https://docs.google.com/spreadsheets/d/1d1tq3Si4ubunzzXP-1D_wAqRXNH8GX0aqTgpdQt9_vM/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"; var appscript = sheet_qr.getRange(1, 2).getValue(); function onOpen() { createMenus(); } function createMenus() { var menu = SpreadsheetApp.getUi().createMenu("Whatsapp"); menu.addItem('1) Obtener TOKEN Session - QR Whatsapp', 'qrwhatsapp'); menu.addItem('2) Habilitar BOT - Whatsapp', 'enviarconversacion'); 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") { sheet_qr.getRange(3, 2).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(3, 2).setValue(""); var response = Browser.msgBox('Seguro que quiere generar QR 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 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 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 datacategoria = []; var datafecha= []; var datahora= []; var datapago = []; 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++) { 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); } } if (excel_qr.getSheetByName("Especialidad")) { var sheet_producto = excel_qr.getSheetByName("Especialidad"); var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues(); for (var i1 = 0, l1 = rows_producto.length; i1 < l1; i1++) { var dataRow = rows_producto[i1]; var record = {}; record['mensaje'] = "*"+(i1+1)+"* : "+dataRow[0]; datacategoria.push(record); } } if (excel_qr.getSheetByName("Fecha")) { var sheet_sede = excel_qr.getSheetByName("Fecha"); var rows_sede = sheet_sede.getRange(2, 1, sheet_sede.getLastRow() - 1, sheet_sede.getLastColumn()).getValues(); for (var i2 = 0, l2 = rows_sede.length; i2 < l2; i2++) { var dataRow = rows_sede[i2]; var record = {}; record['mensaje'] = "*"+(i2+1)+"* : "+dataRow[0]; datafecha.push(record); } } var payload = { "op": "registermessage", "token_qr": token_session, "conversacion": dataConversacion }; payload.data_1 =datacategoria; payload.data_2 =datafecha; payload.data_3 =datahora; payload.data_4 =datapago; 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) { var result, jo = {}; try { var resultado = JSON.parse(informacion); var excel = SpreadsheetApp.getActiveSpreadsheet(); var sheet = excel.getSheetByName("Configuracion"); var sheet_sede = excel.getSheetByName("Solicitud"); var rows_sede = ""; if (sheet_sede.getLastRow() > 1) { rows_sede = sheet_sede.getRange(2, 1, sheet_sede.getLastRow() - 1, sheet_sede.getLastColumn()).getValues(); } var numero = (resultado.numero).substring(0, (resultado.numero).lastIndexOf("@")); jo.status = '1'; jo.message = "error"; var sumary = ""; var stadium = ""; var dayss = ""; var hourss = ""; var payss = ""; var codigo_pedido = sheet_sede.getLastRow();//new Date().getTime(); var nombre_cliente = ""; var codigo_pedido_cancelar = ""; var ultimoevento = ""; var fecha = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd HH:mm:ss"); for (var ill = 0; ill < resultado.mensaje.length; ill++) { if (resultado.mensaje[ill].evento == "despues_nombre") { nombre_cliente = resultado.mensaje[ill].mensaje; } if (resultado.mensaje[ill].evento == "reserva_fecha") { /* se busca en las especialidad */ var sheet_producto = excel.getSheetByName("Especialidad"); var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues(); for (var i1 = 0, l1 = rows_producto.length; i1 < l1; i1++) { if((""+(i1+1))==(""+resultado.mensaje[ill].mensaje)){ stadium = rows_producto[i1][0]; break; } } } if (resultado.mensaje[ill].evento == "reserva_hora_buscar") { /* se busca en las fechas */ var sheet_producto = excel.getSheetByName("Fecha"); var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues(); for (var i1 = 0, l1 = rows_producto.length; i1 < l1; i1++) { if((""+(i1+1))==(""+resultado.mensaje[ill].mensaje)){ dayss = rows_producto[i1][0]; break; } } } if (resultado.mensaje[ill].evento == "reserva_pago") { /* se busca en las horas */ var sheet_hour = excel.getSheetByName("Hora"); var rows_hour = sheet_hour.getRange(2, 1, sheet_hour.getLastRow() - 1, sheet_hour.getLastColumn()).getValues(); var contador_hour=1; for (var i2 = 0, l2 = rows_hour.length; i2 < l2; i2++) { var dataRow = rows_hour[i2]; if (dataRow[2] == stadium && dataRow[3] == dayss) { if((""+(contador_hour))==(""+resultado.mensaje[ill].mensaje)){ hourss =rows_hour[i2][0]; break; } contador_hour=contador_hour+1; } } } if (resultado.mensaje[ill].evento == "cerrar_reserva_cita") { /* se busca la forma de pago */ var sheet_sumary = excel.getSheetByName("FormaPago"); var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues(); var contador_sumary=1; for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) { var dataRow = rows_sumarry[i2]; if (dataRow[3] == stadium) { if((""+(contador_sumary))==(""+resultado.mensaje[ill].mensaje)){ payss =rows_sumarry[i2][0]; break; } contador_sumary=contador_sumary+1; } } } if (resultado.mensaje[ill].evento == "cerrar_consulta_reserva") { codigo_pedido = (resultado.mensaje[ill].mensaje); } if (resultado.mensaje[ill].evento == "cerrar_cancelacion_reserva") { codigo_pedido_cancelar = resultado.mensaje[ill].mensaje; } ultimoevento = resultado.mensaje[ill].evento; } jo.status = '1'; jo.message = ' No existe'; if (ultimoevento == "Start") { if (rows_sede && rows_sede.length > 0) { for (var i2 = 0, l2 = rows_sede.length; i2 < l2; i2++) { var dataRow = rows_sede[i2]; var record = {}; if ((dataRow[3] + "") == (numero + "")) { jo.status = '0'; jo.message = ' Hola ' + dataRow[2] + " 🙋♂."; jo.conversacion = { "mensaje": dataRow[2], "evento": "despues_nombre", "retornar": "reserva_categoria,1;consulta_reserva,2" }; break; } } } } else if (ultimoevento == "cancelar_reserva") { var dataBooking_delete = []; if (excel.getSheetByName("Solicitud")) { var sheet_sumary = excel.getSheetByName("Solicitud"); var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues(); for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) { var dataRow = rows_sumarry[i2]; var record = {}; try { if (dataRow[3] == numero && dataRow[8] == "No confirmado" ) {//&& fecha_registro > fecha_comparar) { record['mensaje'] = "*" + dataRow[0] + "* Especialidad : " + dataRow[4] + " Fecha :" + dataRow[5];//.substring(0, 10) dataBooking_delete.push(record); } } catch (e1) { } } } jo.conversacion = { "mensaje": "@lst@", "evento": "cancelar_reserva_V2", "retornar": "cancelar_lista_reserva" }; jo.status = '1'; if (dataBooking_delete.length > 0) { jo.status = '0'; } jo.data_4 = dataBooking_delete; } else if (ultimoevento == "cerrar_cancelacion_reserva") { if (excel.getSheetByName("Solicitud")) { var sheet_sumary = excel.getSheetByName("Solicitud"); var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues(); for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) { var dataRow = rows_sumarry[i2]; var record = {}; if ((dataRow[0] + "") == (codigo_pedido_cancelar + "")) { sheet_sumary.getRange(i2 + 2, 9).setValue("Cancelada"); } } } jo.message = "Cita Medica Numero : " + codigo_pedido_cancelar + " ha sido cancelado correctamente ✅"; jo.conversacion = { "mensaje": "@end@", "evento": "cerrar_cancelacion_reserva", "retornar": "Close" }; jo.status = '0'; } else if (ultimoevento == "reserva_hora_buscar") { var data_hora = []; if (excel.getSheetByName("Hora")) { var sheet_hour = excel.getSheetByName("Hora"); var rows_hour = sheet_hour.getRange(2, 1, sheet_hour.getLastRow() - 1, sheet_hour.getLastColumn()).getValues(); var contador_hour=1; for (var i2 = 0, l2 = rows_hour.length; i2 < l2; i2++) { var dataRow = rows_hour[i2]; var record = {}; if (dataRow[2] == stadium && dataRow[3] == dayss) { record['mensaje'] = "*"+(contador_hour)+"* : "+dataRow[0]; data_hora.push(record); contador_hour=contador_hour+1; } } }
var data_pago = []; if (excel.getSheetByName("FormaPago")) { var sheet_sumary = excel.getSheetByName("FormaPago"); var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues(); var contador_pago=1; for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) { var dataRow = rows_sumarry[i2]; var record = {}; if (dataRow[3] == stadium) { record['mensaje'] = "*"+(contador_pago)+"* : "+dataRow[0]; data_pago.push(record); contador_pago=contador_pago+1; } } } jo.conversacion = { "mensaje": "@lst@", "evento": "reserva_hora_buscar_v2", "retornar": "reserva_hora" }; jo.status = '0'; jo.data_3 = data_hora; jo.data_4 = data_pago; } else if (ultimoevento == "cerrar_reserva_cita") { if (excel.getSheetByName("FormaPago")) { jo.message = "Oops, no entiendo 🤦🏻♂️"; var sheet_sumarry = excel.getSheetByName("FormaPago"); var rows_sumarry = sheet_sumarry.getRange(2, 1, sheet_sumarry.getLastRow() - 1, sheet_sumarry.getLastColumn()).getValues(); for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) { var dataRow = rows_sumarry[i2]; if (dataRow[0] == payss) { jo.message = "Resumen de su cita medica :\nespecialidad: " + stadium + "\nFecha y Hora: " + dayss + " " + hourss + "\n" + payss + " " + dataRow[1] + "\n" + dataRow[2] + "\nNumero Cita Medica # " + codigo_pedido + " ✅" + "\n Cualquier cancelación de cita medica se debe realizar un dia antes de la fecha"; break; } } } jo.conversacion = { "mensaje": "@end@", "evento": "cerrar_reserva_cita", "retornar": "Close" }; sheet_sede.appendRow([codigo_pedido, fecha, nombre_cliente, numero, stadium, "'"+dayss, hourss, payss, "No confirmado", JSON.stringify(resultado)]) jo.status = '0'; } else if (ultimoevento == "cerrar_consulta_reserva") { jo.message = "No existe ningun cita medica para el # " + codigo_pedido + " ✅"; if (rows_sede && rows_sede.length > 0) { for (var i = 0, l = rows_sede.length; i < l; i++) { var dataRow = rows_sede[i]; if ((dataRow[0] + "") === "" + codigo_pedido) { jo.message = "Cita Medica de " + dataRow[2] + "\nSituacion Cita Medica Numero " + codigo_pedido + " ( " + dataRow[8] + " ) ✅"; break; } } } jo.conversacion = { "mensaje": "@end@", "evento": "cerrar_consulta_reserva", "retornar": "Close" }; 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.
https://reservarasesoriaanlusoft.blogspot.com/
Hola me interesa obtener un chatbot personalizado por favor contactame a mi whatasaap +573164967424 muchas gracias
ResponderEliminar