O Apps Script usa um sandbox de segurança
para fornecer isolamento de proteção para
aplicativos em determinadas situações. Todos
os modos de sandbox foram desativados, exceto IFRAME
. Os apps que usam modos de sandbox
mais antigos agora usam o modo IFRAME
mais recente automaticamente.
Os apps que usavam esses modos mais antigos com o serviço de HTML talvez precisem
fazer mudanças no modo IFRAME
para resolver as seguintes diferenças:
- Agora você precisa substituir o atributo
target
do 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 carregador nativo do Google
api.js
não é carregada automaticamente no modoIFRAME
. - Os usuários do Picker precisam chamar
setOrigin()
porque o conteúdo é veiculado em 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.
Como definir o atributo de destino do link
No modo IFRAME
, é necessário definir 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>
Também é possível substituir esse atributo usando a tag <base> na seção "head" da página da Web que o contém:
<!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 eram
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 nas seguintes tags de nível superior:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
A biblioteca de carregador JavaScript nativa precisa ser carregada explicitamente
Os scripts que dependiam do carregamento automático da biblioteca de carregamento nativo api.js
precisam ser alterados para carregar essa biblioteca explicitamente, como no exemplo abaixo:
<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
neste exemplo:
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 conferir um exemplo completo, consulte Caixas de diálogo de abertura de arquivo.
Suporte ao navegador
O modo sandbox IFRAME
é baseado no recurso
sandbox de iframe
no 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
EMULATED
ouNATIVE
usado anteriormente
A migração desses apps para o modo sandbox IFRAME
significa que eles podem não funcionar mais em
alguns navegadores mais antigos (notadamente o IE9 e versões anteriores) que não oferecem suporte ao 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.
O HTTPS agora é 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
Em NATIVE
, os formulários HTML em sandbox não podiam ser enviados
e navegar pela página. Assim, um desenvolvedor pode simplesmente adicionar um manipulador onclick
ao botão de envio e não se preocupar com o que acontece depois.
No modo IFRAME
, no entanto, os formulários HTML podem ser enviados, e, 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 gerenciador onclick
tenha a chance de terminar.
A solução é adicionar um código JavaScript à página que impeça que os elementos do formulário sejam enviados, para que os manipuladores de cliques tenham tempo 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>
Confira um exemplo completo no guia do HtmlService Comunicação cliente-servidor.