Migrar para o modo sandbox do IFRAME

O Google Apps Script usa um sandbox de segurança para fornecer isolamento de proteção para 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 o modo IFRAME mais recente automaticamente.

Os apps que usavam esses modos mais antigos com o serviço HTML podem precisar fazer mudanças no modo IFRAME para resolver as seguintes diferenças:

  • Agora é necessário substituir o atributo target do link usando target="_top" ou target="_blank"
  • Os arquivos HTML veiculados pelo serviço HTML precisam incluir as tags <!DOCTYPE html>, <html> e <body>.
  • A biblioteca do carregador gapi (api.js) não é carregada automaticamente no modo IFRAME.
  • Os usuários do setOrigin precisam chamar 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.
  • O envio de formulários não é mais impedido por padrão.

Essas diferenças são detalhadas nas seções a seguir.

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 de 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 do carregador gapi precisa ser carregada explicitamente

Os scripts que dependiam do carregamento automático da biblioteca do 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 criar 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 Diálogos de abertura de arquivos.

Suporte ao navegador

O modo de sandbox IFRAME é baseado no recurso de sandbox do iframe em 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
  • usava o sandbox EMULATED ou NATIVE

A migração desses apps para o modo de sandbox IFRAME significa que eles podem não funcionar mais em alguns navegadores mais antigos (principalmente o IE9 e versões anteriores) que não oferecem suporte ao recurso de sandbox do 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

No sandbox NATIVE, os formulários HTML eram impedidos de enviar e navegar na página. Assim, um desenvolvedor poderia adicionar um gerenciador onclick ao botão de envio e não se preocupar com o que aconteceu depois.

No modo IFRAME, 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 será redirecionado para a página em branco antes que o gerenciador onclick tenha a chance de terminar.

A solução é adicionar código JavaScript à página que impede que os elementos do formulário sejam enviados, para que os gerenciadores de cliques tenham tempo de 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 cliente-servidor.