Hola a continuación le dejo material para que puedan implementar un BOT de Tienda Virtual y/o otros casos de uso donde se necesite trabajar con un carrito de compras 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 tienda virtual 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/1S27B72AnvOTfGrCnV5n1HJEKKFeUVGeQxkI8Q2l8qdc/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 (texto)
https://docs.google.com/spreadsheets/d/1S27B72AnvOTfGrCnV5n1HJEKKFeUVGeQxkI8Q2l8qdc/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)); }
if (operacion.op == "find_word" ){ respuesta = find_word(JSON.stringify(operacion)); } return ContentService.createTextOutput(respuesta).setMimeType(ContentService.MimeType.JSON); } function find_conversacion(informacion) { try { var result, jo = {}; var venta = JSON.parse(informacion); var excel = SpreadsheetApp.getActiveSpreadsheet(); var sheet = excel_qr.getSheetByName("Pedidos"); var sheet_qr = excel_qr.getSheetByName("Configuracion"); var sheet_producto = excel.getSheetByName("Producto"); var sheet_sede = excel.getSheetByName("Sede"); var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues(); var rows_sede = sheet_sede.getRange(2, 1, sheet_sede.getLastRow() - 1, sheet_sede.getLastColumn()).getValues(); var fecha = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd HH:mm:ss"); var fecha_solicitud = "." + Utilities.formatDate(new Date(), "GMT", "yy-MM-dd HH:mm"); var numero = (venta.numero).substring(0, (venta.numero).lastIndexOf("@")); var ultimoevento = ""; var descripcion_producto = ""; var nombre_cliente = ""; var sede_cliente=""; var envio_cliente="Recogo Tienda"; var ubicacion_delivery=""; var direccion_delivery=""; var codigo_producto=""; var productos=[]; var descripcion_sede_nombre=""; var descripcion_sede_ubicacion=""; var descripcion_sede_encargado=""; var mensaje_asesor=""; var codigo_pedido = "P_"+(Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000); //Utilities.formatDate(new Date(), "GMT", "HHmm"); var descripcion_producto=""; var nombre_archivo =""; var data_archivo =""; var tipo_archivo =""; for (var ill = 0; ill < venta.mensaje.length; ill++) { if (venta.mensaje[ill].evento == "Producto") { codigo_producto = venta.mensaje[ill].mensaje; for (var i = 0, l = rows_producto.length; i < l; i++) { if (("" + codigo_producto) == (rows_producto[i][0] + "")) { productos.push({"codigo":codigo_producto,"descripcion":rows_producto[i][1],"precio":rows_producto[i][3],"moneda":rows_producto[i][2]}); break; } } } if (venta.mensaje[ill].evento == "Finalizar_Informacion_producto") { codigo_producto = venta.mensaje[ill].mensaje; for (var i = 0, l = rows_producto.length; i < l; i++) { if (("" + codigo_producto) == (rows_producto[i][0] + "")) { descripcion_producto="*Producto* : "+rows_producto[i][1]+"\n*Precio* : "+rows_producto[i][2]+" "+rows_producto[i][3]+"\n"+rows_producto[i][4]; descripcion_producto += ";*IMAGES*;"+rows_producto[i][6]+""; break; } } } if (venta.mensaje[ill].evento == "Continuar Pedido") { productos[productos.length-1].cantidad = venta.mensaje[ill].mensaje; }
if(venta.mensaje[ill].evento=="Seleccionar_Sedes"){ nombre_cliente=venta.mensaje[ill].mensaje; } if(venta.mensaje[ill].evento=="MenuInicio" || venta.mensaje[ill].evento=="Finalizar_Tu_Ubicacion"){ sede_cliente=venta.mensaje[ill].mensaje; for (var i = 0, l = rows_sede.length; i < l; i++) { if (("" + sede_cliente) == (rows_sede[i][0] + "")) { descripcion_sede_nombre=rows_sede[i][1]; descripcion_sede_ubicacion=rows_sede[i][2]; descripcion_sede_encargado=rows_sede[i][3]; break; } } }
if(venta.mensaje[ill].evento=="Delivery_Pedido"){ envio_cliente="Delivery"; } if(venta.mensaje[ill].evento=="Finalizar_Terminar_Pedido"){ if(venta.mensaje[ill].mensaje==="ubicacion_send"){ ubicacion_delivery=venta.mensaje[ill].documento.latitud+","+venta.mensaje[ill].documento.longitud; var response = Maps.newGeocoder().reverseGeocode(venta.mensaje[ill].documento.latitud,venta.mensaje[ill].documento.longitud); for (var iz = 0; iz < response.results.length; iz++) { direccion_delivery= response.results[iz].formatted_address; break; } } }
if(venta.mensaje[ill].evento=="Finalizar_Enviar_voucher"){ if(venta.mensaje[ill].mensaje==="documento_send"){ nombre_archivo =venta.mensaje[ill].documento.filename; data_archivo =venta.mensaje[ill].documento.data; tipo_archivo =venta.mensaje[ill].documento.mimetype; } }
if(venta.mensaje[ill].evento=="Finalizar_Consulta_Pedido"){ codigo_pedido=venta.mensaje[ill].mensaje; } if(venta.mensaje[ill].evento=="Adjuntar_Enviar_voucher"){ codigo_pedido=venta.mensaje[ill].mensaje; } if(venta.mensaje[ill].evento=="Finalizar_Hablar_con_asesor"){ mensaje_asesor=venta.mensaje[ill].mensaje; } ultimoevento = venta.mensaje[ill].evento; }
var mensaje_detalle="Tu detalle es :\n"; if(ultimoevento == "Mostrar_Detalle_Pedido" || ultimoevento == "Finalizar_Terminar_Pedido"){ var total=0.0; var moneda=""; for (var i = 0; i < productos.length; i++) { mensaje_detalle+="*"+productos[i].descripcion+"* Cant."+ productos[i].cantidad+" x "+productos[i].moneda+""+productos[i].precio+"\n"; var subtotal=Number.parseFloat(productos[i].cantidad)*Number.parseFloat(productos[i].precio); total=Number.parseFloat(Number.parseFloat(total)+Number.parseFloat(subtotal)).toFixed(2); moneda=productos[i].moneda; if(ultimoevento == "Finalizar_Terminar_Pedido"){ for (var ij = 0, lj = rows_producto.length; ij < lj; ij++) { if (("" + productos[i].descripcion) == (rows_producto[ij][1] + "")) { var stock_actualizar = parseInt(rows_producto[ij][5])-parseInt(productos[i].cantidad); sheet_producto.getRange(ij+2, 6).setValue(stock_actualizar); break; } } } } mensaje_detalle+="*Total* :"+moneda+""+total; } if (ultimoevento == "Mostrar_Detalle_Pedido") { jo.status = '0'; jo.message = mensaje_detalle; jo.conversacion = { "mensaje": "", "evento": "Mostrar_Detalle_Pedido_Informacion", "retornar": "OpcionTipoEnvio" }; } if (ultimoevento == "Finalizar_Terminar_Pedido") { sheet.appendRow([codigo_pedido,fecha,nombre_cliente,numero,descripcion_sede_nombre,mensaje_detalle,'Pendiente',envio_cliente,direccion_delivery,ubicacion_delivery,"",JSON.stringify(venta.mensaje)]); jo.status = '0'; jo.message = "Su pedido ha sido registrado✅😃\nUn asesor se comunicara contigo en breve, su codigo de seguimiento es *"+codigo_pedido+"*\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇."; jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Terminar_Pedido_informacion", "retornar": "" }; } if (ultimoevento == "Finalizar_Tu_Ubicacion") { jo.status = '0'; var mensaje_sede="No existe la sede seleccionada ✅😃"; if(sede_cliente!=""){ mensaje_sede="*Sede* :"+descripcion_sede_nombre+"\n*Ubicacion* : "+descripcion_sede_ubicacion+"\n*Encargado* : "+descripcion_sede_encargado; } jo.message = mensaje_sede; jo.conversacion = { "mensaje": "", "evento": "Finalizar_Tu_Ubicacion_informacion", "retornar": "Finalizar_Tu_Ubicacion_Menu" }; } if (ultimoevento == "Finalizar_Informacion_producto") { jo.status = '0'; var mensaje_producto="No existe el producto seleccionado ✅😃"; if(descripcion_producto!=""){ mensaje_producto=descripcion_producto; } jo.message = mensaje_producto; jo.conversacion = { "mensaje": "", "evento": "Finalizar_Informacion_producto_informacion", "retornar": "Finalizar_Informacion_producto_Menu" }; }
if(ultimoevento=="Finalizar_Hablar_con_asesor"){
jo.status = '0'; jo.message = "Se ha registrado el mensaje ✅😃\nUn asesor se comunicara contigo en breve\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇."; jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Hablar_con_asesor_informacion", "retornar": "" }; var sheet_solicitud =excel.getSheetByName("Solicitud_asesor"); sheet_solicitud.appendRow([fecha,nombre_cliente,descripcion_sede_nombre,numero,mensaje_asesor,'Pendiente',JSON.stringify(venta.mensaje)]) }
if(ultimoevento=="Finalizar_Consulta_Pedido"){ var mensaje_consulta="No existe pedido # *"+codigo_pedido+"* ✅😃"; var rows = sheet.getRange(2,1,sheet.getLastRow()-1, sheet.getLastColumn()).getValues(); if(rows){ for(var i = 0, l= rows.length; i<l ; i++){ var dataRow = rows[i]; if((dataRow[0]+"")===""+codigo_pedido){ mensaje_consulta = "El pedido # *"+codigo_pedido+"* ( "+dataRow[6]+" )\n"; mensaje_consulta+= dataRow[5]; break; } } } mensaje_consulta+="\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇."; jo.status = '0'; jo.message = mensaje_consulta; jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Consulta_Pedido_informacion", "retornar": "" }; }
if(ultimoevento=="Finalizar_Enviar_voucher"){ var mensaje_consulta="No existe pedido # *"+codigo_pedido+"* ✅😃"; var rows = sheet.getRange(2,1,sheet.getLastRow()-1, sheet.getLastColumn()).getValues(); if(rows){ for(var i = 0, l= rows.length; i<l ; i++){ var dataRow = rows[i]; if((dataRow[0]+"")===""+codigo_pedido){ var sheet_parametro =excel.getSheetByName("Configuracion"); var folderurl_completo = sheet_parametro.getRange(4, 2).getValue(); var folderurl_texto= (folderurl_completo).substring((folderurl_completo).lastIndexOf("/") + "/".length, (folderurl_completo).length); var folderurl=(folderurl_texto.split("?"))[0]; var folder_ = DriveApp.getFolderById(folderurl); var nombre_archivo_="ARCHIVO_"+codigo_pedido+".png"; if(nombre_archivo){ nombre_archivo_ =nombre_archivo; } var decoded = Utilities.base64Decode(data_archivo); var image = Utilities.newBlob(decoded,tipo_archivo,nombre_archivo_); // SE CREA EL ARCHIVO var file = folder_.createFile(image); var files_ = folder_.getFilesByName(nombre_archivo_); var urlfile =""; while (files_.hasNext()) { var archivo_=files_.next(); urlfile = archivo_.getUrl(); } var range = sheet.getRange(i+2, 11); var richValue = SpreadsheetApp.newRichTextValue().setText(nombre_archivo_).setLinkUrl(urlfile).build(); range.setRichTextValue(richValue); mensaje_consulta = "El pedido # *"+codigo_pedido+"* se actualizo el voucher pago \n"; mensaje_consulta+= dataRow[5]; break; } } } mensaje_consulta+="\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇."; jo.status = '0'; jo.message = mensaje_consulta; jo.conversacion = { "mensaje": "@end@", "evento": "Finalizar_Enviar_voucher_informacion", "retornar": "" }; }
} catch (e) { jo.status = '-1'; jo.message = e.toString(); } var result = JSON.stringify(jo); sheet_qr.getRange(9, 5).setValue(result); return result; } 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 find_word(informacion){ var result,jo={}; try{ var resultado = JSON.parse(informacion); var excel= SpreadsheetApp.getActiveSpreadsheet(); var sheet_sede =excel.getSheetByName("Pedidos"); var rows_sede = sheet_sede.getRange(2,1,sheet_sede.getLastRow()-1, sheet_sede.getLastColumn()).getValues(); jo.status = '1'; jo.message = ' No existe'; var numero = (resultado.numero).substring(0, (resultado.numero).lastIndexOf("@")); for(var i2 = 0, l2= rows_sede.length; i2<l2 ; i2++){ var dataRow = rows_sede[i2]; var record = {}; if((dataRow[3]+"")==(numero+"") && resultado.mensaje=="Por favor ingrese tu nombre 🙋♂."){ jo.status = '0'; jo.message = ' Hola '+dataRow[2]+ " 🙋♂."; jo.conversacion={"mensaje":dataRow[2],"evento":"Seleccionar_Sedes","retornar":"MenuInicio"}; break; } } } catch (e) { jo.status = '-1'; jo.message = e.toString(); } var result = JSON.stringify(jo); return result;
} 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 = []; var dataProducto = []; var dataSede = [];
if(excel_qr.getSheetByName("Producto")){ var sheet_producto =excel_qr.getSheetByName("Producto"); 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'] = "*"+dataRow[0]+"* : "+dataRow[1]+" ("+dataRow[2]+""+dataRow[3] +")"; dataProducto.push(record); } } if(excel_qr.getSheetByName("Sede")){ var sheet_sede =excel_qr.getSheetByName("Sede"); 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'] = "*"+dataRow[0]+"* : "+dataRow[1]; record['ubicacion'] =dataRow[1]; record['encargado'] =dataRow[2]; record['maps'] =dataRow[3]; dataSede.push(record); } } 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); } } var payload = { "op": "registermessage", "token_qr": token_session, "conversacion": dataConversacion }; payload.data_1 =dataSede; payload.data_2 =dataProducto;
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); } } } |
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.
Hola soy de Perú quisiera poder contactarme contigo con respecto a un chatbox con servicio 24x7 con coneccion a Sheet y Wasapt pero que se ecuentre en la Nube o un servidor gratuito obviamente habra un incentivo por ello. Espero que me puedas contactar
ResponderEliminar