Valida e certifica i tuoi documenti legali direttamente da Google Docs, senza uscire dall'editor. Analisi AI + certificato RFC 3161 in pochi secondi.
Apri qualsiasi documento Google Docs. Dal menu in cima clicca Estensioni β Apps Script. Si aprirΓ una nuova scheda con l'editor di 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>';
}
Clicca l'icona πΎ oppure premi Ctrl+S. Se richiesto, dai un nome al progetto (es. "VeritasOS").
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.
Chiudi la scheda Apps Script e torna al tuo documento Google Docs. Ricarica la pagina (F5). Nella barra del menu comparirΓ la voce π VeritasOS.
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.
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.
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.
vrt_live_sk_ e che non ci siano spazi. Genera una nuova key dalla Dashboard β API Keys.14 giorni di trial gratuito. Nessuna carta di credito.
π Inizia il Trial Gratuito β