Apps Script utilise un bac à sable de sécurité
pour isoler les applications Google Workspace
dans certaines situations. Tous les modes bac à sable sont désormais abandonnés, à l'exception de IFRAME
. Les applications qui utilisaient d'anciens modes bac à sable utilisent désormais automatiquement le nouveau mode IFRAME
.
Les applications qui utilisaient auparavant ces anciens modes avec le service HTML devront peut-être apporter des modifications pour le mode IFRAME
afin de tenir compte des différences suivantes :
- Vous devez maintenant remplacer l'attribut
target
du lien à l'aide detarget="_top"
outarget="_blank"
. - Les fichiers HTML diffusés par le service HTML doivent inclure les balises <!DOCTYPE html>, <html> et <body>.
- La bibliothèque de chargement natif Google
api.js
ne se charge pas automatiquement en modeIFRAME
. - Les utilisateurs de Picker doivent appeler
setOrigin()
, car le contenu est diffusé à partir d'un nouveau domaine. - Certains anciens navigateurs, y compris IE9, ne sont pas compatibles
- Les ressources importées doivent désormais utiliser HTTPS
- L'envoi de formulaires n'est plus bloqué par défaut
Ces différences sont détaillées dans les sections suivantes.
Définir l'attribut de cible du lien
En mode IFRAME
, vous devez définir l'attribut de cible du lien sur _top
ou _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>
Vous pouvez également remplacer cet attribut à l'aide de la balise <base> dans la section "head" de la page Web englobante :
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
Balises HTML de premier niveau
En mode Sandbox NATIVE
(et EMULATED
), certaines balises HTML étaient automatiquement ajoutées à un fichier .html Apps Script, mais cela ne se produit pas en mode IFRAME
.
Pour vous assurer que les pages de votre projet sont diffusées correctement à l'aide de IFRAME
, enveloppez le contenu de votre page dans les balises de premier niveau suivantes :
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
La bibliothèque de chargement JavaScript natif doit être chargée explicitement
Les scripts qui s'appuyaient sur le chargement automatique de la bibliothèque de chargement natif api.js
doivent être modifiés pour charger explicitement cette bibliothèque, comme dans l'exemple suivant :
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Modification de l'API Google Picker
Lorsque vous utilisez l'API Google Picker, vous devez maintenant appeler setOrigin()
lors de la construction de PickerBuilder et transmettre l'origine google.script.host.origin
, comme indiqué dans l'exemple suivant :
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);
}
Pour obtenir un exemple fonctionnel complet, consultez Boîtes de dialogue d'ouverture de fichier.
Prise en charge des navigateurs
Le mode bac à sable IFRAME
est basé sur la fonctionnalité bac à sable iframe en HTML5.
Cette fonctionnalité n'est pas compatible avec certains anciens navigateurs, comme Internet Explorer 9. Cela peut poser problème si votre projet Apps Script :
- utilise
HtmlService
; - Sandbox
EMULATED
ouNATIVE
déjà utilisée
La migration de ces applications vers le mode bac à sable IFRAME
signifie qu'elles peuvent ne plus fonctionner sur certains navigateurs plus anciens (notamment IE9 et les versions antérieures) qui ne sont pas compatibles avec la fonctionnalité de bac à sable iframe d'HTML5.
Les applications qui demandent déjà le mode IFRAME
ou qui n'utilisent pas du tout HtmlService
ne sont pas concernées par ce problème.
Le protocole HTTPS est désormais obligatoire pour les ressources importées
Les applications précédentes qui importaient des ressources à l'aide du protocole HTTP doivent être modifiées pour utiliser HTTPS à la place.
L'envoi de formulaires n'est plus bloqué par défaut
Dans NATIVE
, les formulaires HTML en bac à sable ne pouvaient pas être envoyés ni naviguer sur la page. Dans ce cas, un développeur peut simplement ajouter un gestionnaire onclick
au bouton d'envoi sans avoir à se soucier de ce qui se passe ensuite.
Toutefois, en mode IFRAME
, les formulaires HTML sont autorisés à être envoyés. Si un élément de formulaire n'a pas d'attribut action
spécifié, il sera envoyé à une page vierge.
Pire encore, l'iFrame interne redirigera vers la page vierge avant que le gestionnaire onclick
n'ait eu le temps de se terminer.
La solution consiste à ajouter à votre page du code JavaScript qui empêche l'envoi des éléments du formulaire, afin que les gestionnaires de clics aient le temps de fonctionner :
<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>
Vous trouverez un exemple complet dans le guide HtmlService Communication client-serveur.