Hola Habr! A menudo, cuando piensan en lanzar un piloto, los gerentes comienzan a complicar la situaci贸n, a construir hojas de ruta y a esperar el MVP de los desarrolladores, en lugar de tomar y probar la idea por su cuenta. Debajo del corte, quiero compartir la historia de la creaci贸n de un servicio de control de calidad basado en formularios de Google, VK y docenas de l铆neas de c贸digo, en el que ning煤n desarrollador result贸 afectado, solo 1 vendedor.

Descargo de responsabilidad : en este art铆culo estoy esperando ejemplos de c贸digo que le har谩n preguntas, dudas, tal vez incluso l谩grimas sangrientas y ceguera. Para justificarlo, solo hay una cosa que decir: este c贸digo funcion贸 como Papa Carlo, y cumpli贸 su misi贸n al 100%, y algunos scripts a煤n funcionan.
Primera calificaci贸n de Dodo Pizzeria
Uno de los principios fundamentales de nuestra empresa: lo
que no se puede medir, no existe . La pizza existe, lo que significa que necesita evaluar de alguna manera su calidad.
Todo comenz贸 en 2013. En ese momento, hab铆a 7 pizzer铆as en la red. Luego, en Dodo, decidieron lanzar un proyecto para controlar la calidad y los est谩ndares del producto, una calificaci贸n de pizzer铆as abierta a todos los socios.
Se ve铆a as铆.

Los datos fueron tomados de llamadas de clientes, revisiones en las redes sociales. redes y un poco de Dodo IS (nuestro sistema de informaci贸n).
Una ventaja obvia en ese momento: la calificaci贸n comenz贸 a impulsar a las pizzer铆as administradoras a trabajar en la calidad para estar en la cima.
Pizzer铆as Second Shop Mystery Shop
Aproximadamente un a帽o despu茅s, nos dimos cuenta de que necesit谩bamos evaluar el producto en s铆 y tomamos el famoso modelo: "compradores misteriosos". En ese momento, hicimos un gran avance: el primero en Rusia decidi贸 que nuestros clientes ser铆an los compradores misteriosos.
La aparici贸n de un grupo cerrado VK
Inicialmente, descubrimos c贸mo trabajan con compradores misteriosos en agencias que brindan dichos servicios. Result贸 que se comunican por correo electr贸nico o llaman directamente para ofrecer la verificaci贸n.
Esta opci贸n no nos sedujo de inmediato. Definitivamente no 铆bamos a llamar, porque para nosotros fue mucho tiempo, pero para un cliente fue doloroso y estaba a la par con el spam. El correo se utiliz贸 para env铆os masivos, pero pronto fueron abandonados.
Se nos ocurri贸:
- Para la comunicaci贸n con los agentes secretos y la coordinaci贸n de los controles, utilizaron la p谩gina habitual en VK.
- Para recopilar informes fotogr谩ficos, formaron un grupo en VK con una pared abierta.
- Y para las encuestas de servicio, elegimos los formularios de Google. Que? Convenientemente, no necesita cortar un servicio separado, y se muestra bien en el tel茅fono m贸vil.
- Todas las instrucciones estaban en Google Docs.
Todo est谩 en la rodilla. Todo es como deber铆a ser para una startup.
Foto de un comprador misterioso. S铆, midieron el ancho con una regla, cortaron el borde de la pizza para mostrar el horneado y la calidad de la masa.M谩s ejemplos de reportajes fotogr谩ficos de 2015 est谩n aqu铆. La calificaci贸n cambiaba constantemente, se agregaron nuevos criterios de evaluaci贸n. Por ejemplo, esto es 131 puntos para evaluar la pizzer铆a Abakan-1.

Todo el proceso fue que todas las violaciones en los puntos se observaron manualmente, sin automatizaci贸n. Y todo esto fue hecho por un empleado.
La magia de las hojas de c谩lculo de Google
En 2016, aprendimos (madurado) que la humanidad ha inventado durante mucho tiempo funciones distintas a = SUMA. Y qu茅 se puede hacer usando scripts y funciones de importaci贸n de datos entre tablas ... Direct CRM build.
Por ejemplo, para evaluar cada pizzer铆a en la tabla hab铆a una hoja, y en ella criterios de evaluaci贸n y puntajes. 1 pizzer铆a = 1 hoja. Cuantas m谩s pizzer铆as, m谩s s谩banas. Cada semana una nueva se帽al. Al presionar el bot贸n m谩gico, la hoja de plantilla en la tabla se expandi贸 en 120 hojas. Wah, que bueno!

Esta etapa de automatizaci贸n "Dodo Controlling" tom贸 alrededor de seis meses. Avanzamos paso a paso: aprendimos algo nuevo - implementado, aprendimos algo m谩s nuevo - introducido nuevamente.
La limitaci贸n como motor del progreso.
Desde el principio, hablamos con compradores misteriosos en nombre de una cuenta personal en VK. Y luego lleg贸 el d铆a en que nos enfrentamos con problemas irresolubles de p谩ginas personales:
- hay un l铆mite de 10,000 amigos;
- Hay un l铆mite en el env铆o de mensajes: a veces no podemos enviar mensajes, porque VK nos bloque贸 con la frase "usted envi贸 demasiados mensajes, venga ma帽ana".
Por lo general, VK bloque贸 el env铆o de mensajes alrededor de las 16:00. Era una hora feliz cuando el equipo pod铆a descansar.
Poco a poco, nos encontramos con casi todas las limitaciones del VK y casi logramos dejar de amar este sitio. Pero ocurri贸 un milagro, y VK le dio a los grupos la oportunidad de conectar widgets de mensajes, bots de chat y otras cosas.
De hecho, esta posibilidad era anterior a diciembre de 2016, pero con una limitaci贸n cr铆tica para nosotros: el grupo pod铆a responder el mensaje solo dentro de los 10 d铆as desde el momento en que envi贸 el 煤ltimo mensaje del cliente. Cuando eliminaron esta restricci贸n, la vida de nuestro equipo comenz贸 a brillar con nuevos colores. Desde entonces, hemos comenzado el camino de la automatizaci贸n utilizando la API VK y las hojas de c谩lculo de Google.
Miedo y asco en una secuencia de comandos de usuario
Inicialmente, para convertirse en un comprador misterioso, ten铆a que completar un formulario, luego presentar una solicitud al grupo, escribirnos una palabra clave y esperar a que respondamos. Esta espera podr铆a durar hasta 48 horas. Fue indecentemente largo y el deseo de realizar controles despu茅s de tal registro se desvaneci贸.
Con una nueva tienda de conocimiento, nos propusimos automatizar el registro.
Ten铆amos varios m茅todos de API, una forma, varias docenas de tablas, una p谩gina de inicio, un bot en PHP, scripts en la tabla que fueron escritos por el mejor comercializador Dodo y el primer CFO de Dodo en una persona, docenas de plantillas de mensajes para diferentes situaciones. Entonces ni siquiera sab铆a que esto se llamaba un script de usuario:
- Mystery Shopper llen贸 un cuestionario (esta es una versi贸n desactualizada y ahora no funciona).
- Los datos del formulario cayeron primero en la base de datos, luego en la tabla. El bot primero llam贸 a la base de datos para verificar los datos sobre el perfil, porque el tiempo de espera de respuesta de la placa en decenas de miles de l铆neas era grande, y la base de datos lo digiri贸 f谩cilmente).
- Despu茅s de completar el cuestionario en el formulario, apareci贸 un mensaje en la pantalla: "Gracias, queda por unirse al grupo (enlace) y escribir la palabra clave" Sherlock "".
- Luego, el comprador misterioso envi贸 una solicitud para unirse al grupo y escribi贸 la palabra clave "Sherlock". La palabra fue el desencadenante para ejecutar el script de validaci贸n:
- se envi贸 una solicitud a la base de datos si el agente es adecuado para nosotros por edad;
- en caso afirmativo, la persona fue agregada a los grupos, y en la tabla opuesta al cuestionario del candidato se anot贸 el estado "ok / not ok";
- Se pintaron m谩s datos en color turquesa y fue importante. As铆 que con mis ojos fue m谩s f谩cil entender qui茅n nos conviene y con qui茅n podemos hablar. El gui贸n pintaba perfiles rojos inadecuados;
- Adem谩s, el comprador secreto fue aceptado autom谩ticamente en el grupo, y se envi贸 un mensaje al chat con m谩s pasos e instrucciones.

Tal es la automatizaci贸n del registro. Ahora todo el procedimiento se ha vuelto casi simple y comprensible.
Adem谩s, todo fue como un reloj. Qued贸 claro que podemos enviar mensajes a trav茅s de tablas directamente a PM a agentes secretos a trav茅s de mensajes grupales.

隆Y acabas de tener 46 l铆neas de c贸digo!
function send() { var range = SpreadsheetApp.getActiveSpreadsheet().getActiveRange(); var ss = range.getValues(); var carray = range.offset(0, -2).getValues(); var marray = range.offset(0, 1).getValues(); var iarray = range.offset(0, 0).getValues(); ss.forEach(function (r, i) { var tt = range.getRowIndex(); var add = tt + i; var check = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('L' + add).getValue(); if (check != '') { SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('K' + add).setValue("").setBackground("#ffff00"); return; } var payload = { "message" : marray[i][0], "user_id" : r[0], "access_token" : " ", "v" : "5.74" }; var options = {
En las tablas, generamos el texto de los mensajes y realizamos env铆os personalizados mediante la p谩gina de identificaci贸n. Tambi茅n dejamos de copiar y enviar mensajes manualmente. En las horas pico, podr铆amos enviar hasta 3000 mensajes en 45 minutos usando tablas. Si lo hici茅ramos a mano, entonces no escribir铆a este art铆culo, pero seguir铆a enviando mensajes.
A continuaci贸n, doy un ejemplo de una tableta tan milagrosa. Intent茅 mucho hacer una UX / UI clara y funcional. Al hacer clic en el bot贸n rojo, se lanz贸 una lista de correo con una propuesta para realizar una verificaci贸n secreta.

M谩s funciones para automatizar procesos infernales
La compa帽铆a tiene muchos formularios de Google que nos ayudan a recopilar algunas m茅tricas de pizzer铆as de forma continua. Cada formulario tiene una lista de pizzer铆as que deben mantenerse actualizadas. Hay 53 formularios en total, cada uno de ellos se actualiz贸 previamente de forma manual.
Un poco cansado de este trabajo, nos dimos cuenta de que este negocio podr铆a automatizarse. Volv铆 a recurrir a nuestro vendedor, despu茅s de una o dos horas, todo estaba listo y solo 47 l铆neas de c贸digo.
function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var range = ss.getActiveRange(); var forms = range.offset(0, 1).getValues(); var items = range.offset(0, 2).getValues(); var sources = range.offset(0, 3).getValues(); var ranges = range.offset(0, 4).getValues(); forms.forEach(function (r,i) { var form = FormApp.openById(forms[i]); var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sources[i]).getRange(ranges[i]).getValues(); var arr = []; values.forEach(function (el,ei) { if (el[0] != '') { arr.push(el[0]); } }); var item = form.getItems()[Number(items[i])].asListItem(); item.setChoiceValues(arr); Logger.log(item.getTitle()); }); } function getData() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var range = ss.getSheetByName(" ").getRange("A2:C").getValues(); Logger.log(range); } function onOpen() { var ui = SpreadsheetApp.getUi();
Los formularios son diferentes, con diferentes listas de pizzer铆as y la ubicaci贸n de la lista de pizzer铆as en el formulario. En alg煤n lugar necesitamos extranjeros, en alg煤n lugar de Rusia.

Las columnas B y C le dicen al script en qu茅 formulario actualizar y en qu茅 lugar el formulario muestra la lista. Y las columnas D y E, de qu茅 hoja y rango necesita tomar la lista para actualizar.
A continuaci贸n, establecieron un disparador para ejecutar el script una vez al d铆a y, por lo tanto, pudieron vencer el infierno del proceso de actualizaci贸n de formularios primero para su departamento, luego para toda la empresa. Este script a煤n funciona.
El caso m谩s dif铆cil sobre un caracol.
Una vez que quer铆amos recibir grabaciones de audio de los controles de entrega.
De d贸nde vino la grabaci贸n de audio: los compradores misteriosos grabaron la reuni贸n del servicio de mensajer铆a con el cliente como un mensaje de audio en VK. Por lo general, esto es 10-15 segundos de grabaci贸n de audio.
C贸mo los obtuvimos: tomaron los 煤ltimos 20 mensajes en la direcci贸n VK del comprador misterioso, buscaron la palabra "Ulica" entre ellos, luego retrocedieron un mensaje y quitaron el enlace a la grabaci贸n de audio. (Spoiler: no es la mejor palabra, a menudo nos escribieron la palabra "Caracol").
Ya hay m谩s l铆neas de c贸digo, prep谩rate.
function getLastAudio() { var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var token = ''; var range = ss.getActiveRange().getValues(); var tt = ss.getActiveRange().getRowIndex(); range.forEach(function (r,i) { var ri = tt + i; var cuid = r[0]; var ci = 0; var payload1 = { "q" : '', 'peer_id' : r[0], "access_token" : token, "v" : "5.73", }; var options1 = {
Las hojas de c谩lculo de Google no son gomosas, pero soy un codificador regular
Entonces todo giraba y giraba, hasta que crecimos hasta 60 mil compradores misteriosos a principios de 2018.
Entonces, ya nos hemos topado con restricciones de tabla. Entonces, una tabla no pod铆a contener m谩s de 2 millones de celdas, y utilizamos 1,6 millones de celdas en una de las etiquetas de departamento m谩s concurridas, de las cuales 135 mil celdas ten铆an todo tipo de funciones de tabla.
Tal backend. Todo se ralentiz贸 terriblemente y cuando varias personas trabajaron juntas, el plato dio "El documento es demasiado popular, vuelve m谩s tarde".
Luego qued贸 claro que soy un mal codificador, el sistema no soporta la carga y necesito ser reemplazado.
Y luego vino el verdadero desarrollador ...
Pero esta es una historia completamente diferente y la escribiremos m谩s adelante. Espero que estos ejemplos ayuden a los gerentes en sus proyectos, donde hay muchos procesos infernales. Los procesos pueden y deben ser automatizados, tanto las tablas como el zapier (tambi茅n lo usamos) pueden ayudar, y encontrar soluciones si hay recursos, al principio no los ten铆amos.
Si tiene una persona en la empresa que sabe algo sobre scripts, entonces es adecuado para organizar procesos infernales en tabletas. Si usted mismo quiere aprender algo como esto,
Telegram tiene un excelente canal para esto, del cual tom茅 informaci贸n sobre funciones y scripts.
Bueno, cabecera para todos los gerentes: conocer las tablas todos los d铆as ahorra tiempo al trabajar con datos y le permite pensar y comprender al menos un poco lo que hace el desarrollador con los datos y lo que puede hacer con los datos en general.