Импорт и экспорт проектов

Поскольку проекты Apps Script размещаются на Google Диске, разработчики могут импортировать и экспортировать исходный код Apps Script с помощью API Google Диска (не путать со службой Drive в Apps Script).

Например, разработчик может создавать новый код Apps Script на своём локальном компьютере в любимом редакторе кода и использовать систему контроля версий, например Git , для совместной работы с другими разработчиками. После завершения версии он может загрузить (импортировать) файлы на Google Диск с помощью REST API, где их можно использовать как любой другой проект Apps Script.

Изменения кода можно вносить в локальные версии и синхронизировать с проектом Apps Script через API Google Drive. Существующие проекты можно загружать (экспортировать) из Google Drive на локальный компьютер.

Особенности и ограничения

Если вы хотите использовать API Google Drive для импорта или экспорта проектов, учтите следующее:

  1. Файлы серверных скриптов должны иметь расширение .gs. Вы можете использовать локальную разработку с использованием файлов .js, но перед импортом на Google Диск обязательно переименуйте их, добавив расширение .gs.
  2. Файлы клиентских скриптов должны заканчиваться на «.html». Это касается клиентских файлов .html, .js или .css. Вы также можете локально разрабатывать скрипты с использованием других расширений, но перед импортом на Google Диск важно иметь расширение .html.
  3. При импорте файлов проекта на Google Диск все существующие данные в этих файлах будут перезаписаны. Вы не можете добавлять или вставлять фрагменты текста; необходимо обновить весь файл.
  4. Файлы скриптов на стороне сервера должны содержать корректный код JavaScript. Если в файлах .js на сервере есть ошибки, вызов обновления API Google Диска завершится с ошибкой 5xx. Вы можете предотвратить это, выполнив линтинг кода перед импортом.
  5. Импорт пустых файлов невозможен. При попытке загрузить пустой файл вызов обновления API Google Drive завершится ошибкой 5xx.
  6. Импортировать и экспортировать можно только автономные скрипты. Доступ к скриптам , привязанным к контейнеру, через API Google Диска невозможен.
  7. Импортировать и экспортировать можно только исходный код. Такие ресурсы, как свойства проекта или журналы, также не доступны через API Google Диска. Такие действия, как управление версиями скриптов, их публикация и выполнение, через API Google Диска недоступны.
  8. Вы не ограничены одним серверным файлом Code.gs Вы можете распределить серверный код по нескольким файлам для упрощения разработки. Все серверные файлы загружаются в одно и то же глобальное пространство имён, поэтому используйте классы JavaScript, если хотите обеспечить безопасную инкапсуляцию.

API Диска

API Google Drive позволяет разработчикам программно получать доступ к файлам на Google Drive. Этот API использует GET для загрузки файлов и PUT/POST для их загрузки. Подробную документацию и краткие руководства см. на странице обзора API Google Drive .

В этом руководстве основное внимание будет уделено перечислению и перемещению файлов с помощью ресурса Files с использованием следующих вызовов:

Авторизация

Все запросы к API Google Drive должны быть авторизованы аутентифицированным пользователем по протоколу OAuth 2.0. Подробнее см. в документации по авторизации API Google Drive .

Помимо других областей , которые могут потребоваться приложению (например, https://www.googleapis.com/auth/drive ), все приложения, пытающиеся импортировать или экспортировать проекты Google Apps Script, должны запрашивать специальную область:

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

Список существующих проектов

Чтобы получить список всех проектов Apps Script на Диске, используйте ресурс Files для запроса файлов с MIME-типом application/vnd.google-apps.script . Чтобы отфильтровать ответ и включить только файлы, принадлежащие вам, добавьте параметр поиска 'me' in owners .

Вот пример запроса и ответа, который показывает массив проектов Apps Script, возвращенных через ответ 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
  }
 ]
}

Если вам известен идентификатор файла проекта Apps Script, вы можете напрямую получить его с помощью следующего вызова API:

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

Экспорт проектов с Диска

После получения ресурса File от API свойство exportLinks будет содержать URL-адрес, по которому можно получить содержимое проекта в формате JSON. Вот пример того, как может выглядеть этот URL-адрес:

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

Отправьте запрос по этому URL-адресу, чтобы получить содержимое самого проекта. Убедитесь, что вы включили заголовок Authorization с тем же токеном OAuth Bearer

Вот пример запроса и ответа:

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

В примере выше представлен код простого веб-приложения из руководства HTML Service . Обратите внимание, что вы получаете массив Files , каждый из которых имеет следующие четыре свойства:

id Внутренний идентификатор файла в проекте, необходимый для ссылки на этот файл во время обновлений.
name Имя файла без расширений, как оно отображается в редакторе скриптов.
type Два типа файлов — server_js и html.
source Закодированный исходный код, содержащийся в файле.

Импорт проектов на Диск

Чтобы обновить существующий проект, выполните HTTP-запрос PUT к API update файлов с соответствующим fileId . В примере ниже показан пример транзакции для загрузки медиафайлов. Используя одну из клиентских библиотек , ваше приложение может легко включить метаданные и медиафайлы в один вызов загрузки. Обратите внимание, что заголовок Content-Type в данном случае указывает тип загружаемого контента.

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

Создание новых файлов в проекте

Чтобы создать новый файл в проекте, отправьте PUT запрос на файл без свойства id . Если вы добавите файл с неизвестным идентификатором, система выдаст сообщение об ошибке.

Удалить файлы в проекте

Чтобы удалить файл из проекта, отправьте запрос PUT , не включающий этот файл (но включающий все остальные файлы проекта). Любой файл, не отправленный обратно в процессе импорта, будет удалён с сервера.

Переименование файлов в проекте

Чтобы переименовать файл в проекте, отправьте запрос PUT с существующим id , но новым name . Обратите внимание, что сервер игнорирует любые попытки изменить type на .

Создать новый проект

Чтобы создать новый проект, отправьте POST запрос к API insert файлов. Как и в случае с вызовом update , вы можете использовать клиентскую библиотеку для включения метаданных, таких как название и описание проекта.

Вот пример транзакции загрузки медиафайлов. В результате на вашем Диске будет создан проект под названием «Untitled». Параметр convert в URL обязателен. Как и при вызове update , заголовок Content-Type обязателен.

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