Renseignez l'URL du Web App Apps Script déployé depuis votre Google Sheet pour synchroniser les codages en temps réel.
/* αK.27 - Codage sémantique à fiabilité contrôlée
Ferdinand Lamolet (2026) · MIT Licence */
const SS = SpreadsheetApp.getActiveSpreadsheet();
function doGet(e) {
const p = e.parameter; let r;
try {
switch(p.action) {
case 'ping': r={ok:true,msg:'αK.27 connecté'}; break;
case 'get_lexique': r=getLexique(); break;
case 'save_lexique': r=saveLexique(JSON.parse(decodeURIComponent(p.data))); break;
case 'append_lexique': r=appendLexique(JSON.parse(decodeURIComponent(p.data))); break;
case 'save_codage': r=saveCodage(JSON.parse(decodeURIComponent(p.data))); break;
case 'get_codages': r=getCodages(); break;
case 'save_resolution':r=saveResolution(JSON.parse(decodeURIComponent(p.data))); break;
case 'get_resolutions':r=getResolutions(); break;
default: r={ok:false,error:'action inconnue: '+p.action};
}
} catch(err){r={ok:false,error:err.toString()};}
return ContentService.createTextOutput(JSON.stringify(r))
.setMimeType(ContentService.MimeType.JSON);
}
function sh(name,headers){
let s=SS.getSheetByName(name);
if(!s){s=SS.insertSheet(name);s.appendRow(headers);}
return s;
}
function getLexique(){
const s=sh('AK27_Lexique',['id','inducteur','terme']);
const d=s.getDataRange().getValues();
if(d.length<=1)return{ok:true,terms:[]};
return{ok:true,terms:d.slice(1).map(r=>({id:r[0],inducteur:r[1],terme:r[2]}))};
}
function saveLexique(terms){
const s=sh('AK27_Lexique',['id','inducteur','terme']);
s.clearContents(); s.appendRow(['id','inducteur','terme']);
terms.forEach(t=>s.appendRow([t.id,t.inducteur,t.terme]));
return{ok:true};
}
function appendLexique(terms){
const s=sh('AK27_Lexique',['id','inducteur','terme']);
terms.forEach(t=>s.appendRow([t.id,t.inducteur,t.terme]));
return{ok:true};
}
function saveCodage(e){
sh('AK27_Codages',['timestamp','codeur','term_id','inducteur','terme','code','note'])
.appendRow([new Date().toISOString(),e.codeur,e.term_id,e.inducteur,e.terme,e.code,e.note||'']);
return{ok:true};
}
function getCodages(){
const s=SS.getSheetByName('AK27_Codages');
if(!s)return{ok:true,codings:[]};
const d=s.getDataRange().getValues();
if(d.length<=1)return{ok:true,codings:[]};
return{ok:true,codings:d.slice(1).map(r=>({
timestamp:r[0],codeur:r[1],term_id:r[2],inducteur:r[3],terme:r[4],code:r[5],note:r[6]||''
}))};
}
function saveResolution(e){
sh('AK27_Resolutions',['timestamp','term_id','inducteur','terme','code_final','note'])
.appendRow([new Date().toISOString(),e.term_id,e.inducteur,e.terme,e.code_final,e.note||'']);
return{ok:true};
}
function getResolutions(){
const s=SS.getSheetByName('AK27_Resolutions');
if(!s)return{ok:true,resolutions:[]};
const d=s.getDataRange().getValues();
if(d.length<=1)return{ok:true,resolutions:[]};
return{ok:true,resolutions:d.slice(1).map(r=>({
timestamp:r[0],term_id:r[1],inducteur:r[2],terme:r[3],code_final:r[4],note:r[5]||''
}))};
}