Apps Script usa una zona de pruebas de seguridad para proporcionar aislamiento protector para las aplicaciones de en ciertas situaciones. Todos los modos de zona de pruebas ahora están obsoletos, excepto IFRAME
. Las apps que usan modos de zona de pruebas más antiguos ahora usan el modo IFRAME
más reciente automáticamente.
Es posible que las apps que usaban estos modos anteriores con el servicio HTML deban realizar cambios en el modo IFRAME
para abordar las siguientes diferencias:
- Ahora debes anular el atributo
target
del vínculo contarget="_top"
otarget="_blank"
. - Los archivos HTML que entrega el servicio de HTML deben incluir las etiquetas <!DOCTYPE html>, <html> y <body>.
- La biblioteca del cargador nativo de Google
api.js
no se carga automáticamente en el modoIFRAME
. - Los usuarios del selector deben llamar a
setOrigin()
porque el contenido se entrega desde un dominio nuevo. - No se admiten algunos navegadores más antiguos, incluido IE9.
- Los recursos importados ahora deben usar HTTPS
- Ya no se impide el envío de formularios de forma predeterminada
Estas diferencias se detallan en las siguientes secciones.
Cómo configurar el atributo objetivo del vínculo
En el modo IFRAME
, debes establecer el atributo de destino del vínculo en _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>
También puedes anular este atributo con la etiqueta <base> dentro de la sección head de la página web que lo contiene:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
Etiquetas HTML de nivel superior
En el modo de zona de pruebas NATIVE
(y EMULATED
), ciertas etiquetas HTML se agregarían automáticamente a un archivo .html de Apps Script, pero esto no sucede cuando se usa el modo IFRAME
.
Para asegurarte de que las páginas de tu proyecto se publiquen correctamente con IFRAME
, une el contenido de la página en las siguientes etiquetas de nivel superior:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
La biblioteca del cargador de JavaScript nativo se debe cargar de forma explícita.
Las secuencias de comandos que dependían de la carga automática de la biblioteca del cargador nativo api.js
deben cambiarse para cargar esta biblioteca de forma explícita, como en el siguiente ejemplo:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Cambio en la API de Google Picker
Cuando uses la API de Google Picker, ahora debes llamar a setOrigin()
cuando construyas PickerBuilder y pasar el origen google.script.host.origin
, como se muestra en el siguiente ejemplo:
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);
}
Para ver un ejemplo completo, consulta Diálogos de apertura de archivos.
Navegadores compatibles
El modo de zona de pruebas de IFRAME
se basa en la función de zona de pruebas de iframe en HTML5.
Esto no es compatible con algunos navegadores más antiguos, como Internet Explorer 9. Esto puede ser un problema si tu proyecto de Apps Script cumple con las siguientes condiciones:
- usa
HtmlService
. - Usaste anteriormente la zona de pruebas de
EMULATED
oNATIVE
Si migras estas apps al modo de zona de pruebas de IFRAME
, es posible que ya no funcionen en algunos navegadores más antiguos (en particular, IE9 y versiones anteriores) que no admiten la función de zona de pruebas de iframe de HTML5.
Las apps que ya solicitan el modo IFRAME
o que no usan HtmlService
no se ven afectadas por este problema.
Ahora se requiere HTTPS para los recursos importados
Las aplicaciones anteriores que importaban recursos con HTTP deben cambiarse para usar HTTPS.
Ya no se impide el envío de formularios de forma predeterminada
En NATIVE
, se impidió que los formularios HTML de la zona de pruebas se enviaran y navegaran por la página. Dado esto, un desarrollador podría simplemente agregar un controlador onclick
al botón de envío y no tener que preocuparse por lo que sucedió después.
Sin embargo, con el modo IFRAME
, se permite enviar formularios HTML y, si un elemento del formulario no tiene especificado un atributo action
, se enviará a una página en blanco.
Peor aún, el iframe interno redireccionará a la página en blanco antes de que el controlador onclick
tenga la oportunidad de terminar.
La solución es agregar código JavaScript a tu página que evite que los elementos del formulario se envíen, de modo que los controladores de clics tengan tiempo para funcionar:
<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>
Puedes encontrar un ejemplo completo en la guía de HtmlService sobre la Comunicación entre cliente y servidor.