VeritasOS
πŸ§ͺ Demo Gratuita Soluzione Prezzi API Docs ⚑ Integrazioni Blog Security Verifica Certificato πŸ”‘ Accedi
πŸš€ Inizia il Trial Gratuito
GOOGLE DOCS Β· APPS SCRIPT

VeritasOS direttamente in Google Docs

Valida e certifica i tuoi documenti legali direttamente da Google Docs, senza uscire dall'editor. Analisi AI + certificato RFC 3161 in pochi secondi.

⚠️
Prima di iniziare β€” Verifica il tuo account Google
Account Gmail personale (@gmail.com): Apps Script funziona normalmente. Puoi installare l'estensione senza problemi.

Account Google Workspace aziendale (@tuaazienda.it): L'amministratore del dominio potrebbe aver disabilitato Apps Script. Se non vedi "Estensioni β†’ Apps Script" nel menu di Google Docs, contatta il tuo IT admin per abilitarlo su admin.google.com β†’ App β†’ Google Workspace β†’ Drive e Documenti.

Nota: La funzione "Pubblica come estensione" (Add-on ufficiale su Workspace Marketplace) richiede un account sviluppatore Google a pagamento. Il metodo Apps Script descritto qui funziona gratuitamente su qualsiasi account.
πŸ”‘
Cosa ti serve
Un account VeritasOS attivo (trial o abbonamento) e la tua API Key dalla Dashboard β†’ API Keys.

Installazione
5 passi per installare l'estensione
L'installazione richiede circa 3 minuti. Non serve installare nulla sul computer.
1

Apri Google Docs e vai in Apps Script

Apri qualsiasi documento Google Docs. Dal menu in cima clicca Estensioni β†’ Apps Script. Si aprirΓ  una nuova scheda con l'editor di codice.

2

Cancella il contenuto esistente e incolla il codice

Nell'editor Apps Script vedrai del codice di esempio. Seleziona tutto (Ctrl+A) e cancella. Poi incolla il codice qui sotto:

// VeritasOS β€” Plugin Google Docs v3
// Installazione: incolla questo codice in Apps Script, salva, esegui onOpen

var VERITAS_API_URL = 'https://veritas-os.it/api/v1/validate';
var API_KEY_PROP    = 'VERITAS_API_KEY';

function onOpen() {
  DocumentApp.getUi()
    .createMenu('πŸ” VeritasOS')
    .addItem('βœ… Valida questo documento', 'validateDocument')
    .addSeparator()
    .addItem('πŸ“‹ Ultimo risultato', 'showLastResult')
    .addItem('βš™οΈ Imposta API Key', 'showSettings')
    .addToUi();
}

function saveApiKey(key) {
  if (!key || key.trim() === '') return 'error:empty';
  PropertiesService.getUserProperties().setProperty(API_KEY_PROP, key.trim());
  return 'ok';
}

function getApiKey() {
  return PropertiesService.getUserProperties().getProperty(API_KEY_PROP) || '';
}

function validateDocument() {
  var apiKey = PropertiesService.getUserProperties().getProperty(API_KEY_PROP);
  if (!apiKey) { showSettings(); return; }
  var doc  = DocumentApp.getActiveDocument();
  var text = doc.getBody().getText();
  if (text.trim().length < 20) {
    DocumentApp.getUi().alert('Documento troppo corto', 'Aggiungi almeno 20 caratteri.', DocumentApp.getUi().ButtonSet.OK);
    return;
  }
  showSidebar('loading', null);
  try {
    var response = UrlFetchApp.fetch(VERITAS_API_URL, {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify({ text: text.substring(0, 8000), filename: doc.getName() + '.txt' }),
      muteHttpExceptions: true,
      headers: { 'Authorization': 'Bearer ' + apiKey }
    });
    var code = response.getResponseCode();
    var rawText = response.getContentText();
    Logger.log('VeritasOS HTTP ' + code + ': ' + rawText.substring(0, 300));
    var result;
    try { result = JSON.parse(rawText); }
    catch(e) { showSidebar('error', {message: 'Risposta non valida (HTTP ' + code + ')'}); return; }
    if (!result.success) { showSidebar('error', {message: result.error || 'Errore (HTTP ' + code + ')'}); return; }
    PropertiesService.getDocumentProperties().setProperty('LAST_RESULT', JSON.stringify(result));
    showSidebar('result', result);
  } catch(e) { showSidebar('error', {message: 'Errore di rete: ' + e.message}); }
}

function showSidebar(type, data) {
  var html;
  if (type === 'result') html = buildResultHtml(data);
  else if (type === 'error') html = buildErrorHtml(data.message);
  else if (type === 'loading') html = buildLoadingHtml();
  else if (type === 'settings') html = buildSettingsHtml(data || '');
  DocumentApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle('VeritasOS').setWidth(300));
}

function showLoading()   { showSidebar('loading', null); }
function showSettings()  { showSidebar('settings', getApiKey()); }
function showLastResult() {
  var stored = PropertiesService.getDocumentProperties().getProperty('LAST_RESULT');
  if (!stored) { DocumentApp.getUi().alert('Nessun risultato', 'Clicca prima "Valida".', DocumentApp.getUi().ButtonSet.OK); return; }
  showSidebar('result', JSON.parse(stored));
}

function buildLoadingHtml() {
  return '<div style="font-family:Arial,sans-serif;padding:24px;text-align:center;">' +
    '<div style="font-size:36px;margin-bottom:16px;">⏳</pre></div>' +
    '<div style="font-size:15px;font-weight:bold;color:#1a1a2e;margin-bottom:8px;">Validazione in corso…</div>' +
    '<div style="font-size:13px;color:#666;">Analisi EU AI Act Β· GDPR Β· RFC 3161</div></div>';
}

function buildSettingsHtml(currentKey) {
  return '<!DOCTYPE html><html><body style="padding-top:72px;">' +
    '<div style="font-size:15px;font-weight:bold;color:#1a1a2e;margin-bottom:4px;">βš™οΈ API Key</div>' +
    '<div style="font-size:12px;color:#888;margin-bottom:14px;">Trovala su <a href="https://veritas-os.it/dashboard/apikeys.php" target="_blank" style="color:#00BFA5;">Dashboard β†’ API Keys</a></div>' +
    '<input id="k" type="text" placeholder="vrt_live_sk_..." value="' + currentKey + '" style="width:100%;padding:10px;border:1px solid #ddd;border-radius:6px;font-size:12px;font-family:monospace;box-sizing:border-box;">' +
    '<div id="err" style="display:none;color:#E84855;font-size:12px;margin-top:6px;"></div>' +
    '<button id="btn" onclick="doSave()" style="width:100%;margin-top:10px;padding:11px;background:#00BFA5;color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:bold;cursor:pointer;">πŸ’Ύ Salva API Key</button>' +
    '<div id="ok" style="display:none;margin-top:10px;padding:10px;background:#f0fbf9;border-radius:6px;font-size:13px;color:#00897B;text-align:center;">βœ“ Salvata! Ora clicca "Valida questo documento".</div>' +
    '<script>function doSave(){var k=document.getElementById("k").value.trim();var err=document.getElementById("err");var btn=document.getElementById("btn");var ok=document.getElementById("ok");err.style.display="none";if(!k||k.length<10){err.textContent="Inserisci una API key valida (vrt_live_sk_...)";err.style.display="block";return;}btn.disabled=true;btn.textContent="Salvataggio...";google.script.run.withSuccessHandler(function(res){btn.disabled=false;btn.textContent="πŸ’Ύ Salva API Key";if(res==="ok"){ok.style.display="block";}else{err.textContent="Errore durante il salvataggio";err.style.display="block";}}).withFailureHandler(function(e){btn.disabled=false;btn.textContent="πŸ’Ύ Salva API Key";err.textContent="Errore: "+e.message;err.style.display="block";}).saveApiKey(k);}<\/script>' +
    '<script>
function toggleMenu(e) {
  if (e) { e.stopPropagation(); e.preventDefault(); }
  var m=document.getElementById('mob-menu');
  var o=document.getElementById('mob-overlay');
  var open=m.style.transform==='translateX(0px)'||m.style.transform==='translateX(0)';
  if(open){m.style.transform='translateX(100%)';o.style.display='none';o.style.pointerEvents='none';document.body.style.overflow='';}
  else{m.style.transform='translateX(0)';o.style.display='block';o.style.pointerEvents='auto';document.body.style.overflow='hidden';}
}
function closeMob(){
  document.getElementById('mob-menu').style.transform='translateX(100%)';
  document.getElementById('mob-overlay').style.display='none';
  document.getElementById('mob-overlay').style.pointerEvents='none';
  document.body.style.overflow='';
}
</script>
</body></html>';
}

function buildResultHtml(r) {
  var score = r.risk_score || 0;
  var level = r.risk_level || 'LOW';
  var color = score>=75?'#E84855':score>=50?'#E8774A':score>=25?'#F4C430':'#00BFA5';
  var bg = score>=75?'#fff5f5':score>=50?'#fff8f5':score>=25?'#fffdf0':'#f0fbf9';
  var icon = score>=75?'πŸ”΄':score>=50?'🟠':score>=25?'🟑':'🟒';
  var flagsHtml = '';
  var flags = r.flags || [];
  if (flags.length > 0) {
    flagsHtml += '<div style="margin-top:16px;"><div style="font-size:11px;font-weight:bold;color:#888;letter-spacing:1px;margin-bottom:8px;">ANOMALIE ('+flags.length+')</div>';
    for (var i=0;i<flags.length;i++){var f=flags[i];var sc=f.severity==='high'?'#E84855':f.severity==='medium'?'#F4C430':'#8A9BB0';flagsHtml+='<div style="border-left:3px solid '+sc+';padding:8px 10px;margin-bottom:8px;background:#fafafa;border-radius:0 6px 6px 0;"><div style="font-size:11px;font-weight:bold;color:#555;text-transform:uppercase;">'+(f.type||'').replace(/_/g,' ')+'</div><div style="font-size:12px;color:#333;margin-top:3px;">'+(f.detail||'')+'</div>'+(f.article?'<div style="font-size:11px;color:#00897B;margin-top:3px;">πŸ“‹ '+f.article+'</div>':'')+'</div>';}
    flagsHtml += '</div>';
  } else { flagsHtml='<div style="margin-top:12px;padding:10px;background:#f0fbf9;border-radius:6px;font-size:13px;color:#00897B;text-align:center;">βœ“ Nessuna anomalia rilevata</div>'; }
  var certHtml = r.cert_id ? '<div style="margin-top:14px;padding:10px 12px;background:#f0fbf9;border:1px solid rgba(0,191,165,.25);border-radius:6px;"><div style="font-size:10px;color:#888;letter-spacing:1px;margin-bottom:4px;">CERTIFICATO RFC 3161</div><div style="font-family:monospace;font-size:11px;color:#00897B;">'+r.cert_id+'</div><a href="'+(r.cert_url||'https://veritas-os.it/verify.php?id='+r.cert_id)+'" target="_blank" style="font-size:12px;color:#00BFA5;text-decoration:none;display:block;margin-top:4px;">β†’ Verifica pubblica</a></div>' : '';
  return '<!DOCTYPE html><html><body style="padding-top:72px;">' +
    '<div style="display:flex;align-items:center;gap:8px;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid #eee;"><span style="font-size:16px;">πŸ”</span><span style="font-size:13px;font-weight:bold;color:#1a1a2e;">VeritasOS</span><span style="margin-left:auto;font-size:11px;color:#999;">'+(r.ai_model||'')+'</span></div>' +
    '<div style="text-align:center;padding:18px;background:'+bg+';border-radius:10px;margin-bottom:12px;">' +
    '<div style="font-size:44px;font-weight:bold;color:'+color+';line-height:1;">'+score+'</div>' +
    '<div style="font-size:11px;color:#999;margin-top:2px;">/100</div>' +
    '<div style="display:inline-block;margin-top:8px;padding:4px 16px;background:'+color+';color:#fff;border-radius:20px;font-size:12px;font-weight:bold;">'+icon+' '+level+'</div>' +
    '</div>' + flagsHtml + certHtml +
    '<div style="margin-top:16px;padding-top:12px;border-top:1px solid #eee;display:flex;gap:8px;">' +
    '<button onclick="google.script.run.validateDocument()" style="flex:1;padding:10px;background:#00BFA5;color:#fff;border:none;border-radius:6px;font-size:13px;font-weight:bold;cursor:pointer;">πŸ”„ Rivalida</button>' +
    '<button onclick="google.script.run.showSettings()" style="padding:10px 14px;background:#f5f5f5;border:1px solid #ddd;border-radius:6px;font-size:13px;cursor:pointer;">βš™οΈ</button>' +
    '</div></body></html>';
}

function buildErrorHtml(message) {
  return '<!DOCTYPE html><html><body style="padding-top:72px;">' +
    '<div style="font-size:32px;text-align:center;margin-bottom:12px;">⚠️</div>' +
    '<div style="font-size:14px;font-weight:bold;color:#E84855;margin-bottom:10px;">Errore</div>' +
    '<div style="font-size:13px;color:#555;background:#fff5f5;padding:12px;border-radius:6px;border:1px solid #fcc;word-break:break-word;">'+message+'</div>' +
    '<button onclick="google.script.run.showSettings()" style="width:100%;margin-top:14px;padding:10px;background:#f5f5f5;border:1px solid #ddd;border-radius:6px;font-size:13px;cursor:pointer;">βš™οΈ Controlla API Key</button>' +
    '<button onclick="google.script.run.validateDocument()" style="width:100%;margin-top:8px;padding:10px;background:#00BFA5;color:#fff;border:none;border-radius:6px;font-size:13px;font-weight:bold;cursor:pointer;">πŸ”„ Riprova</button>' +
    '</body></html>';
}
          
3

Salva il progetto

Clicca l'icona πŸ’Ύ oppure premi Ctrl+S. Se richiesto, dai un nome al progetto (es. "VeritasOS").

4

Esegui "onOpen" per autorizzare i permessi

Nel menu a tendina delle funzioni seleziona onOpen, poi clicca β–Ά Esegui. Google chiederΓ  di autorizzare l'accesso al documento β€” clicca Rivedi autorizzazioni β†’ Consenti.

Se appare "App non verificata" clicca "Impostazioni avanzate β†’ Vai a VeritasOS (non sicuro)". È normale per script personali non ancora pubblicati.

5

Torna al documento e ricarica la pagina

Chiudi la scheda Apps Script e torna al tuo documento Google Docs. Ricarica la pagina (F5). Nella barra del menu comparirΓ  la voce πŸ” VeritasOS.


Utilizzo
Come usare l'estensione
Tre passi per validare un documento.
1

Imposta la tua API Key

Clicca πŸ” VeritasOS β†’ βš™οΈ Imposta API Key. Incolla la tua chiave da Dashboard β†’ API Keys e clicca Salva. La chiave viene salvata solo per il tuo account Google, non nel documento.

2

Valida il documento

Clicca πŸ” VeritasOS β†’ βœ… Valida questo documento. L'analisi richiede 5-15 secondi. Il pannello laterale mostrerΓ  il risk score, le anomalie rilevate e il certificato RFC 3161.

3

Verifica il certificato

Nel pannello clicca β†’ Verifica pubblica per aprire la pagina di verifica del certificato. Puoi condividere questo link con chiunque per provare l'autenticitΓ  del documento.


Risoluzione problemi
Errori comuni
Soluzioni ai problemi piΓΉ frequenti.
❌ "API key non valida"
Controlla che la key inizia con vrt_live_sk_ e che non ci siano spazi. Genera una nuova key dalla Dashboard β†’ API Keys.
❌ "Account scaduto"
Il tuo trial Γ¨ scaduto o l'abbonamento non Γ¨ attivo. Vai su Dashboard β†’ Piano & Fatturazione per attivare o rinnovare.
❌ "Non vedo il menu VeritasOS"
Ricarica la pagina dopo aver eseguito onOpen. Se con account Workspace non vedi "Estensioni β†’ Apps Script", l'amministratore ha disabilitato Apps Script β€” contatta il tuo IT admin.
⚠️ "App non verificata" durante l'autorizzazione
È normale per script personali. Clicca Impostazioni avanzate poi Vai a VeritasOS (non sicuro). Il codice Γ¨ pubblico e verificabile β€” lo stai installando tu stesso.
❌ Il pulsante "Salva" non fa nulla
Assicurati di aver usato il codice v3 (quello in questa pagina). Versioni precedenti avevano un bug nel salvataggio. Rifai l'installazione con il codice aggiornato sopra.
Non hai ancora un account?

14 giorni di trial gratuito. Nessuna carta di credito.

πŸš€ Inizia il Trial Gratuito β†’