From 5de6ebe80b9e757db699887593862e1f084dd883 Mon Sep 17 00:00:00 2001 From: Dauren777 Date: Fri, 26 Jun 2026 08:00:41 +0000 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=20=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=BA=20=D0=BD=D0=B0=D0=BF=D1=80=D1=8F=D0=BC=D1=83?= =?UTF-8?q?=D1=8E=20=D0=B2=20Google=20=D0=A2=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=83=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Apps=20Script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/index.html b/index.html index 0487657..c622d35 100644 --- a/index.html +++ b/index.html @@ -339,9 +339,9 @@ footer a{color:var(--cyan);text-decoration:none;font-weight:600} -
Данные уходят через сервис FormSubmit. Первая отправка активируется по ссылке в письме владельцу сайта. Анализировать потом удобно в Google Таблицах: FormSubmit → экспорт в CSV.
+
Данные сохраняются напрямую в Google Таблицу владельца сайта. Анализ — сводными таблицами по возрастам, сферам и статусам. Имена и контакты детей не собираются.
-
Сбор данных скоро будет подключён. Владельцу сайта нужно указать email для получения результатов — после этого форма станет активной.
+
Сбор данных скоро будет подключён. Владельцу сайта нужно настроить приёмник (Google Таблицу) — после этого форма станет активной.
@@ -806,8 +806,8 @@ function render(){ render(); -/* ====== Сбор результатов через FormSubmit (без регистрации) ====== */ -const COLLECT_EMAIL = "tsai.e@amu.kz"; // ← email владельца сайта для получения результатов +/* ====== Сбор результатов в Google Таблицу (Apps Script веб-приложение) ====== */ +const SHEET_URL = "https://script.google.com/macros/s/AKfycbz0ohb-nons2KY4Y1JUzKB-FNeLpRz5J98v7XM6L5Ic_flUvkbeEyoYcC8jmHeyc220lA/exec"; const collectForm = document.getElementById('collectForm'); const collectOff = document.getElementById('collectOff'); const cEmail = document.getElementById('cEmail'); @@ -815,7 +815,7 @@ const cConsent = document.getElementById('cConsent'); const cSubmit = document.getElementById('cSubmit'); const cMsg = document.getElementById('cMsg'); -if(COLLECT_EMAIL){ +if(SHEET_URL){ collectForm.style.display = 'grid'; collectOff.style.display = 'none'; } else { @@ -823,11 +823,12 @@ if(COLLECT_EMAIL){ collectOff.style.display = 'block'; } -function buildPayload(){ +function buildSheetPayload(){ const block = DATA[currentAge]; - const res = {'Возраст': currentAge}; + const gotParts=[], missParts=[]; let total=0, done=0; - Object.keys(SPHERES).forEach(key=>{ + const out = {age: currentAge}; + ['phys','cogn','lang','socio'].forEach(key=>{ const items = block[key]||[]; let d=0; const got=[], miss=[]; items.forEach((it,i)=>{ @@ -837,38 +838,39 @@ function buildPayload(){ total+=items.length; done+=d; const p = items.length?Math.round(d/items.length*100):0; const st = p>=70?'Хорошо':(p>=40?'Осваивается':'Отстаёт'); - res['Сфера: '+SPHERES[key].name] = d+' / '+items.length+' ('+st+', '+p+'%)'; - res[SPHERES[key].name+' — освоено'] = got.join('; ')||'—'; - res[SPHERES[key].name+' — не освоено'] = miss.join('; ')||'—'; + out[key+'_done']=d; out[key+'_len']=items.length; out[key+'_st']=st; + if(got.length) gotParts.push(SPHERES[key].name+': '+got.join(', ')); + if(miss.length) missParts.push(SPHERES[key].name+': '+miss.join(', ')); }); const pct = total?Math.round(done/total*100):0; - const overall = pct>=70?'Развитие идёт хорошо':(pct>=40?'Некоторые навыки осваиваются':'Есть сферы, требующие внимания'); - res['Общий статус'] = overall+' ('+done+'/'+total+', '+pct+'%)'; - res['Дата отправки'] = new Date().toLocaleString('ru-RU'); - if(cEmail.value.trim()){ res['Email родителя (необязательно)'] = cEmail.value.trim(); } - return res; + out.pct = pct; + out.overall = pct>=70?'Развитие идёт хорошо':(pct>=40?'Некоторые навыки осваиваются':'Есть сферы, требующие внимания'); + out.got = gotParts.join(' | '); + out.miss = missParts.join(' | '); + out.email = cEmail.value.trim(); + return out; } cSubmit.onclick = async () => { - if(!COLLECT_EMAIL){ cMsg.textContent='Сбор данных ещё не подключён.'; cMsg.className='cmsg err'; return; } + if(!SHEET_URL){ cMsg.textContent='Приёмник данных не подключён.'; cMsg.className='cmsg err'; return; } let done=0; Object.keys(checked).forEach(k=>{ if(k.startsWith(currentAge+'|')&&checked[k]) done++; }); if(done===0){ cMsg.textContent='Сначала отметьте хотя бы один навык выше.'; cMsg.className='cmsg err'; return; } if(!cConsent.checked){ cMsg.textContent='Подтвердите согласие на обработку данных.'; cMsg.className='cmsg err'; return; } - const payload = buildPayload(); - payload._subject = 'Оценка развития ребёнка — '+currentAge; - payload._template = 'table'; - payload._captcha = 'false'; + const payload = buildSheetPayload(); cSubmit.disabled = true; cMsg.textContent='Отправляем…'; cMsg.className='cmsg'; try{ - const r = await fetch('https://formsubmit.co/ajax/'+encodeURIComponent(COLLECT_EMAIL), { + await fetch(SHEET_URL, { method:'POST', - headers:{'Content-Type':'application/json','Accept':'application/json'}, + mode:'no-cors', + headers:{'Content-Type':'text/plain;charset=utf-8'}, body: JSON.stringify(payload) }); - if(r.ok){ cMsg.textContent='✓ Спасибо! Результат отправлен.'; cMsg.className='cmsg ok'; cConsent.checked=false; } - else { cMsg.textContent='Не удалось отправить. Попробуйте позже.'; cMsg.className='cmsg err'; } - }catch(e){ cMsg.textContent='Нет связи с сервером. Проверьте интернет.'; cMsg.className='cmsg err'; } + cMsg.textContent='✓ Готово! Результат сохранён в таблицу.'; cMsg.className='cmsg ok'; + cConsent.checked=false; + }catch(e){ + cMsg.textContent='Нет связи. Проверьте интернет и попробуйте снова.'; cMsg.className='cmsg err'; + } cSubmit.disabled = false; };