O Apps Script usa um sandbox de segurança
para fornecer isolamento de proteção para Google Workspace
aplicativos em determinadas situações. Tudo
Os modos sandbox foram desativados, exceto para IFRAME
. Apps que usam sandbox mais antigo
agora usam o modo IFRAME
mais recente automaticamente.
Os aplicativos que anteriormente usavam esses modos mais antigos com o serviço HTML podem precisar
Fazer mudanças no modo IFRAME
para resolver estas 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 <!DOCTYPE html>, <html> e <body> tags
- A biblioteca de carregador nativo do Google
api.js
não carrega automaticamente em ModoIFRAME
- Seletor: os usuários precisam ligar
setOrigin()
porque o conteúdo é disponibilizado 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 bloqueado por padrão.
Essas diferenças são detalhadas nas seções a seguir.
Definir o atributo de destino do link
No modo IFRAME
, é preciso 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 o elemento <base> no cabeçalho da página da Web associada:
<!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 estariam
adicionado automaticamente a um arquivo .html do Apps Script, mas isso não acontece quando
usando o modo IFRAME
.
Para garantir que as páginas do seu projeto sejam exibidas corretamente usando IFRAME
, encapsule os
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 nativa do carregador JavaScript precisa ser carregada explicitamente
Scripts que dependiam do carregamento automático da biblioteca de carregador nativo api.js
deve ser alterado 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()
na construção
ao PickerBuilder e transmita 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 funcional completo, consulte Caixas de diálogo abertas ao arquivo.
Suporte ao navegador
O modo sandbox IFRAME
é baseado no
Sandbox de iframe
recurso em HTML5.
Isso não é compatível com alguns navegadores mais antigos, como o Internet Explorer 9. Isso
pode ser um problema se seu projeto do Apps Script:
- usa
HtmlService
e - sandbox
EMULATED
ouNATIVE
usado anteriormente
Migrar esses apps para o modo sandbox IFRAME
significa que eles podem não funcionar mais
alguns navegadores mais antigos (principalmente o IE9 e anteriores) que não suportam o iframe do HTML5
sandbox.
Apps que já solicitam o modo IFRAME
ou não usam HtmlService
estão
não é afetada por esse problema.
O HTTPS agora é obrigatório para recursos importados
Os aplicativos anteriores que importavam recursos usando HTTP precisam ser alterados para use HTTPS.
O envio de formulários não é mais bloqueado por padrão.
Em NATIVE
, os formulários HTML no sandbox foram impedidos de ser enviados
e navegar pela página. Sendo assim, um desenvolvedor pode simplesmente adicionar uma onclick
.
para o botão de envio e não precisa se preocupar com o que aconteceu depois.
No modo IFRAME
, no entanto, formulários HTML podem ser enviados, e se um formulário
o elemento 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 do onclick
.
tenha uma chance de concluir.
A solução é adicionar código JavaScript à sua página para impedir que o formulário do envio desses elementos, para que os manipuladores de cliques tenham tempo função:
<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 no guia do HTMLService. Comunicação cliente-servidor.