كيف أنشأت خدمة مراقبة الجودة من الجداول والعصي

مرحبا يا هبر! في كثير من الأحيان ، عند التفكير في إطلاق برنامج تجريبي ، يبدأ المديرون في تعقيد الموقف وإنشاء خرائط طريق وانتظر MVP من المطورين ، بدلاً من أخذ واختبار الفكرة بأنفسهم. في إطار الخفض ، أريد أن أشارك قصة إنشاء خدمة لمراقبة الجودة تعتمد على نماذج Google و VK وعشرات سطور التعليمات البرمجية ، والتي لم يصب فيها أي مطور ، مسوق واحد فقط.



إخلاء المسئولية : في هذا المقال ، أنتظر أمثلة على الكود الذي سوف يسبب لك أسئلة ، وشكوك ، وربما حتى الدموع والعمى. لتبرير ذلك ، لا يوجد سوى شيء واحد يمكن قوله - هذا الرمز يعمل مثل بابا كارلو ، وقد أنجز مهمته بنسبة 100 ٪ ، ولا تزال بعض النصوص تعمل.

أول تصنيف دودو بيتزا


أحد المبادئ الرئيسية لشركتنا - التي لا يمكن قياسها ، غير موجودة . البيتزا موجودة ، مما يعني أنك تحتاج إلى تقييم نوعيته بطريقة أو بأخرى.

بدأ كل شيء في عام 2013. في ذلك الوقت ، كان هناك 7 مطاعم بيتزا على الشبكة. ثم قرروا في Dodo إطلاق مشروع للتحكم في جودة المنتج ومعاييره - تصنيف مطاعم البيتزا مفتوحة لجميع الشركاء.

لقد بدا هكذا.



تم أخذ البيانات من مكالمات العملاء والتعليقات في الاجتماعية. شبكات وقليلا من Dodo IS (نظام المعلومات لدينا).

ميزة إضافية واضحة في ذلك الوقت - بدأ التقييم في دفع مطاعم البيتزا لإدارة الجودة لتكون في المقدمة.

الغموض الثاني متجر البيتزا


بعد حوالي عام ، أدركنا أننا بحاجة إلى تقييم المنتج نفسه وأخذنا النموذج الشهير - "المتسوقين السريين". في تلك اللحظة ، حققنا طفرة - قرر الأول في روسيا أن عملائنا سيكونون المتسوقين السريين.

ظهور مجموعة مغلقة VK


في البداية ، اكتشفنا كيف يتعاملون مع المتسوقين السريين في الوكالات التي تقدم مثل هذه الخدمات. اتضح أنهم يتواصلون عبر البريد الإلكتروني أو الاتصال مباشرة لتقديم التحقق.

هذا الخيار لم يغوي لنا على الفور. بالتأكيد لن نتصل به ، لأنه كان بالنسبة لنا وقتاً طويلاً ، لكن بالنسبة للعميل كان الأمر مؤلماً وعلى قدم المساواة مع البريد المزعج. تم استخدام البريد للبريد الجماعي ، ولكن تم التخلي عنها قريبا.

لقد توصلنا إلى:

  1. للتواصل مع العملاء السريين وتنسيق الشيكات ، استخدموا الصفحة المعتادة في VK.
  2. لجمع تقارير الصور ، قاموا بإنشاء مجموعة في VK بجدار مفتوح.
  3. وبالنسبة لاستطلاعات الخدمة ، اخترنا نماذج Google. ماذا؟ مريح ، لا تحتاج إلى قطع خدمة منفصلة ، ويتم عرضها بشكل جيد على الهاتف المحمول.
  4. كانت جميع التعليمات في محرّر مستندات Google.

كل شيء على الركبة. كل شيء كما يجب أن يكون لبدء التشغيل.


صورة من المتسوق السري. نعم ، قاموا بقياس العرض باستخدام مسطرة ، وقطعوا حافة البيتزا لإظهار العجين ونوعية العجين.

المزيد من الأمثلة من تقارير الصور من عام 2015 هنا.





كان التصنيف يتغير باستمرار ، وأضيفت معايير تقييم جديدة. على سبيل المثال ، هذه هي 131 نقطة لتقييم مطعم Abakan-1 للبيتزا.



كانت عملية الجحيم برمتها هي أن جميع الانتهاكات في النقاط قد لوحظت يدويًا ، ولا توجد عمليات تشغيل تلقائي. وقد تم كل هذا من قبل موظف واحد.

سحر جداول جوجل


في عام 2016 ، علمنا (نضج) أن الإنسانية قد اخترعت وظائفًا طويلة بخلاف = SUM. وما الذي يمكن عمله باستخدام البرامج النصية ووظائف استيراد البيانات بين الجداول ... إنشاء CRM المباشر.

على سبيل المثال ، لتقييم كل بيتزا في الجدول كان ورقة ، وفيه معايير التقييم وعشرات. 1 بيتزا = ورقة واحدة. لمزيد من البيتزا ، والمزيد من الأوراق. كل أسبوع علامة جديدة. بالضغط على الزر السحري ، تم توسيع ورقة القالب في الجدول إلى 120 ورقة. واه ، كيف جيدة!



استغرقت هذه المرحلة من التشغيل الآلي "Dodo Controlling" حوالي ستة أشهر. انتقلنا خطوة بخطوة: تعلمنا شيئًا جديدًا - تم تنفيذه ، وتعلمنا شيئًا جديدًا - تم تقديمه مرة أخرى.

القيد كدافع للتقدم


منذ البداية ، تحدثنا مع المتسوقين الغامض نيابة عن حساب شخصي في VK. ثم جاء اليوم الذي واجهنا فيه مشكلات غير قابلة للحل للصفحات الشخصية:

  • يوجد حد 10،000 صديق.
  • هناك حدود لإرسال الرسائل: في بعض الأحيان لم نتمكن من إرسال الرسائل ، لأن VK منعتنا من صياغة "لقد أرسلت الكثير من الرسائل ، تعال غدًا".

عادةً ما يمنع VK إرسال الرسائل حوالي الساعة 16:00. لقد كانت ساعة سعيدة عندما تمكن الفريق من الراحة.

تدريجيا ، واجهنا تقريبا جميع القيود المفروضة على VK ونجحنا في التوقف عن حب هذا الموقع. ولكن حدثت معجزة ، وأعطت VK الفرصة للمجموعات لربط عناصر واجهة تعامل الرسائل وبرامج الروبوت وغيرها من الأشياء الجيدة.

في الواقع ، كان هذا الاحتمال أقدم من كانون الأول (ديسمبر) 2016 ، لكن مع وجود قيود حرجة بالنسبة لنا: لا يمكن للمجموعة الرد على الرسالة إلا في غضون 10 أيام من لحظة إرسال آخر رسالة من العميل. عندما أزالوا هذا التقييد ، بدأت حياة فريقنا تتألق بألوان جديدة. منذ ذلك الحين ، بدأنا مسار الأتمتة باستخدام VK API وجداول بيانات Google.

الخوف والكراهية في البرنامج النصي للمستخدم


في البداية ، لكي تصبح متسوقًا للغموض ، كان عليك تعبئة نموذج ، ثم التقدم إلى المجموعة ، وكتابة كلمة مرور لنا ، وانتظر الرد. قد يستمر هذا الانتظار حتى 48 ساعة. لقد كانت فترة طويلة غير لائقة وتلاشت الرغبة في إجراء عمليات تفتيش بعد هذا التسجيل.

مع مخزن جديد للمعرفة ، بدأنا في أتمتة التسجيل.

كان لدينا العديد من أساليب واجهة برمجة التطبيقات ، نموذج واحد ، وعشرات الجداول ، صفحة مقصودة ، روبوت في PHP ، نصوص برمجية في الجدول كتبها أروع المسوق Dodo وأول مسؤول مالي في Dodo في شخص واحد ، وعشرات قوالب الرسائل لحالات مختلفة. ثم لم أكن أعرف حتى أن هذا كان يسمى برنامج نصي للمستخدم:

  1. قام المتسوق الخفي بملء استبيان (هذا إصدار قديم والآن لا يعمل).
  2. سقطت البيانات من النموذج أولاً في قاعدة البيانات ، ثم في الجدول. طرق الروبوت أولاً في قاعدة البيانات للتحقق من البيانات المتعلقة بالملف الشخصي ، لأن مهلة الاستجابة للوحة في عشرات الآلاف من الخطوط كانت كبيرة ، وقاعدة البيانات هضمها بسهولة).
  3. بعد ملء الاستبيان في النموذج ، ظهرت رسالة على الشاشة: "شكرًا لك ، يبقى الانضمام إلى المجموعة (الرابط) وكتابة كلمة المرور" Sherlock ".
  4. ثم أرسل المتسوق السري طلبًا للانضمام إلى المجموعة وكتب كلمة المرور "Sherlock". كانت الكلمة هي المشغل لتشغيل برنامج التحقق من الصحة:
    - تم إرسال طلب إلى قاعدة البيانات ما إذا كان الوكيل مناسبًا لنا حسب العمر ؛
    - إذا كان الأمر كذلك ، فقد تمت إضافة الشخص إلى المجموعات ، وفي الجدول المقابل لاستبيان المرشح ، تم إلغاء الحالة "ok / not ok" ؛
    - تم رسم المزيد من البيانات بلون الفيروز وكان من المهم. لذلك كان من السهل على عيني فهم من يناسبنا ومن نتحدث معه. البرنامج النصي رسمت ملامح غير مناسبة الحمراء.
    - علاوة على ذلك ، تم قبول المشتري السري تلقائيًا في المجموعة ، وتم إرسال رسالة إلى الدردشة مع مزيد من الخطوات والتعليمات.



هذا هو أتمتة التسجيل. الآن أصبح الإجراء بأكمله بسيطًا ومفهومًا تقريبًا.

علاوة على ذلك ، ذهب كل شيء كالساعة. أصبح من الواضح أنه يمكننا إرسال الرسائل من خلال الجداول مباشرة إلى 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); }); } 

في الجداول ، أنشأنا نص الرسائل وقمنا بإرسال بريد شخصي باستخدام صفحة المعرف. لقد توقفنا أيضًا عن نسخ الرسائل وإرسالها يدويًا. في أوقات الذروة ، يمكننا إرسال ما يصل إلى 3000 رسالة في 45 دقيقة باستخدام الجداول. إذا فعلنا ذلك باليد ، فلن أكتب هذه المقالة ، لكنني سأواصل إرسال الرسائل.

بعد ذلك ، أعطي مثالاً على هذا الجهاز اللوحي المعجزة. حاولت بجد جعل 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 ثانية من التسجيل الصوتي.

كيف حصلنا عليها: أخذوا آخر 20 رسالة على عنوان VK للمتسوقين السريين ، وبحثوا عن كلمة "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 ليست مطاطية ، لكنني مشفر جدًا


لذلك كان كل شيء يدور بسرعة وغزل ، حتى نشأنا ما يصل إلى 60 ألف متسوق من الألغاز بحلول بداية عام 2018.

لذلك ، لقد واجهنا بالفعل قيود الجدول. ثم لا يمكن أن يحتوي جدول واحد على أكثر من مليوني خلية ، وقد استخدمنا 1.6 مليون خلية في واحدة من أكثر علامات الدوائر نشاطًا ، منها 135 ألف خلية بها جميع أنواع وظائف الجدول.

هذه الخلفية. تباطأ كل شيء بشكل رهيب وعندما عمل العديد من الناس معا ، أعطت اللوحة "الوثيقة تحظى بشعبية كبيرة ، والعودة في وقت لاحق."

ثم أصبح من الواضح أنني برنامج تشفير سيئ ، فالنظام لا يحمل العبء وأحتاج إلى استبداله.

ثم جاء المطور الحقيقي ...


لكن هذه قصة مختلفة تمامًا وسوف نكتب عنها لاحقًا. آمل أن تساعد هذه الأمثلة المديرين في مشاريعهم ، حيث توجد العديد من العمليات الجهنمية. يمكن ويجب أن تكون العمليات تلقائية ، يمكن أن تساعد كل من الجداول و zapier (استخدمناها أيضًا) ، وإذا كانت هناك موارد ، لم تكن هناك حلول منزلية في البداية.

إذا كان لديك شخص في الشركة يعرف شيئًا عن البرامج النصية ، فهو مناسب لتنظيم عمليات الجحيم في الأجهزة اللوحية. إذا كنت تريد أن تتعلم شيئًا من هذا القبيل ، فإن Telegram لديها قناة ممتازة لهذا ، والتي أخذت منها معلومات حول الوظائف والبرامج النصية.

حسنًا ، التسمية الرئيسية لجميع المديرين - إن معرفة الجداول يوميًا يوفر الوقت عند العمل مع البيانات ويسمح لك بالتفكير وفهم ما لا يقل عن القليل مما يفعله المطور بالبيانات وما يمكنك القيام به بالبيانات بشكل عام.

Source: https://habr.com/ru/post/ar472856/


All Articles