{"id":383556,"date":"2024-06-29T04:58:36","date_gmt":"2024-06-29T04:58:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=383556"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T04:58:36","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=383556","title":{"rendered":"<span>\u0413\u0443\u0433\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u0430\u043a \u0411\u0414 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0431\u043e\u0442\u0430 (\u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043f\u043e\u0441\u0442\u0430\u043c (<a href=\"https:\/\/habr.com\/en\/articles\/722952\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437 <\/a>\u0438 <a href=\"https:\/\/habr.com\/en\/articles\/725420\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0432\u0430<\/a>), \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u044b \u0438\u0437 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0430 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0433\u0443\u0433\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b \u0448\u0430\u0433\u0430 \u043d\u0430\u0437\u0430\u0434 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u043e\u0442\u0443 \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041b\u044e\u0431\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 json \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <em>\/start<\/em> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442  HTTP <code>POST<\/code> \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e (\u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442). \u0421\u043a\u0440\u0438\u043f\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Simple trigger<em> doPost(e)<\/em> \u0432\u0435\u0440\u043d\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u043a\u0430\u043a \u0432 \u0441\u043d\u0438\u043f\u0435\u0442\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<pre><code class=\"json\">{   update_id=2.96528127E8,    message={     text=\/start,      entities=[Ljava.lang.Object;@73afdadb,      message_id=116.0,      from={       first_name=Nadya,        language_code=ru,        is_bot=false,        username=brainwashed_from_rock,        id=3.11157431E8     },      date=1.680698505E9,      chat={       username=brainwashed_from_rock,        first_name=Nadya,        type=private,        id=3.11157431E8     }   } }<\/code><\/pre>\n<p><em>e<\/em> \u0432 <em>doPost(e)<\/em> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 event. \u0414\u0430\u043b\u0435\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a <a href=\"https:\/\/developers.google.com\/apps-script\/guides\/web\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u0438 \u0438\u0437\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f event. \u041d\u0430\u0445\u043e\u0434\u0438\u043c <code>e.postData.contents<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 json-\u043f\u0430\u043a\u0435\u0442\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c:<\/p>\n<pre><code class=\"javascript\">function doPost(e) {   const update = JSON.parse(e.postData.contents);   let msgData = {}   if (update.hasOwnProperty('message')) {     msgData = {       id         : update.message.message_id,       chat_id    : update.message.chat.id,       user_name  : update.message.from.username,       text       : update.message.text,       is_msg     : true     };   }   sendQuestions(msgData.chat_id); }<\/code><\/pre>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e update, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430. \u0414\u0430\u043b\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e \u043e\u0431\u044a\u0435\u043a\u0442 <em>msgData<\/em>, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 update \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e &#8216;<em>message<\/em>&#8216; \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0432 <em>msgData<\/em> \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <em>message<\/em> \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c <em>callback_data, edited_message, forwarded_message<\/em> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0435\u0439\u0441 \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0438\u0437 \u043d\u0438\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"json\">{   update_id=2.96528133E8,    callback_query={     id=1336410990935140117,      chat_instance=-2700514822492676651,      message={       text=Say my name...,        chat={         type=private,          username=brainwashed_from_rock,          id=3.11157431E8,          first_name=Nadya       },        message_id=121.0,        date=1.680698507E9,        from={         is_bot=true,          username=Testforpost_Bot,          id=2.077040493E9,          first_name=Test for post       },        reply_markup={         inline_keyboard=[Ljava.lang.Object;@39c491d8       }     },      data=\u0424\u0438\u043d\u043d \u043f\u0430\u0440\u043d\u0438\u0448\u043a\u0430,      from={       username=brainwashed_from_rock,        language_code=ru,        first_name=Nadya,        is_bot=false,        id=3.11157431E8     }   } }<\/code><\/pre>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0442\u043e\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>doPost(e)<\/em> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438:<\/p>\n<pre><code class=\"javascript\">function doPost(e) {   const update = JSON.parse(e.postData.contents);   let msgData = {}   if (update.hasOwnProperty('message')) {     msgData = {       id         : update.message.message_id,       chat_id    : update.message.chat.id,       user_name  : update.message.from.username,       text       : update.message.text,       date       : (update.message.date\/86400)+25569.125,       is_msg     : true     };   }    else if (update.hasOwnProperty('callback_query')) {     msgData = {       id         : update.callback_query.message.message_id,       chat_id    : update.callback_query.message.chat.id,       user_name  : update.callback_query.from.username,       first_name : update.callback_query.from.first_name,       text       : update.callback_query.message.text,       date       : (update.callback_query.message.date\/86400)+25569.125,       data       : update.callback_query.data,       is_button  : true     }      \/\/sendQuestions(msgData.chat_id); }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 <em>msgData<\/em> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0432\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0412 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b <em>is_msg<\/em> \u0438 <em>is_button<\/em>.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c.<\/p>\n<h2>\u041f\u043b\u0430\u043d \u043c\u0438\u043d\u0438\u043c\u0443\u043c<\/h2>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044e <em>doPost(e)<\/em> \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0438 \u0432\u044b\u0437\u043e\u0432\u0443 \u0432\u00a0\u043d\u0435\u0439 \u0432\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>dataHandler(msgData)<\/em>. \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0435\u0435 \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0432 \u043a\u0430\u043a\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 (event) \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c\u00a0\u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u043a\u043d\u043e\u043f\u043a\u0430.<\/p>\n<pre><code class=\"javascript\">function dataHandler(msgData) {   if (msgData.is_msg) {     sendQuestions(msgData.chat_id);   } else if (msgData.is_button) {     saveData(msgData)    } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u044b. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/216\/9fa\/2a9\/2169fa2a96ece0eafc1a84b80e409357.png\" width=\"907\" height=\"925\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/216\/9fa\/2a9\/2169fa2a96ece0eafc1a84b80e409357.png\"\/><\/figure>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 <em>saveData(msgData)<\/em>:<\/p>\n<pre><code class=\"javascript\">function saveData(msgData)\u00a0 {   const vals = [msgData.chat_id, msgData.user_name, msgData.text, msgData.data, msgData.date]   usersSheet.appendRow(vals) } <\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>vals<\/em> \u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u041d\u0430 \u043b\u0438\u0441\u0442 <em>usersSheet<\/em> \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <em>appendRow()<\/em> \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0435 \u0432\u044b\u0448\u0435 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b &#8212; \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>Answers<\/em> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 4 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0435\u043a\u0441\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u0430, \u0430 \u0435\u0433\u043e \u0438\u0434. \u041f\u043e\u043c\u0435\u043d\u044f\u044e \u0442\u0435\u043a\u0441\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0438\u0434.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/671\/85a\/b12\/67185ab12f2e79dd5fcaa9f51f2c1fc7.png\" width=\"498\" height=\"495\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/671\/85a\/b12\/67185ab12f2e79dd5fcaa9f51f2c1fc7.png\"\/><\/figure>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>sendQuestions(chat_id)<\/em> \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 <code>send(e[1], chat_id, keyboard)<\/code>\u043d\u0430\u043f\u0438\u0448\u0443 \u0434\u0432\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">const question = e[0]+'\/'+questionsArr.length+': '+e[1] send(question, chat_id, keyboard)<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 <em>msgData<\/em> \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>saveData(msgData)<\/em>:<\/p>\n<pre><code class=\"javascript\">function saveData(msgData)\u00a0 {   const vals = [msgData.chat_id, msgData.user_name, msgData.text[0], msgData.data, msgData.date]   usersSheet.appendRow(vals) }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430. \u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e2\/59d\/c5f\/9e259dc5f644f5498e325b4d9ad0d832.png\" width=\"902\" height=\"636\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e2\/59d\/c5f\/9e259dc5f644f5498e325b4d9ad0d832.png\"\/><\/figure>\n<p><em>*\u0415\u0441\u043b\u0438 \u0434\u0430\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u044f\u0447\u0435\u0435\u043a \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435.<\/em><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/287\/505\/a9e\/287505a9e5a0599a35b59e9740b299a0.png\" width=\"1068\" height=\"924\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/287\/505\/a9e\/287505a9e5a0599a35b59e9740b299a0.png\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u043c\u0443 \u0431\u043e\u0442\u0443 \u0438 \u0434\u0430\u0434\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u0438 \u043e\u043d \u0434\u0430\u043b \u043e\u0442\u0432\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/436\/a2f\/355\/436a2f355b7961f49fa8dd5aa9fad6bf.png\" width=\"861\" height=\"981\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/436\/a2f\/355\/436a2f355b7961f49fa8dd5aa9fad6bf.png\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0431\u043e\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043a\u043d\u043e\u043f\u043e\u043a, \u0430 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0443\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">function editMsg(msg, chat_id, msg_id, keyboard) {   const payload = {     'method': 'editMessageText',     'chat_id': String(chat_id),     'message_id': String(msg_id),     'text': msg,     'parse_mode': 'HTML'   }   if (keyboard) payload.reply_markup = JSON.stringify(keyboard)      const data = {     'method': 'post',     'payload': payload,     'muteHttpExceptions': true   }      UrlFetchApp.fetch('https:\/\/api.telegram.org\/bot' + token + '\/', data); }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <em>editMessageText<\/em>, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <em>text<\/em>, <em>chat_id<\/em> \u0438 <em>message_id<\/em>. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443.<\/p>\n<p><em>*\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f, \u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u0438\u0445 \u043f\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445.<\/em><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/599\/6ca\/499\/5996ca499992a78ecb17ebec00045211.png\" width=\"459\" height=\"464\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/599\/6ca\/499\/5996ca499992a78ecb17ebec00045211.png\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>editMessage(msgData)<\/em>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u043a\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0432 \u0438\u0445 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>answersArr,<\/em> \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<pre><code class=\"javascript\">function editMessage(msgData) {   const answersArr = answersSheet.getDataRange().getValues() }<\/code><\/pre>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <em>.filter()<\/em>, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"javascript\">const answersArr = answersSheet.getDataRange().getValues().filter(e => e[0] == msgData.text[0]);<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <em>answersArr<\/em> \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u0441 \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>curAnswerArr<\/em> \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0443:<\/p>\n<pre><code class=\"javascript\">const curAnswerArr = answersArr.find(e => e[1] == msgData.data);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u0443\u0436\u0435 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u0437 4\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u043e\u0434\u0438\u043d, \u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0432\u0435\u043d \u0442\u0435\u043a\u0441\u0442\u0443 \u0432 \u043a\u043d\u043e\u043f\u043a\u0435.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u044e \u0441\u0430\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0431\u044b\u043b \u043e\u0442\u0432\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442:<\/p>\n<pre><code class=\"javascript\">let newText = new String(); if (curAnswerArr[2]) newText = msgData.text + '\\n\\n\u2705Wow\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data; else newText = msgData.text + '\\n\\n\u274cNope\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data;<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u043f\u043b\u0430\u0448\u043a\u0443 TRUE, \u0442\u043e \u0432 \u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0433\u0430\u043b\u043e\u0447\u043a\u0443, \u0438\u043b\u0438 \u043a\u0440\u0435\u0441\u0442\u0438\u043a \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<p>\u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>editMsg()<\/em> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0438\u0434 \u0447\u0430\u0442\u0430, \u0438\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 null \u0434\u043b\u044f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b.<\/p>\n<pre><code class=\"javascript\">editMsg(newText,msgData.chat_id,msgData.id,null);<\/code><\/pre>\n<p>\u0412\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <em>saveData(msgData)<\/em>\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"javascript\">function editMessage(msgData) {   const answersArr = answersSheet.getDataRange().getValues().filter(e => e[0] == msgData.text[0]);   const curAnswerArr = answersArr.find(e => e[1] == msgData.data);    let newText = new String();   if (curAnswerArr[2]) newText = msgData.text + '\\n\\n\u2705Wow\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data;   else newText = msgData.text + '\\n\\n\u274cNope\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data;    editMsg(newText,msgData.chat_id,msgData.id, null); }<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e7e\/f07\/9b7\/e7ef079b7a07758d24ec94015b4cf3c8.png\" width=\"773\" height=\"514\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e7e\/f07\/9b7\/e7ef079b7a07758d24ec94015b4cf3c8.png\"\/><\/figure>\n<p>\u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u043f\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u043f\u0430\u043b\u0430, \u0442.\u043a. \u0432 <em>editMsg<\/em> \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 null.<\/p>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f. \u041c\u043e\u0436\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u0438\u0445 \u0441\u0442\u0430\u0440\u044b\u0445 \u043f\u043e\u0441\u0442\u043e\u0432 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 ? <\/p>\n<h2>\u041f\u043b\u0430\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c (advanced)<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e (\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439);<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441\u044b, \u043a\u0441\u0442\u0430\u0442\u0438, \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u044b, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043b\u043e\u0433\u0438\u043a \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0432\u0438\u0437\u0430. \u0413\u043e!<\/p>\n<p><em>*\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u043b\u0430 \u0434\u043e \u044d\u0442\u043e\u0433\u043e, \u0438\u043d\u0430\u0447\u0435 \u0447\u0442\u0438\u0432\u043e \u0437\u0430\u0442\u044f\u043d\u0435\u0442\u0441\u044f \u043d\u0430 \u0447\u0430\u0441\u044b. \u041f\u0440\u043e\u0448\u0443 \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u0440\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0447\u0438.<\/em><\/p>\n<p>\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0432\u0441\u0435 \u043a\u043b\u0438\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0438 \u043c\u043e\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/544\/0a3\/81b\/5440a381b36905590e4bc8c5d717ee38.png\" width=\"999\" height=\"924\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/544\/0a3\/81b\/5440a381b36905590e4bc8c5d717ee38.png\"\/><\/figure>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0432\u0438\u0437\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0442\u0440\u0430\u0436\u0430\u043b\u043e\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u043d\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u044b\u043b\u0430 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438. \u0418\u0437\u043c\u0435\u043d\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 Users \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043b\u043e\u043d\u043a\u0430 C \u0441\u0442\u0430\u043b\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439 <em>progress, <\/em>\u0447\u0442\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043a\u0432\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043e\u043a <em>E-H<\/em> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>*<em>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e Transpose \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u043a\u043e\u043b\u043e\u043d\u043e\u043a.<\/em><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/77e\/5a1\/744\/77e5a174467fd59238743561e8039ace.png\" width=\"1243\" height=\"360\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/77e\/5a1\/744\/77e5a174467fd59238743561e8039ace.png\"\/><\/figure>\n<h2>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e<\/h2>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0435\u0435 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u0432 <em>sendQuestion, <\/em>\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0430\u043c \u0435\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u044f \u0432\u044b\u043d\u0435\u0441\u0443 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>createKeyboard() <\/em>\u0438 \u043f\u043e\u043b\u0443\u0447\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"javascript\">function sendQuestion(msgData) {   const questionsArr = questionsSheet.getDataRange().getValues();    const questionArr = questionsArr.find(e => e[0] == '\u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430').flat();   const question = questionArr[0]+'\/'+questionsArr.length+': '  +questionArr[1];   const keyboard = createKeyboard(questionArr);   send(question, msgData.chat_id, keyboard)    \/\/const vals = [msgData.chat_id, msgData.user_name, 1, msgData.date]   \/\/usersSheet.appendRow(vals); }  function createKeyboard(questionArr) {   const answersArr = answersSheet.getDataRange().getValues();    let arr = answersArr.filter(el => el[0] == questionArr[0])   arr = arr.map(el => [{\"text\":el[1], \"callback_data\":el[1]}])    const keyboard = {     \"inline_keyboard\": arr   }    return keyboard }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438. \u041f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c <em>nextState <\/em>(\u043f\u043e\u043a\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0443\u0441\u043b\u043e\u0432\u043d\u043e) \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>sendQuestion(msgData, nextState) <\/em>\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043b\u0438 \u044d\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0438\u043b\u0438 \u043d\u0435\u0442<\/p>\n<pre><code class=\"javascript\">function sendQuestion(msgData, nextState) {   const questionsArr = questionsSheet.getDataRange().getValues();    if (nextState &lt;= questionsArr.length) {     const questionArr = questionsArr.find(e => e[0] == nextState).flat();     const question = questionArr[0]+'\/'+questionsArr.length+': '  +questionArr[1];     const keyboard = createKeyboard(questionArr);     send(question, msgData.chat_id, keyboard)   } else {     const msg = '\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e! \u041a\u0432\u0438\u0437 \u043f\u0440\u043e\u0439\u0434\u0435\u043d'     send(msg, msgData.chat_id, null)   } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c <em>nextState. <\/em>\u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u0438\u0434 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 1, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0438\u0434 + 1. \u0410 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043b\u0438 <em>progress,<\/em> \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0430\u043b \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>getRow(chat_id),<\/em> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0447\u0430\u0442 \u0438\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 usersSheet.<\/p>\n<pre><code class=\"javascript\">function getRow(chat_id) {   const usersArr = usersSheet.getDataRange().getValues();   const ind = usersArr.findIndex(e => e[0] == chat_id);    if (ind &lt; 0) return null   else {     const rowArr = usersArr[ind]     const rowMap = new Map();     rowMap.set('ind', rowInd)          return rowMap;   } }<\/code><\/pre>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <em>Map<\/em> \u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0442\u0443\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043b\u044e\u0447 &#8212; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u043f\u0430\u0440.<\/p>\n<p>\u0412 <em>rowMap<\/em> \u044f \u0432\u043d\u0435\u0441\u0443 \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u044e \u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430, \u0430 \u0441 \u043a\u043e\u043d\u0446\u0430, \u0442.\u043a. \u0441\u0430\u043c\u044b\u0439 &#171;\u0441\u0432\u0435\u0436\u0438\u0439&#187; \u0441\u0442\u0430\u0440\u0442 \u043a\u0432\u0438\u0437\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 .reverse().<\/p>\n<pre><code class=\"javascript\">function getRow(chat_id) {   const usersArr = usersSheet.getDataRange().getValues();   const headerUsersArr = usersArr.shift().flat();   usersArr.reverse();   const ind = usersArr.findIndex(e => e[0] == chat_id);    if (ind &lt; 0) return null   else {     const rowInd = usersArr.length - ind;     const rowArr = usersArr[ind]     const rowMap = new Map();     rowMap.set('ind', rowInd)     rowArr.forEach((e,i) => rowMap.set(headerUsersArr[i], e));      return rowMap;   } }<\/code><\/pre>\n<p><em>headerUsersArr <\/em>\u044d\u0442\u043e \u0448\u0430\u043f\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043e\u043a. \u0412 <em>rowMap<\/em> \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435: {username=&#187;brainwashed_from_rock&#187;, progress=1,&#8230;.}. \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441:<\/p>\n<pre><code class=\"javascript\">function getNextState(rowMap) {   const currentState = rowMap.get(\"progress\");   const nextState = Number(currentState) + 1;    return nextState }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u042f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u044e\u0437\u0435\u0440\u043d\u0435\u0439\u043c (\u0442.\u043a. \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u0441\u044f), \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u0438\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430, \u0434\u0430\u0442\u0443.<\/p>\n<pre><code class=\"javascript\">function setChatsVals(msgData, progress, rowMap) {   rowMap.set(\"username\", msgData.user_name);   rowMap.set(rowMap.get(\"progress\"), msgData.data);   rowMap.set(\"progress\", progress);   rowMap.set(\"date\", msgData.date);      const rowArr = new Array();   const iterator = rowMap.values();   rowMap.forEach(() => rowArr.push(iterator.next().value));    const ind = rowArr.shift();   usersSheet.getRange(ind+1,1,1,rowArr.length).setValues([rowArr]); }<\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442 <em>Map.<\/em><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u043c <em>dataHandler(msgData)<\/em> \u043f\u043e\u0434 \u043d\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443:<\/p>\n<pre><code class=\"javascript\">function dataHandler(msgData) {   if (msgData.is_msg) {     if (msgData.text == '\/start') {       saveData(msgData);       sendQuestion(msgData,nextState=1);     }   } else if (msgData.is_button) {     editMessage(msgData)     const rowMap = getRow(msgData.chat_id);     const nextState = getNextState(msgData, rowMap);     sendQuestion(msgData, nextState);     setChatsVals(msgData, nextState, rowMap);   } }<\/code><\/pre>\n<p>\u0411\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <em>\/start<\/em> \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0430\u0440\u0442, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441.<\/p>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b Users, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e. \u0418 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<h2>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0442\u0432\u0435\u0442\u0430<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u041f\u0440\u0438\u043c\u0435\u0440 \u0447\u0430\u0442\u0430 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/954\/2c7\/3ce\/9542c73ce281607a6fb95cbcfca123b8.png\" width=\"1730\" height=\"950\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/954\/2c7\/3ce\/9542c73ce281607a6fb95cbcfca123b8.png\"\/><\/figure>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043c <em>setChatsVals(msgData, progress, rowMap, flag)<\/em>:<\/p>\n<pre><code class=\"javascript\">function setChatsVals(msgData, progress, rowMap, flag) {   flag == 'is_button' ? rowMap.set(rowMap.get(\"progress\"), msgData.data) : rowMap.set(rowMap.get(\"progress\"), msgData.text);    rowMap.set(\"username\", msgData.user_name);   rowMap.set(\"progress\", progress);   rowMap.set(\"date\", msgData.date);      const rowArr = new Array()   const iterator = rowMap.values()   rowMap.forEach(() => rowArr.push(iterator.next().value))    const ind = rowArr.shift();   usersSheet.getRange(ind+1,1,1,rowArr.length).setValues([rowArr]) }<\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0444\u043b\u0430\u0433\u0430 \u043d\u0430 <em>is_button. <\/em>\u0415\u0441\u043b\u0438 \u0434\u0430, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c <em>dataHandler(msgData)<\/em>:<\/p>\n<pre><code class=\"javascript\">function dataHandler(msgData) {   const rowMap = getRow(msgData.chat_id);   if (msgData.is_msg) {     if (msgData.text == '\/start') {       saveData(msgData);       sendQuestion(msgData,nextState=1);     } else {       const nextState = getNextState(rowMap);       sendQuestion(msgData, nextState);       setChatsVals(msgData, nextState, rowMap, 'is_msg');     }   } else if (msgData.is_button) {     editMessage(msgData)     const nextState = getNextState(rowMap);     sendQuestion(msgData, nextState);     setChatsVals(msgData, nextState, rowMap, 'is_button');   } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 <em>is_msg <\/em> \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0430 \u0442\u0443\u0434\u0430 \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438. \u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435!<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u043e\u0441\u0442\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e &#171;\u0413\u0443\u0433\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u0430\u043a \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445&#187;, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u0438\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0433\u0443\u0433\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0447\u0430\u0442 \u0438 \u0438\u0437 \u0447\u0430\u0442\u0430 \u0432 \u0433\u0443\u0433\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<p>\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u043d\u0430 \u0432\u0430\u0448 \u0432\u043a\u0443\u0441 \u0438 \u0446\u0432\u0435\u0442, \u0432\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u044f\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. <a href=\"https:\/\/t.me\/Testforpost_Bot\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 <\/a>\u043d\u0430 \u043c\u043e\u0439 \u0431\u043e\u0442, \u0434\u043b\u044f \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0432\u0438\u0437\u0430. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043b\u043e\u0436\u0443 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043d\u043e\u043f\u043e\u043a.<\/p>\n<hr\/>\n<p>UPD: <a href=\"https:\/\/github.com\/nadezhda95\/Quiz_bot\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u0434<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/727248\/\"> https:\/\/habr.com\/ru\/articles\/727248\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043f\u043e\u0441\u0442\u0430\u043c (<a href=\"https:\/\/habr.com\/en\/articles\/722952\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437 <\/a>\u0438 <a href=\"https:\/\/habr.com\/en\/articles\/725420\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0432\u0430<\/a>), \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u044b \u0438\u0437 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0430 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0433\u0443\u0433\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b \u0448\u0430\u0433\u0430 \u043d\u0430\u0437\u0430\u0434 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u043e\u0442\u0443 \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041b\u044e\u0431\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 json \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <em>\/start<\/em> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442  HTTP <code>POST<\/code> \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e (\u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442). \u0421\u043a\u0440\u0438\u043f\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Simple trigger<em> doPost(e)<\/em> \u0432\u0435\u0440\u043d\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u043a\u0430\u043a \u0432 \u0441\u043d\u0438\u043f\u0435\u0442\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<pre><code class=\"json\">{   update_id=2.96528127E8,    message={     text=\/start,      entities=[Ljava.lang.Object;@73afdadb,      message_id=116.0,      from={       first_name=Nadya,        language_code=ru,        is_bot=false,        username=brainwashed_from_rock,        id=3.11157431E8     },      date=1.680698505E9,      chat={       username=brainwashed_from_rock,        first_name=Nadya,        type=private,        id=3.11157431E8     }   } }<\/code><\/pre>\n<p><em>e<\/em> \u0432 <em>doPost(e)<\/em> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 event. \u0414\u0430\u043b\u0435\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a <a href=\"https:\/\/developers.google.com\/apps-script\/guides\/web\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u0438 \u0438\u0437\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f event. \u041d\u0430\u0445\u043e\u0434\u0438\u043c <code>e.postData.contents<\/code> \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 json-\u043f\u0430\u043a\u0435\u0442\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c:<\/p>\n<pre><code class=\"javascript\">function doPost(e) {   const update = JSON.parse(e.postData.contents);   let msgData = {}   if (update.hasOwnProperty('message')) {     msgData = {       id         : update.message.message_id,       chat_id    : update.message.chat.id,       user_name  : update.message.from.username,       text       : update.message.text,       is_msg     : true     };   }   sendQuestions(msgData.chat_id); }<\/code><\/pre>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e update, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430. \u0414\u0430\u043b\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e \u043e\u0431\u044a\u0435\u043a\u0442 <em>msgData<\/em>, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 update \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e &#8216;<em>message<\/em>&#8216; \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0432 <em>msgData<\/em> \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <em>message<\/em> \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c <em>callback_data, edited_message, forwarded_message<\/em> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0435\u0439\u0441 \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0438\u0437 \u043d\u0438\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"json\">{   update_id=2.96528133E8,    callback_query={     id=1336410990935140117,      chat_instance=-2700514822492676651,      message={       text=Say my name...,        chat={         type=private,          username=brainwashed_from_rock,          id=3.11157431E8,          first_name=Nadya       },        message_id=121.0,        date=1.680698507E9,        from={         is_bot=true,          username=Testforpost_Bot,          id=2.077040493E9,          first_name=Test for post       },        reply_markup={         inline_keyboard=[Ljava.lang.Object;@39c491d8       }     },      data=\u0424\u0438\u043d\u043d \u043f\u0430\u0440\u043d\u0438\u0448\u043a\u0430,      from={       username=brainwashed_from_rock,        language_code=ru,        first_name=Nadya,        is_bot=false,        id=3.11157431E8     }   } }<\/code><\/pre>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0442\u043e\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>doPost(e)<\/em> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438:<\/p>\n<pre><code class=\"javascript\">function doPost(e) {   const update = JSON.parse(e.postData.contents);   let msgData = {}   if (update.hasOwnProperty('message')) {     msgData = {       id         : update.message.message_id,       chat_id    : update.message.chat.id,       user_name  : update.message.from.username,       text       : update.message.text,       date       : (update.message.date\/86400)+25569.125,       is_msg     : true     };   }    else if (update.hasOwnProperty('callback_query')) {     msgData = {       id         : update.callback_query.message.message_id,       chat_id    : update.callback_query.message.chat.id,       user_name  : update.callback_query.from.username,       first_name : update.callback_query.from.first_name,       text       : update.callback_query.message.text,       date       : (update.callback_query.message.date\/86400)+25569.125,       data       : update.callback_query.data,       is_button  : true     }      \/\/sendQuestions(msgData.chat_id); }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 <em>msgData<\/em> \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0432\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0412 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b <em>is_msg<\/em> \u0438 <em>is_button<\/em>.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435 \u0432\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c.<\/p>\n<h2>\u041f\u043b\u0430\u043d \u043c\u0438\u043d\u0438\u043c\u0443\u043c<\/h2>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044e <em>doPost(e)<\/em> \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0438 \u0432\u044b\u0437\u043e\u0432\u0443 \u0432\u00a0\u043d\u0435\u0439 \u0432\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>dataHandler(msgData)<\/em>. \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0435\u0435 \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0432 \u043a\u0430\u043a\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 (event) \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c\u00a0\u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u043a\u043d\u043e\u043f\u043a\u0430.<\/p>\n<pre><code class=\"javascript\">function dataHandler(msgData) {   if (msgData.is_msg) {     sendQuestions(msgData.chat_id);   } else if (msgData.is_button) {     saveData(msgData)    } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0443, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u044b. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 <em>saveData(msgData)<\/em>:<\/p>\n<pre><code class=\"javascript\">function saveData(msgData)\u00a0 {   const vals = [msgData.chat_id, msgData.user_name, msgData.text, msgData.data, msgData.date]   usersSheet.appendRow(vals) } <\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>vals<\/em> \u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u041d\u0430 \u043b\u0438\u0441\u0442 <em>usersSheet<\/em> \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <em>appendRow()<\/em> \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0435 \u0432\u044b\u0448\u0435 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b &#8212; \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <em>Answers<\/em> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 4 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0435\u043a\u0441\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u0430, \u0430 \u0435\u0433\u043e \u0438\u0434. \u041f\u043e\u043c\u0435\u043d\u044f\u044e \u0442\u0435\u043a\u0441\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0438\u0434.<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>sendQuestions(chat_id)<\/em> \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 <code>send(e[1], chat_id, keyboard)<\/code>\u043d\u0430\u043f\u0438\u0448\u0443 \u0434\u0432\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">const question = e[0]+'\/'+questionsArr.length+': '+e[1] send(question, chat_id, keyboard)<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 <em>msgData<\/em> \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>saveData(msgData)<\/em>:<\/p>\n<pre><code class=\"javascript\">function saveData(msgData)\u00a0 {   const vals = [msgData.chat_id, msgData.user_name, msgData.text[0], msgData.data, msgData.date]   usersSheet.appendRow(vals) }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0447\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430. \u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><em>*\u0415\u0441\u043b\u0438 \u0434\u0430\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u044f\u0447\u0435\u0435\u043a \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435.<\/em><\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u043c\u0443 \u0431\u043e\u0442\u0443 \u0438 \u0434\u0430\u0434\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u0438 \u043e\u043d \u0434\u0430\u043b \u043e\u0442\u0432\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0431\u043e\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043a\u043d\u043e\u043f\u043e\u043a, \u0430 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0443\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">function editMsg(msg, chat_id, msg_id, keyboard) {   const payload = {     'method': 'editMessageText',     'chat_id': String(chat_id),     'message_id': String(msg_id),     'text': msg,     'parse_mode': 'HTML'   }   if (keyboard) payload.reply_markup = JSON.stringify(keyboard)      const data = {     'method': 'post',     'payload': payload,     'muteHttpExceptions': true   }      UrlFetchApp.fetch('https:\/\/api.telegram.org\/bot' + token + '\/', data); }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <em>editMessageText<\/em>, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <em>text<\/em>, <em>chat_id<\/em> \u0438 <em>message_id<\/em>. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443.<\/p>\n<p><em>*\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f, \u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 \u0438\u0445 \u043f\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445.<\/em><\/p>\n<figure class=\"\"><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>editMessage(msgData)<\/em>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u043a\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0432 \u0438\u0445 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>answersArr,<\/em> \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<pre><code class=\"javascript\">function editMessage(msgData) {   const answersArr = answersSheet.getDataRange().getValues() }<\/code><\/pre>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <em>.filter()<\/em>, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"javascript\">const answersArr = answersSheet.getDataRange().getValues().filter(e => e[0] == msgData.text[0]);<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <em>answersArr<\/em> \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u0441 \u0438\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>curAnswerArr<\/em> \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0443:<\/p>\n<pre><code class=\"javascript\">const curAnswerArr = answersArr.find(e => e[1] == msgData.data);<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u0443\u0436\u0435 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u0437 4\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u043e\u0434\u0438\u043d, \u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0432\u0435\u043d \u0442\u0435\u043a\u0441\u0442\u0443 \u0432 \u043a\u043d\u043e\u043f\u043a\u0435.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u044e \u0441\u0430\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0431\u044b\u043b \u043e\u0442\u0432\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442:<\/p>\n<pre><code class=\"javascript\">let newText = new String(); if (curAnswerArr[2]) newText = msgData.text + '\\n\\n\u2705Wow\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data; else newText = msgData.text + '\\n\\n\u274cNope\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data;<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u043f\u043b\u0430\u0448\u043a\u0443 TRUE, \u0442\u043e \u0432 \u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0433\u0430\u043b\u043e\u0447\u043a\u0443, \u0438\u043b\u0438 \u043a\u0440\u0435\u0441\u0442\u0438\u043a \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<p>\u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>editMsg()<\/em> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0438\u0434 \u0447\u0430\u0442\u0430, \u0438\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 null \u0434\u043b\u044f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b.<\/p>\n<pre><code class=\"javascript\">editMsg(newText,msgData.chat_id,msgData.id,null);<\/code><\/pre>\n<p>\u0412\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <em>saveData(msgData)<\/em>\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"javascript\">function editMessage(msgData) {   const answersArr = answersSheet.getDataRange().getValues().filter(e => e[0] == msgData.text[0]);   const curAnswerArr = answersArr.find(e => e[1] == msgData.data);    let newText = new String();   if (curAnswerArr[2]) newText = msgData.text + '\\n\\n\u2705Wow\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data;   else newText = msgData.text + '\\n\\n\u274cNope\\n\u0422\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442: '+msgData.data;    editMsg(newText,msgData.chat_id,msgData.id, null); }<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u043f\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u043f\u0430\u043b\u0430, \u0442.\u043a. \u0432 <em>editMsg<\/em> \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 null.<\/p>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u0434\u043b\u044f<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-383556","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=383556"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383556\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=383556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=383556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=383556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}