🍒
αK.27
Codage sémantique à fiabilité contrôlée

Connexion Google Sheets

Renseignez l'URL du Web App Apps Script déployé depuis votre Google Sheet pour synchroniser les codages en temps réel.

⚙ Code Apps Script à déployer
  1. Google Sheet → Extensions → Apps Script
  2. Remplacez tout le contenu par le code ci-dessous
  3. Déployer → Nouveau déploiement → App Web
  4. Exécuter en tant que : Moi · Accès : Tout le monde
  5. Copiez l'URL et collez-la ci-dessus
/* α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]||''
  }))};
}