O Apps Script usa um sandbox de segurança
para fornecer isolamento protetor para Google Workspace
aplicativos em determinadas situações. Todos
os modos de sandbox foram desativados, exceto IFRAME
. Os apps que usam modos sandbox
mais antigos agora usam o modo IFRAME
mais recente automaticamente.
Os apps que usavam esses modos antigos com o serviço HTML podem precisar
fazer mudanças no modo IFRAME
para lidar com as seguintes diferenças:
- Agora é necessário substituir o atributo
target
do link usandotarget="_top"
outarget="_blank"
. - Os arquivos HTML exibidos 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 Seletor precisam chamar
setOrigin()
porque 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
- Por padrão, o envio de formulários não é mais impedido
Essas diferenças são detalhadas nas seções a seguir.
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>
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 exibidas 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 nativo precisa ser carregada explicitamente
Os scripts que dependiam do carregamento automático da biblioteca do carregador nativo 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 você precisa chamar setOrigin()
ao criar
o PickerBuilder e transmitir o google.script.host.origin
de origem, 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 sandbox do 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 - o 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 (principalmente o IE9 e anteriores) que não oferecem suporte ao recurso de sandbox
de iframe do HTML5.
Os apps que já solicitam o modo IFRAME
ou que não usam o 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.
Por padrão, o envio de formulários não é mais impedido
Em NATIVE
, os formulários HTML de sandbox foram impedidos de enviar e navegar pela página. Considerando isso, um desenvolvedor pode simplesmente adicionar um gerenciador onclick
ao botão de envio e não precisa se preocupar com o que acontece depois.
No modo IFRAME
, os formulários HTML podem ser enviados e, se um elemento
de formulário não tiver o atributo action
especificado, ele será enviado para uma página em branco.
E, para piorar, o iframe interno redireciona para a página em branco antes que o gerenciador onclick
termine.
A solução é adicionar à sua página um código JavaScript que impeça o envio dos elementos do formulário para que os gerenciadores de clique tenham tempo de 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>
Um exemplo completo pode ser encontrado na comunicação cliente para servidor do guia de HTMLService.