我如何用桌子和木棍创建质量控制服务

哈Ha! 通常,在考虑启动试点时,管理人员开始使情况复杂化,制定路线图并等待开发人员的MVP,而不是自己接受和测试该想法。 在削减的基础上,我想分享一个基于Google表单,VK和数十行代码创建质量控制服务的故事,其中没有开发人员受到伤害,只有一名营销人员。



免责声明 :在本文中,我正在等待代码示例,这些示例将引起您的疑问,疑惑,甚至流血的眼泪和盲目性。 为此,只有一件事可以说-该代码像Papa Carlo一样工作,并且100%地完成了其任务,并且某些脚本仍然有效。

渡渡鸟披萨店第一评级


我们公司的主要原则之一- 无法衡量的原则不存在 。 披萨存在,这意味着您需要以某种方式评估其质量。

一切始于2013年。 当时,网络上有7家比萨店。 然后,他们决定在Dodo启动一个项目来控制产品质量和标准-对所有合作伙伴开放的比萨店等级。

他看起来像那样。



数据来自客户电话,社交评论。 网络以及来自Dodo IS(我们的信息系统)的一些信息。

当时明显的优势-评级开始推动比萨店的管理人员提高质量,从而脱颖而出。

第二个神秘商店比萨店


大约一年后,我们意识到我们需要评估产品本身,并采用了著名的模型“神秘购物者”。 那时,我们取得了突破-俄罗斯的第一个突破决定了我们的客户将是神秘的购物者。

一个封闭的团体VK的出现


最初,我们发现了他们如何与提供此类服务的代理商中的神秘购物者合作。 事实证明,他们通过电子邮件进行通信或直接致电以提供验证。

此选项没有立即引诱我们。 我们绝对不会打电话,因为对于我们来说这是很长的时间,但是对于客户而言,这是痛苦的,与垃圾邮件相当。 邮件用于大量邮件的发送,但很快就被废弃了。

我们想出了:

  1. 为了与秘密特工进行沟通并协调支票,他们使用了VK中的常规页面。
  2. 为了收集照片报告,他们在VK的墙壁上开了一个小组。
  3. 对于服务调查,我们选择了Google表单。 什么啊 方便的是,您无需切断单独的服务,并且可以在手机上很好地显示。
  4. 所有说明均在Google文档中。

一切都在膝盖上。 一切都与启动一样。


神秘顾客的照片。 是的,他们用尺子测量了宽度,切了比萨饼的边缘,以显示面团的烘烤度和质量。

此处提供2015年照片报告中的更多示例。





评级不断变化,添加了新的评估标准。 例如,这是131分,用于评估Abakan-1比萨店。



整个过程很糟糕,所有这些要点中的违规都是手动记录的,没有自动化。 所有这些都是由一名员工完成的。

Google电子表格的魔力


2016年,我们了解(成熟)人类早已发明了SUM以外的功能。 并且可以使用表之间的脚本和数据导入功能来完成...直接CRM构建。

例如,要评估表中的每个比萨饼店都是一张纸,并在其中评估标准和得分。 1个比萨店= 1片叶子。 比萨店越多,床单越多。 每周都有新迹象。 通过按魔术按钮,表中的模板表扩展为120页。 哇,真好!



自动化“ Dodo控制”这一阶段耗时约六个月。 我们一步一步地前进:我们学到了新的东西-已实施,我们学到了新的东西-再次引入。

限制是进步的动力


从一开始,我们就代表VK中的个人帐户与神秘购物者进行了交谈。 然后是一天,我们面临着无法解决的个人页面问题:

  • 最多可容纳10,000个朋友;
  • 发送消息有一个限制:有时我们无法发送消息,因为VK用“您发送了太多消息,明天来”的字眼阻止了我们。

通常,VK禁止在16:00左右发送消息。 这是团队可以休息的快乐时光。

逐渐地,我们遇到了VK的几乎所有限制,并且几乎设法停止了对该网站的喜爱。 但是奇迹发生了,VK使这些小组有机会连接消息小部件,聊天机器人和其他东西。

实际上,这种可能性早于2016年12月,但对我们来说是一个关键限制:小组只能在从客户端发送最后一条消息之日起的10天内回复该消息。 当他们取消这一限制后,我们团队的生活开始焕发出新的色彩。 从那时起,我们就开始使用VK API和Google电子表格进行自动化。

用户脚本中的恐惧和厌恶


最初,为了成为一个神秘的购物者,您必须填写一张表格,然后向小组提出申请,为我们写一个密码并等待我们做出回应。 此等待可能持续长达48小时。 时间很长,注册后检查的欲望消失了。

有了新的知识储备,我们着手进行自动注册。

我们有几种API方法,一种形式,数十个表,一个登陆页面,一个PHP机器人程序,表中的脚本(由最酷的营销商Dodo和Dodo的第一任CFO亲自编写),数十种针对不同情况的消息模板。 然后我什至不知道这被称为用户脚本:

  1. 神秘购物者填写了调查表 (这是一个过时的版本,现在不起作用)。
  2. 表单中的数据首先落入数据库,然后落入表中。 该机器人首先打开数据库以检查有关概要文件的数据,因为该板在数万行中的响应超时很大,并且数据库很容易消化它。
  3. 在表格中填写调查表后,屏幕上出现一条消息:“谢谢您,仍然可以加入小组(链接)并输入代码词“ Sherlock””。
  4. 然后,神秘顾客发出了加入该团体的申请,并写了密码“ Sherlock”。 这个词是运行验证脚本的触发条件:
    -向数据库发送了一个请求,要求该代理按年龄划分是否适合我们;
    -如果是,则将该人添加到组中,并在候选人调查表对面的表格中注明“好/不好”状态;
    -更多数据绘制为青绿色,这很重要。 因此,以我的眼睛,更容易理解谁适合我们以及我们可以与谁说话。 剧本被涂成红色不合适的轮廓。
    -此外,秘密购买者被自动接受到组中,并且消息发送到聊天室,并带有进一步的步骤和说明。



这就是注册的自动化。 现在,整个过程几乎变得简单易懂。

此外,一切都像发条一样。 很明显,我们可以通过表将消息直接通过组消息发送到PM到秘密代理。



您只有46行代码!

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 = { //   http- "method" : "post", "header" : "Content-type: application/x-www-form-urlencoded", "payload" : payload, "muteHttpExceptions" : true, }; var jsonData = JSON.parse(UrlFetchApp.fetch("https://api.vk.com/method/messages.send", options).getContentText()); if (jsonData['error'] != undefined) { SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('K' + add).setValue("").setBackground("#ff0000"); } Logger.log(jsonData); var log = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Log'); var int = log.getRange('A1').getValue(); var d = new Date(); log.getRange('B' + int).setValue(d); log.getRange('C' + int).setValue(r[0] + ""); log.getRange('A1').setValue(int + 1); Utilities.sleep(400); }); } 

在表格中,我们生成了消息文本,并使用id页进行了个性化邮件发送。 我们也停止了手动复制和发送消息。 在高峰时间,我们可以使用表格在45分钟内发送多达3000条消息。 如果我们手工完成,那么我不会写这篇文章,而是会继续发送消息。

接下来,我举一个这样的奇迹平板电脑的例子。 我非常努力地制作出清晰且功能强大的UX / UI。 通过单击红色按钮,启动了邮件列表,并提出了进行秘密检查的建议。



更多功能可自动执行地狱过程


该公司拥有许多Google表单,可帮助我们不断地从比萨店收集一些指标。 每种形式都有一份比萨店清单,需要及时更新。 总共有53种此类表格,每个表格以前都是手动更新的。

厌倦了这项工作,我们意识到该业务可以自动化。 一两个小时后,我再次转向我们的营销人员,一切准备就绪,只有47行代码。

 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(); // Or DocumentApp or FormApp. ui.createMenu('Custom Menu') .addItem('Change', 'myFunction') .addToUi(); } function update() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var range = ss.getSheetByName(" ").getRange("A2:A"); range.activate(); myFunction(); } function createTimeDrivenTriggers() { ScriptApp.newTrigger('update').timeBased().everyDays(1).create(); } 

表单是不同的,比萨饼列表和表单中比萨饼列表的位置不同。 我们需要从俄罗斯来的外国。



B和C列告诉脚本以哪个表单更新以及表单显示在哪个位置。 列D和E,您需要从哪个工作表和范围中获取列表进行更新。

接下来,他们设置了触发器来每天运行一次脚本,因此能够克服首先为他们的部门,然后是整个公司的表单更新过程的麻烦。 该脚本仍然有效。

关于蜗牛最困难的情况


一旦我们想从交货支票接收录音。

录音来自哪里:神秘的购物者以VK中的语音消息形式记录了快递员与客户的会面。 通常,这是10-15秒的录音。

我们是如何获得它们的:他们在神秘购物者的VK地址上获取了最后20条消息,在其中找到单词“ Ulica”,然后退回一条消息并删除了指向录音的链接。 (破坏者:不是最好的词,通常他们给我们写了“蜗牛”这个词)。

已经有更多的代码行,请准备好。

 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 = { //   http- "method" : "post", "header" : "Content-type: application/x-www-form-urlencoded", "payload" : payload1, "muteHttpExceptions" : true }; var jsonData = JSON.parse(UrlFetchApp.fetch("https://api.vk.com/method/messages.search", options1).getContentText()); Logger.log(jsonData); if (jsonData['response']['items'] == undefined) { ss.getRange("B" + ri).setValue(' ').setBackground('#f00'); return; } var cmid = jsonData['response']['items'][0]['id']; var date = new Date((jsonData['response']['items'][0]['date']*1000)); var fdate = Utilities.formatDate(date, "GMT+3", "dd-MM-yyyy HH:mm:ss"); ss.getRange("B" + ri).setValue(fdate); var payload2 = { "user_id" : cuid, "count" : '20', "access_token" : token, "v" : "5.73", }; var options2 = { //   http- "method" : "post", "header" : "Content-type: application/x-www-form-urlencoded", "payload" : payload2, "muteHttpExceptions" : true }; var jsonData2 = JSON.parse(UrlFetchApp.fetch("https://api.vk.com/method/messages.getHistory", options2).getContentText()); Logger.log(jsonData2); jsonData2['response']['items'].forEach(function (r,i) { if (r['id'] == cmid) { ci = i + 1; Logger.log(jsonData2['response']['items'][ci]); if (jsonData2['response']['items'][ci] == undefined) { ss.getRange("C" + ri).setValue(" "); } else { if (jsonData2['response']['items'][ci] != undefined && jsonData2['response']['items'][ci]['attachments'] != undefined && jsonData2['response']['items'][ci]['attachments'][0]['doc'] != undefined && jsonData2['response']['items'][ci]['attachments'][0]['doc']['url'] != undefined) { ss.getRange("C" + ri).setValue(jsonData2['response']['items'][ci]['attachments'][0]['doc']['url']); } else { ss.getRange("C" + ri).setValue(jsonData2['response']['items'][ci]['body']); } } } }); }); } 

Google电子表格不是橡胶的,但我是一般的编码器


因此一切都在旋转,直到2018年初我们增长到6万名神秘购物者。

因此,我们已经遇到了表限制。 那么一张表最多可以包含200万个单元格,而我们在最繁忙的部门标签之一中使用了160万个单元格,其中13.5万个单元格具有各种表函数。

这样的后端。 一切都变得非常缓慢,当几个人一起工作时,盘子发出了“该文件太受欢迎,请稍后再回来”。

然后很明显,我的编码器性能很差,系统无法承受负载,需要更换。

然后真正的开发商来了...


但这是一个完全不同的故事,我们将在以后进行介绍。 我希望这些例子可以帮助经理们进行项目,因为那里有许多麻烦的过程。 流程可以并且应该是自动化的,表格和zapier(我们也曾使用过)都可以提供帮助,并且在有资源的情况下容纳解决方案,我们一开始就没有这些资源。

如果您公司中的某个人对脚本有所了解,那么他就适合在平板电脑中组织地狱过程。 如果您自己想学习类似的东西, Telegram有一个很好的渠道,我从中获取了有关函数和脚本的信息。

好吧,对所有管理人员来说都是标头-每天了解表都可以节省处理数据时的时间,并使您至少可以思考和理解开发人员对数据的处理方式以及对数据的一般处理方式。

Source: https://habr.com/ru/post/zh-CN472856/


All Articles