Google Apps Script utilizza una sandbox di sicurezza
per fornire un isolamento protettivo per le applicazioni Google Workspace in
determinate situazioni. Tutte le modalità sandbox sono state ritirate, ad eccezione di IFRAME. Le app che utilizzano le modalità sandbox precedenti ora utilizzano automaticamente la modalità IFRAME più recente.
Le app che in precedenza utilizzavano queste modalità precedenti con il servizio HTML potrebbero dover apportare modifiche per la modalità IFRAME per risolvere le seguenti differenze:
- Ora devi sostituire l'attributo
targetdel link utilizzandotarget="_top"otarget="_blank" - I file HTML gestiti dal servizio HTML devono includere i tag <!DOCTYPE html>, <html> e <body>
- La libreria di caricamento
gapi(api.js) non viene caricata automaticamente in modalitàIFRAME - Gli utenti di Picker devono chiamare
setOriginperché i contenuti vengono gestiti da un nuovo dominio - Alcuni browser meno recenti, tra cui IE9, non sono supportati
- Le risorse importate ora devono utilizzare HTTPS
- L'invio dei moduli non viene più impedito per impostazione predefinita
Queste differenze sono descritte in dettaglio nelle sezioni seguenti.
Impostare l'attributo target del link
In modalità IFRAME devi impostare l'attributo target del link su _top o _blank:
Code.js
function doGet() {
var template = HtmlService.createTemplateFromFile('top');
return template.evaluate();
}
top.html
<!DOCTYPE html>
<html>
<body>
<div>
<a href="http://google.com" target="_top">Click Me!</a>
</div>
</body>
</html>
Puoi anche sostituire questo attributo utilizzando il tag <base> nella sezione head della pagina web contenitore:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
Tag HTML di primo livello
In modalità sandbox NATIVE (e EMULATED), alcuni tag HTML venivano aggiunti automaticamente a un file .html di Apps Script, ma questo non accade quando si utilizza la modalità IFRAME.
Per assicurarti che le pagine del progetto vengano gestite correttamente utilizzando IFRAME, racchiudi i contenuti della pagina nei seguenti tag di primo livello:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
La libreria di caricamento gapi deve essere caricata in modo esplicito
Gli script che si basavano sul caricamento automatico della libreria di caricamento gapi (api.js) devono essere modificati per caricare questa libreria in modo esplicito, come nell'esempio seguente:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Modifica dell'API Google Picker
Quando utilizzi l'API Google Picker,
ora devi chiamare setOrigin durante la creazione di PickerBuilder e passare
l'origine google.script.host.origin, come mostrato nell'esempio seguente:
function createPicker(oauthToken) {
var picker = new google.picker.PickerBuilder()
.addView(google.picker.ViewId.SPREADSHEETS) // Or a different ViewId
.setOAuthToken(oauthToken)
.setDeveloperKey(developerKey)
.setCallback(pickerCallback)
.setOrigin(google.script.host.origin) // Note the setOrigin
.build();
picker.setVisible(true);
}
Per un esempio funzionante completo, consulta Finestre di dialogo di apertura dei file.
Supporto browser
La modalità sandbox IFRAME si basa sulla funzionalità di sandboxing iframe
in HTML5.
Questa funzionalità non è supportata in alcuni browser meno recenti, come Internet Explorer 9. Questo può essere un problema se il tuo progetto Apps Script:
- Utilizza
HtmlServicee - In precedenza utilizzava il sandboxing
EMULATEDoNATIVE
La migrazione di queste app alla modalità sandbox IFRAME significa che potrebbero non funzionare più su alcuni browser meno recenti (in particolare IE9 e versioni precedenti) che non supportano la funzionalità di sandboxing iframe di HTML5.
Le app che richiedono già la modalità IFRAME o che non utilizzano affatto HtmlService non sono interessate da questo problema.
Ora HTTPS è obbligatorio per le risorse importate
Le applicazioni precedenti che importavano risorse utilizzando HTTP devono essere modificate per utilizzare invece HTTPS.
L'invio dei moduli non viene più impedito per impostazione predefinita
Nel sandboxing NATIVE, i moduli HTML non potevano essere inviati e la pagina non poteva essere navigata. Di conseguenza, uno sviluppatore poteva aggiungere un gestore onclick al pulsante di invio senza doversi preoccupare di cosa sarebbe successo dopo.
Con la modalità IFRAME, tuttavia, i moduli HTML possono essere inviati e, se un elemento del modulo non ha un attributo action specificato, verrà inviato a una pagina vuota.
Ancora peggio, l'iframe interno verrà reindirizzato alla pagina vuota prima che il gestore onclick abbia la possibilità di terminare.
La soluzione consiste nell'aggiungere alla pagina codice JavaScript che impedisca l'invio effettivo degli elementi del modulo, in modo che i gestori di clic abbiano il tempo di funzionare:
// Prevent forms from submitting.
function preventFormSubmit() {
var forms = document.querySelectorAll('form');
for (var i = 0; i < forms.length; i++) {
forms[i].addEventListener('submit', function(event) {
event.preventDefault();
});
}
}
window.addEventListener('load', preventFormSubmit);
Un esempio completo è disponibile nella guida di HtmlService Comunicazione client-server.