Apps Script utilizza una sandbox per la sicurezza
per fornire l'isolamento protettivo per Google Workspace
le applicazioni in determinate situazioni. Tutte le modalità sandbox sono state ritirate ad eccezione di IFRAME
. Le app che usano modalità sandbox precedenti ora usano automaticamente la modalità IFRAME
più recente.
Le app che utilizzavano in precedenza queste modalità meno recenti con il servizio HTML potrebbero dover
apportare modifiche alla modalità IFRAME
per risolvere le seguenti differenze:
- Ora devi sostituire l'attributo
target
del link utilizzandotarget="_top"
otarget="_blank"
- I file HTML pubblicati dal servizio HTML devono includere <!DOCTYPE html>, <html> e <body>
- La libreria di caricamento nativo di Google
api.js
non si carica automaticamente in modalitàIFRAME
- Gli utenti del selettore devono chiamare
setOrigin()
perché i contenuti vengono pubblicati 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 è più impedito per impostazione predefinita
Queste differenze sono descritte in dettaglio nelle sezioni seguenti.
Impostare l'attributo di destinazione del link
In modalità IFRAME
, devi impostare l'attributo di destinazione 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 che lo contiene:
<!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 vengono
aggiunti automaticamente a un file .html di Apps Script, ma questo non succede quando
si utilizza la modalità IFRAME
.
Per assicurarti che le pagine del progetto vengano pubblicate correttamente utilizzando IFRAME
, aggrega 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 JavaScript nativa deve essere caricata in modo esplicito
Gli script basati sul caricamento automatico della libreria di caricamento nativa api.js
devono essere modificati in modo da caricare esplicitamente questa libreria, come nell'esempio seguente:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Modifica API Google Selecter
Quando utilizzi l'API Google Selecter, ora devi chiamare setOrigin()
durante la creazione del 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 completo funzionante, vedi Finestre di dialogo di apertura file.
Supporto del browser
La modalità sandbox di IFRAME
si basa sulla funzionalità di sandboxing degli iframe in HTML5.
Questa operazione non è supportata in alcuni browser meno recenti, come Internet Explorer 9. Questo
potrebbe essere un problema se il tuo progetto Apps Script:
- usa
HtmlService
e - sandbox
EMULATED
oNATIVE
utilizzata in precedenza
La migrazione di queste app alla modalità sandbox di IFRAME
potrebbe 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 non utilizzano affatto HtmlService
non sono interessate da questo problema.
Ora è richiesto HTTPS per le risorse importate
Le applicazioni precedenti che importavano risorse tramite HTTP devono essere modificate in modo da utilizzare invece HTTPS.
L'invio dei moduli non è più impedito per impostazione predefinita
In NATIVE
, è stato impedito l'invio e la navigazione della pagina tramite la sandbox dei moduli HTML. Detto questo, uno sviluppatore potrebbe semplicemente aggiungere un gestore onclick
al pulsante di invio senza doversi preoccupare di quello che è successo dopo.
Con la modalità IFRAME
, invece, è possibile inviare moduli HTML e, se per un elemento
del modulo non è specificato un attributo action
, verrà inviato a una pagina vuota.
Peggio ancora, l'iframe interno reindirizzerà 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'effettivo invio degli elementi modulo, in modo che i gestori dei clic abbiano il tempo di funzionare:
<script>
// 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);
</script>
Puoi trovare un esempio completo nella guida di HTMLService per la comunicazione client-server.