Como importar e exportar projetos

Como os projetos do Google Apps Script residem no Google Drive, os desenvolvedores podem importar e exportar o código-fonte do Apps Script usando a API Google Drive (não confundir com o serviço Drive no Apps Script).

Por exemplo, um desenvolvedor pode criar um novo código do Apps Script na máquina local com o editor de código favorito e usar um sistema de controle de versões como Git para colaborar com outros desenvolvedores. Quando uma versão é finalizada, ele pode fazer upload (importar) dos arquivos para o Google Drive usando a API REST, em que eles podem ser usados como qualquer outro projeto do Apps Script.

As mudanças de código podem ser feitas nas versões locais e sincronizadas com o projeto do Apps Script usando a API Google Drive. Os projetos atuais podem ser baixados (exportados) do Google Drive para uma máquina local.

Recursos e limitações

Se você quiser usar a API Google Drive para importar ou exportar projetos, esteja ciente do seguinte:

  1. Os arquivos de script do lado do servidor precisam terminar em ".gs". Talvez você queira desenvolver localmente usando arquivos .js, mas renomeie para incluir uma extensão .gs antes de importar para o Google Drive.
  2. Os arquivos de script do lado do cliente precisam terminar com ".html". Isso inclui arquivos .html, .js ou .css do lado do cliente. Novamente, você pode desenvolver localmente usando outras extensões, mas é importante ter a extensão .html antes de importar para o Google Drive.
  3. Ao importar arquivos de projeto para o Google Drive, todos os dados atuais nesses arquivos serão substituídos. Não é possível anexar ou inserir texto parcial. O arquivo inteiro precisa ser atualizado.
  4. Os arquivos de script do lado do servidor precisam conter JavaScript válido. Se houver erros nos arquivos .js do servidor, a chamada de atualização da API Google Drive vai falhar com um erro 5xx. Você pode evitar isso inspecionando o código antes de importar.
  5. Não é possível importar arquivos vazios. A chamada de atualização da API Google Drive vai falhar com um erro 5xx se você tentar fazer upload de um arquivo vazio.
  6. Somente scripts independentes podem ser importados ou exportados. Não é possível acessar scripts vinculados a contêineres pela API Google Drive.
  7. Somente o código-fonte pode ser importado ou exportado. Recursos como propriedades ou registros de projetos também não são expostos pela API Google Drive. Não é possível realizar ações como controle de versões, publicação ou execução de scripts usando a API Google Drive.
  8. Você não está limitado a um único arquivo Code.gs do servidor. É possível distribuir o código do servidor em vários arquivos para facilitar o desenvolvimento. Todos os arquivos do servidor são carregados no mesmo namespace global. Portanto, use classes JavaScript quando quiser fornecer um encapsulamento seguro.

API Drive

A API Google Drive permite que os desenvolvedores acessem arquivos no Google Drive de forma programática. Essa API usa GET para baixar arquivos e PUT/POST para fazer upload de arquivos. Consulte a página Visão geral da API Google Drive para ver a documentação detalhada e os guias de início rápido.

Este guia se concentra na listagem e movimentação de arquivos com o recurso Files usando estas chamadas:

Autorização

Todas as solicitações à API Google Drive precisam ser autorizadas por um usuário autenticado pelo protocolo OAuth 2.0. Para mais detalhes, consulte a documentação de autorização da API Google Drive.

Além de outros escopos que um aplicativo pode precisar (como https://www.googleapis.com/auth/drive), todos os aplicativos que tentam importar ou exportar projetos do Google Apps Script precisam solicitar o escopo especial:

https://www.googleapis.com/auth/drive.scripts

Para testar os exemplos de solicitações a seguir, use um token de portador do OAuth 2.0 obtido em OAuth 2.0 Playground.

Listar projetos atuais

Para listar todos os projetos do Apps Script no Drive, use o recurso Files para consultar arquivos com o tipo MIME application/vnd.google-apps.script. Para filtrar a resposta e incluir apenas os arquivos que você possui, inclua o parâmetro de pesquisa 'me' in owners.

Confira um exemplo de solicitação e resposta que mostra uma matriz de projetos do Apps Script retornados por uma resposta JSON.

GET https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application%2Fvnd.google-apps.script'+and+'me'+in+owners
Authorization:  Bearer ya29.fakebearerstring
{
 "kind": "drive#fileList",
 "etag": "\"kjsas92/f3zGUXczKMxEB_9ZTMRFOF3d1ZU\"",
 "selfLink": "https://www.googleapis.com/drive/v2/files?q=mimeType%3D'application/vnd.google-apps.script'+and+'me'+in+owners",
 "items": [
  {
   "kind": "drive#file",
   "id": "1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "etag": "\"kjsas92/MTM3MDk3ODY5ODQyNg\"",
   "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D",
   "alternateLink": "https://script.google.com/a/google.com/d/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/edit?usp=drivesdk",
   "iconLink": "https://ssl.gstatic.com/docs/doclist/images/icon_11_script_list.png",
   "title": "Mail merge",
   "mimeType": "application/vnd.google-apps.script",
   "description": "",
   "labels": {
    "starred": false,
    "hidden": false,
    "trashed": true,
    "restricted": false,
    "viewed": true
   },
   "createdDate": "2013-06-11T19:24:45.188Z",
   "modifiedDate": "2013-06-11T19:24:58.426Z",
   "modifiedByMeDate": "2013-06-11T19:24:58.426Z",
   "lastViewedByMeDate": "2013-06-11T19:24:58.426Z",
   "parents": [
    {
     "kind": "drive#parentReference",
     "id": "0APdyIOzo7bWDUk9PVA",
     "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/parents/0APdyIOzo7bWDUk9PVA",
     "parentLink": "https://www.googleapis.com/drive/v2/files/0APdyIOzo7bWDUk9PVA",
     "isRoot": true
    }
   ],
   "exportLinks": {
    "application/json": "https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json"
   },
   "userPermission": {
    "kind": "drive#permission",
    "etag": "\"kjsas92/259X2r5DVstv1CcIQTjt_RQPSW8\"",
    "id": "me",
    "selfLink": "https://www.googleapis.com/drive/v2/files/1vi0uwcMdHsRv1YFtgq7XdiTGSdqgjIYpdQNC0A_Udn79LOhH0vYL132D/permissions/me",
    "role": "owner",
    "type": "user"
   },
   "quotaBytesUsed": "0",
   "ownerNames": [
    "John Doe"
   ],
   "owners": [
    {
     "kind": "drive#user",
     "displayName": "John Doe",
     "picture": {
      "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
     },
     "isAuthenticatedUser": true,
     "permissionId": "1234566789"
    }
   ],
   "lastModifyingUserName": "John Doe",
   "lastModifyingUser": {
    "kind": "drive#user",
    "displayName": "John Doe",
    "picture": {
     "url": "https://lh4.googleusercontent.com/-yd1rIb6Pe2Y/AAAAAAAAAAI/AAAAAAAAAGs/PP5vTuZonik/s64/photo.jpg"
    },
    "isAuthenticatedUser": true,
    "permissionId": "1234566789"
   },
   "editable": true,
   "writersCanShare": true,
   "shared": false,
   "explicitlyTrashed": true,
   "appDataContents": false
  }
 ]
}

Se você souber o ID do arquivo de um projeto do Apps Script, poderá buscá-lo diretamente com a seguinte chamada de API:

GET https://www.googleapis.com/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerstring

O ID do arquivo de um projeto não é o mesmo que a chave do projeto. O ID do arquivo é a string alfanumérica no URL do projeto.

Exportar projetos do Drive

Depois de receber um recurso File da API, a propriedade exportLinks vai conter um URL para buscar o conteúdo do projeto como dados JSON. Confira um exemplo de como esse URL pode ser:

https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json

Faça uma solicitação para esse URL para recuperar o conteúdo do projeto. Inclua um cabeçalho Authorization com o mesmo token Bearer do OAuth.

Confira um exemplo de solicitação e resposta:

GET https://script.google.com/feeds/download/export?id=1234567890abcefghijklmnopqrstuvwxyz&format=json
Authorization:  Bearer ya29.fakebearerstring
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

O exemplo anterior inclui código para um app da Web do guia do serviço HTML Service. Você recebe uma matriz de Files, cada uma com as quatro propriedades a seguir:

id Identificador interno de um arquivo em um projeto, necessário para referenciar esse arquivo durante as atualizações.
name O nome do arquivo sem extensões, conforme exibido no editor de scripts.
type Os dois tipos de arquivos são server_js e html.
source O código-fonte codificado contido no arquivo.

Importar projetos para o Drive

Para atualizar um projeto atual, faça uma chamada HTTP PUT para a API do arquivo update com o fileId adequado. O exemplo a seguir mostra uma transação de amostra para a parte de upload de mídia. Usando uma das bibliotecas de cliente, seu aplicativo pode incluir metadados e a mídia na mesma chamada de upload. O cabeçalho Content-Type especifica o tipo de conteúdo enviado nesse caso.

PUT https://www.googleapis.com/upload/drive/v2/files/1234567890abcefghijklmnopqrstuvwxyz
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "id":"9basdfbd-749a-4as9b-b9d1-d64basdf803",
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "id":"3asf7c0d-1afb-4a9-8431-5asdfc79e7ae",
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    New message!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}

Criar novos arquivos em um projeto

Para criar um novo arquivo em um projeto, envie uma solicitação PUT para um arquivo sem a propriedade id. Se você incluir um arquivo com um identificador desconhecido, o sistema vai gerar uma mensagem de erro.

Excluir arquivos em um projeto

Para excluir um arquivo de um projeto, envie uma solicitação PUT que não inclua esse arquivo, mas que inclua todos os outros arquivos do projeto. Qualquer arquivo que não for enviado durante o processo de importação será excluído do servidor.

Renomear arquivos em um projeto

Para renomear um arquivo em um projeto, envie uma solicitação PUT com o id atual, mas um novo name. O servidor ignora qualquer tentativa de mudar para type.

Criar novo projeto

Para criar um novo projeto, envie uma solicitação POST para a API do arquivo insert. Assim como a chamada update, você pode usar uma biblioteca de cliente para incluir metadados, como o nome e a descrição do projeto.

Confira um exemplo de transação do upload de mídia. Isso vai criar um projeto chamado "Sem título" no seu Drive. O parâmetro convert no URL é obrigatório. Assim como na chamada update, o cabeçalho Content-Type é obrigatório.

POST https://www.googleapis.com/upload/drive/v2/files?convert=true
Authorization:  Bearer ya29.fakebearerestring
Content-Type:  application/vnd.google-apps.script+json
{
  "files": [
    {
      "name":"Code",
      "type":"server_js",
      "source":"function doGet() {\n  return HtmlService.createHtmlOutputFromFile(\u0027index\u0027);\n}\n"
    },
    {
      "name":"index",
      "type":"html",
      "source":"\u003chtml\u003e\n  \u003cbody\u003e\n    Hello, world!!\n  \u003c/body\u003e\n\u003c/html\u003e"
    }
  ]
}