Поскольку проекты 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 для импорта или экспорта проектов, учтите следующее:
- Файлы серверных скриптов должны иметь расширение .gs. Вы можете использовать локальную разработку с использованием файлов .js, но перед импортом на Google Диск обязательно переименуйте их, добавив расширение .gs.
- Файлы клиентских скриптов должны заканчиваться на «.html». Это касается клиентских файлов .html, .js или .css. Вы также можете локально разрабатывать скрипты с использованием других расширений, но перед импортом на Google Диск важно иметь расширение .html.
- При импорте файлов проекта на Google Диск все существующие данные в этих файлах будут перезаписаны. Вы не можете добавлять или вставлять фрагменты текста; необходимо обновить весь файл.
- Файлы скриптов на стороне сервера должны содержать корректный код JavaScript. Если в файлах .js на сервере есть ошибки, вызов обновления API Google Диска завершится с ошибкой 5xx. Вы можете предотвратить это, выполнив линтинг кода перед импортом.
- Импорт пустых файлов невозможен. При попытке загрузить пустой файл вызов обновления API Google Drive завершится ошибкой 5xx.
- Импортировать и экспортировать можно только автономные скрипты. Доступ к скриптам , привязанным к контейнеру, через API Google Диска невозможен.
- Импортировать и экспортировать можно только исходный код. Такие ресурсы, как свойства проекта или журналы, также не доступны через API Google Диска. Такие действия, как управление версиями скриптов, их публикация и выполнение, через API Google Диска недоступны.
- Вы не ограничены одним серверным файлом
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" } ] }