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

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

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

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

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

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

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

API Диска

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

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

Авторизация

Все запросы к API Google Диска должны быть авторизованы пользователем, прошедшим проверку подлинности, через протокол OAuth 2.0. Более подробную информацию можно найти в документации по авторизации Google Drive API .

Помимо других областей, которые могут потребоваться приложению (например, 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 с тем же токеном Bearer OAuth.

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

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 . Обратите внимание, что вы получаете массив Files , каждый из которых имеет следующие 4 свойства:

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 , вы можете использовать клиентскую библиотеку для включения метаданных, таких как имя и описание проекта.

Вот пример транзакции загрузки мультимедиа. На вашем Диске будет создан проект под названием «Без названия». Параметр 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"
    }
  ]
}