Proyectos de importación y exportación

Dado que los proyectos de Apps Script se encuentran en Google Drive, los desarrolladores pueden importar y exportar el código fuente de Apps Script con la API de Google Drive (no confundir con el servicio de Drive en Apps Script).

Por ejemplo, un desarrollador puede escribir un nuevo código de Apps Script en su máquina local con su editor de código favorito y usar un sistema de control de versión como Git para colaborar con otros desarrolladores. Cuando termina una versión, puede subir (importar) los archivos a Google Drive con la API de REST, donde se pueden usar como cualquier otro proyecto de Apps Script.

Los cambios de código se pueden realizar en las versiones locales y sincronizarse con el proyecto de Apps Script a través de la API de Google Drive. Los proyectos existentes se pueden descargar (exportar) de Google Drive a una máquina local.

Funciones y limitaciones

Si quieres usar la API de Google Drive para importar o exportar proyectos, ten en cuenta lo siguiente:

  1. Se espera que los archivos de secuencia de comandos del servidor terminen en “.gs”. Es posible que desees desarrollar localmente con archivos .js, pero asegúrate de cambiarle el nombre para incluir una extensión .gs antes de importar a Google Drive.
  2. Los archivos de secuencia de comandos del cliente deben terminar en ".html". Esto incluye los archivos .html, .js o .css del cliente. Una vez más, puedes desarrollar de manera local con otras extensiones, pero es importante tener la extensión .html antes de importar a Google Drive.
  3. Cuando importas archivos de proyecto a Google Drive, se reemplazan todos los datos existentes en esos archivos. No puedes agregar ni insertar texto parcial; se debe actualizar todo el archivo.
  4. Los archivos de secuencia de comandos del servidor deben contener código JavaScript válido. Si hay errores en los archivos .js del servidor, la llamada de actualización a la API de Google Drive fallará y mostrará un error 5xx. Para evitarlo, analiza con lint tu código antes de la importación.
  5. No se pueden importar los archivos vacíos. La llamada de actualización a la API de Google Drive fallará y mostrará un error 5xx si intentas subir un archivo vacío.
  6. Solo se pueden importar o exportar secuencias de comandos independientes. No se puede acceder a las secuencias de comandos vinculadas al contenedor a través de la API de Google Drive.
  7. Solo se puede importar o exportar el código fuente. Los recursos, como las propiedades o los registros del proyecto, tampoco se exponen a través de la API de Google Drive. Acciones como el control de versiones de secuencias de comandos, la publicación o la ejecución de la secuencia de comandos no son posibles a través de la API de Google Drive.
  8. No estás limitado a un único archivo Code.gs de servidor. Puedes distribuir el código del servidor en varios archivos para facilitar el desarrollo. Todos los archivos del servidor se cargan en el mismo espacio de nombres global, por lo que debes usar clases de JavaScript cuando quieras proporcionar un encapsulamiento seguro.

API de Drive

La API de Google Drive permite a los desarrolladores acceder a los archivos de Google Drive de manera programática. Esta API usa GET para descargar archivos y PUT/POST para subirlos. Consulta la página Descripción general de la API de Google Drive para obtener documentación detallada y guías de inicio rápido.

Esta guía se enfocará en enumerar y mover archivos con el recurso de archivos mediante estas llamadas:

Autorización

Todas las solicitudes a la API de Google Drive deben estar autorizadas por un usuario autenticado a través del protocolo OAuth 2.0. Para obtener más detalles, consulta la documentación de autorización de la API de Google Drive.

Además de otros alcances que una aplicación pueda necesitar (como https://www.googleapis.com/auth/drive), todas las aplicaciones que intenten importar o exportar proyectos de Google Apps Script deben solicitar el alcance especial:

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

Enumerar proyectos existentes

Para enumerar todos los proyectos de Apps Script en Drive, usa el recurso de archivos a fin de consultar los archivos con el tipo de MIME de application/vnd.google-apps.script. Si deseas filtrar la respuesta para que solo incluya los archivos de tu propiedad, incluye el parámetro de búsqueda 'me' in owners.

A continuación, se muestra una solicitud y una respuesta de ejemplo en la que se muestra un array de proyectos de Apps Script que se muestran a través de una respuesta 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
  }
 ]
}

Si conoces el ID de archivo de un proyecto de Apps Script, puedes recuperarlo directamente con la siguiente llamada a la API:

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

Exporta proyectos desde Drive

Una vez que recuperes un recurso File de la API, la propiedad exportLinks contendrá una URL para recuperar a fin de obtener el contenido del proyecto como datos JSON. A continuación, te mostramos un ejemplo de cómo podría verse esta URL:

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

Realiza una solicitud a esta URL para recuperar el contenido del proyecto. Asegúrate de incluir un encabezado Authorization con el mismo token Bearer de OAuth

A continuación, se muestra una solicitud de ejemplo y una respuesta:

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"
    }
  ]
}

En el ejemplo anterior, se incluye el código de una aplicación web simple de la guía Servicio HTML. Ten en cuenta que obtendrás un array de Files, cada uno con las 4 propiedades siguientes:

id Identificador interno de un archivo dentro de un proyecto, necesario para hacer referencia a este archivo durante las actualizaciones.
name El nombre del archivo sin extensiones, como se muestra en el editor de secuencias de comandos.
type Los dos tipos de archivos son server_js y html.
source Código fuente codificado que se incluye en el archivo.

Importar proyectos a Drive

Para actualizar un proyecto existente, realiza una llamada HTTP PUT a la API del archivo update con el fileId adecuado. En el siguiente ejemplo, se muestra una transacción de muestra correspondiente a la parte de carga de contenido multimedia. Con una de las bibliotecas cliente, tu aplicación puede incluir metadatos y contenido multimedia con facilidad en la misma llamada de carga. Ten en cuenta que el encabezado Content-Type especifica el tipo de contenido que se sube en este 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"
    }
  ]
}

Cómo crear archivos nuevos dentro de un proyecto

Para crear un archivo nuevo dentro de un proyecto, envía una solicitud PUT para un archivo sin la propiedad id. Si incluyes un archivo con un identificador desconocido, el sistema arrojará un mensaje de error.

Borra archivos de un proyecto

Para borrar un archivo de un proyecto, envía una solicitud PUT que no incluya ese archivo (pero que incluya todos los demás archivos del proyecto). Cualquier archivo que no se devuelva durante el proceso de importación se borrará del servidor.

Cambia el nombre de los archivos de un proyecto

Para cambiar el nombre de un archivo dentro de un proyecto, envía una solicitud PUT con el id existente, pero con un name nuevo. Ten en cuenta que el servidor ignora cualquier intento de cambiar a type.

Crear proyecto nuevo

Para crear un proyecto nuevo, envía una solicitud POST a la API del archivo insert. Al igual que la llamada a update, puedes usar una biblioteca cliente para incluir metadatos como el nombre y la descripción del proyecto.

A continuación, se muestra una transacción de ejemplo de la carga de contenido multimedia. Esto creará un proyecto llamado “Sin título” en tu unidad. El parámetro convert de la URL es obligatorio. Al igual que con la llamada update, el encabezado Content-Type es obligatorio.

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"
    }
  ]
}