O Google Apps Script usa um sandbox de segurança
para fornecer isolamento de proteção aos aplicativos do Google Workspace em
determinadas situações. Todos os modos de sandbox foram desativados, exceto o IFRAME. Os apps
que usam modos de sandbox mais antigos agora usam automaticamente o modo IFRAME mais recente.
Os apps que usavam esses modos mais antigos com o serviço HTML talvez precisem
fazer mudanças no modo IFRAME para resolver as seguintes diferenças:
- Agora você precisa substituir o atributo
targetdo link usandotarget="_top"outarget="_blank" - Os arquivos HTML veiculados pelo serviço HTML precisam incluir as tags <!DOCTYPE html>, <html> e <body>.
- A biblioteca de carregamento
gapi(api.js) não é carregada automaticamente no modoIFRAME. - Os usuários do Picker precisam chamar
setOriginporque o conteúdo é veiculado de um novo domínio. - Alguns navegadores mais antigos, incluindo o IE9, não são compatíveis
- Os recursos importados agora precisam usar HTTPS
- O envio de formulários não é mais impedido por padrão
Essas diferenças são detalhadas nas seções a seguir.
Definir o atributo de destino do link
No modo IFRAME, defina o atributo de destino do link como _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>
Você também pode substituir esse atributo usando a tag <base> na seção head da página da Web:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
Tags HTML de nível superior
No modo sandbox NATIVE (e EMULATED), algumas tags HTML são adicionadas automaticamente a um arquivo .html do Apps Script, mas isso não acontece ao usar o modo IFRAME.
Para garantir que as páginas do projeto sejam veiculadas corretamente usando IFRAME, envolva o conteúdo da página com as seguintes tags de nível superior:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
A biblioteca de carregamento gapi precisa ser carregada explicitamente
Os scripts que dependiam do carregamento automático da biblioteca de carregador gapi (api.js)
precisam ser alterados para carregar essa biblioteca explicitamente, como no exemplo a seguir:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Mudança na API Google Picker
Ao usar a API Google Picker,
agora é necessário chamar setOrigin ao construir o PickerBuilder e transmitir a origem
google.script.host.origin, conforme mostrado no exemplo a seguir:
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 um exemplo completo de trabalho, consulte Caixas de diálogo de abertura de arquivos.
Suporte ao navegador
O modo sandbox IFRAME é baseado no recurso de
iframe em sandbox do HTML5.
Isso não é compatível com alguns navegadores mais antigos, como o Internet Explorer 9. Isso pode ser um problema se o projeto do Apps Script:
- usa
HtmlService, e - sandbox
EMULATEDouNATIVEusado anteriormente
A migração desses apps para o modo sandbox do IFRAME significa que eles podem não funcionar mais em
alguns navegadores mais antigos (principalmente IE9 e versões anteriores) que não são compatíveis com o recurso
de sandbox de iframe do HTML5.
Os apps que já solicitam o modo IFRAME ou não usam HtmlService não são afetados por esse problema.
Agora o HTTPS é obrigatório para recursos importados
Os aplicativos anteriores que importavam recursos usando HTTP precisam ser alterados para usar HTTPS.
O envio de formulários não é mais impedido por padrão
No NATIVE, os formulários HTML em sandbox não podiam ser enviados
nem navegar pela página. Assim, um desenvolvedor pode adicionar um manipulador onclick ao botão de envio sem se preocupar com o que acontece depois.
No modo IFRAME, os formulários HTML podem ser enviados. Se um elemento de formulário não tiver um atributo action especificado, ele será enviado para uma página em branco.
Pior ainda, o iframe interno vai redirecionar para a página em branco antes que o manipulador onclick
tenha a chance de terminar.
A solução é adicionar código JavaScript à página para impedir que os elementos do formulário sejam enviados, assim os manipuladores de cliques têm tempo para funcionar:
// 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);
Um exemplo completo pode ser encontrado no guia do HtmlService Comunicação do cliente com o servidor.