сбор оценок напрямую в Google Таблицу через Apps Script
This commit is contained in:
parent
108542c504
commit
5de6ebe80b
54
index.html
54
index.html
@ -339,9 +339,9 @@ footer a{color:var(--cyan);text-decoration:none;font-weight:600}
|
||||
<button class="btn" id="cSubmit" type="button">Отправить результат</button>
|
||||
<span class="cmsg" id="cMsg"></span>
|
||||
</div>
|
||||
<div class="collect-priv">Данные уходят через сервис FormSubmit. Первая отправка активируется по ссылке в письме владельцу сайта. Анализировать потом удобно в Google Таблицах: FormSubmit → экспорт в CSV.</div>
|
||||
<div class="collect-priv">Данные сохраняются напрямую в Google Таблицу владельца сайта. Анализ — сводными таблицами по возрастам, сферам и статусам. Имена и контакты детей не собираются.</div>
|
||||
</div>
|
||||
<div class="collect-off" id="collectOff"><b>Сбор данных скоро будет подключён.</b> Владельцу сайта нужно указать email для получения результатов — после этого форма станет активной.</div>
|
||||
<div class="collect-off" id="collectOff"><b>Сбор данных скоро будет подключён.</b> Владельцу сайта нужно настроить приёмник (Google Таблицу) — после этого форма станет активной.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -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;
|
||||
};
|
||||
</script>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user