Importowanie i eksportowanie projektów

Projekty Apps Script znajdują się na Dysku Google, więc programiści mogą importować i eksportować kod źródłowy Apps Script za pomocą interfejsu Google Drive API (nie należy go mylić z usługą Dysku w Apps Script).

Programista może na przykład tworzyć nowy kod Apps Script na swoim komputerze lokalnym w ulubionym edytorze kodu i korzystać z systemu kontroli wersji, takiego jak Git, aby współpracować z innymi programistami. Gdy wersja zostanie ukończona, może przesłać (zaimportować) pliki na Dysk Google za pomocą interfejsu REST API, gdzie można ich używać jak w przypadku każdego innego projektu Apps Script.

Zmiany w kodzie można wprowadzać w wersjach lokalnych i synchronizować z projektem Apps Script za pomocą interfejsu Google Drive API. Istniejące projekty można pobrać (wyeksportować) z Dysku Google na komputer lokalny.

Funkcje i ograniczenia

Jeśli chcesz używać interfejsu Google Drive API do importowania lub eksportowania projektów, pamiętaj o tych kwestiach:

  1. Pliki skryptu po stronie serwera powinny kończyć się na „.gs”. Możesz tworzyć skrypty lokalnie, używając plików .js, ale przed zaimportowaniem ich na Dysk Google zmień nazwę, aby zawierała rozszerzenie .gs.
  2. Pliki skryptów po stronie klienta muszą kończyć się rozszerzeniem „.html”. Obejmuje to pliki .html, .js i .css po stronie klienta. Możesz też tworzyć lokalnie za pomocą innych rozszerzeń, ale przed zaimportowaniem do Dysku Google ważne jest, aby mieć rozszerzenie .html.
  3. Gdy zaimportujesz pliki projektu na Dysk Google, wszystkie dotychczasowe dane w tych plikach zostaną zastąpione. Nie możesz dołączać ani wstawiać części tekstu. Musisz zaktualizować cały plik.
  4. Pliki skryptów po stronie serwera muszą zawierać prawidłowy kod JavaScript. Jeśli w plikach .js serwera występują błędy, wywołanie aktualizacji interfejsu Google Drive API zakończy się niepowodzeniem i zostanie zwrócony błąd 5xx. Możesz temu zapobiec, sprawdzając kod przed zaimportowaniem.
  5. Nie można importować pustych plików. Wywołanie aktualizacji interfejsu Google Drive API zakończy się niepowodzeniem i zwróci błąd 5xx, jeśli spróbujesz przesłać pusty plik.
  6. Importować i eksportować można tylko skrypty autonomiczne. Do skryptów powiązanych z kontenerem nie można uzyskać dostępu za pomocą interfejsu Google Drive API.
  7. Importować i eksportować można tylko kod źródłowy. Zasoby takie jak właściwości projektu czy logi nie są też udostępniane przez interfejs Google Drive API. Czynności takie jak przechowywanie wersji skryptu, publikowanie czy wykonywanie skryptu nie są możliwe za pomocą interfejsu Google Drive API.
  8. Nie musisz ograniczać się do jednego pliku Code.gs serwera. Aby ułatwić sobie pracę, możesz rozdzielić kod serwera na kilka plików. Wszystkie pliki serwera są ładowane do tej samej globalnej przestrzeni nazw, więc jeśli chcesz zapewnić bezpieczne hermetyzowanie, używaj klas JavaScript.

Drive API

Interfejs Google Drive API umożliwia programistom programowy dostęp do plików na Dysku Google. Ten interfejs API używa funkcji GET do pobierania plików i PUT/POST do przesyłania plików. Szczegółową dokumentację i szybki start znajdziesz na stronie Omówienie interfejsu Google Drive API.

W tym przewodniku skupimy się na wyświetlaniu i przenoszeniu plików za pomocą zasobu Files przy użyciu tych wywołań:

Autoryzacja

Wszystkie żądania wysyłane do interfejsu Google Drive API muszą być autoryzowane przez użytkownika za pomocą protokołu OAuth 2.0. Więcej informacji znajdziesz w dokumentacji autoryzacji interfejsu Google Drive API.

Oprócz innych zakresów, których może potrzebować aplikacja (np. https://www.googleapis.com/auth/drive), wszystkie aplikacje próbujące importować lub eksportować projekty Google Apps Script muszą żądać specjalnego zakresu:

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

Wyświetlanie listy istniejących projektów

Aby wyświetlić listę wszystkich projektów Apps Script na Dysku, użyj zasobu Files do wyszukiwania plików o typie MIME application/vnd.google-apps.script. Aby odfiltrować odpowiedź tak, aby zawierała tylko pliki, których jesteś właścicielem, uwzględnij parametr wyszukiwania 'me' in owners.

Oto przykładowe żądanie i odpowiedź, które pokazują tablicę projektów Apps Script zwróconych w odpowiedzi 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
  }
 ]
}

Jeśli znasz identyfikator pliku projektu Apps Script, możesz go pobrać bezpośrednio za pomocą tego wywołania interfejsu API:

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

Eksportowanie projektów z Dysku

Gdy otrzymasz z interfejsu API zasób File, właściwość exportLinks będzie zawierać adres URL, z którego możesz pobrać zawartość projektu w postaci danych JSON. Oto przykład, jak może wyglądać ten adres URL:

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

Wyślij żądanie na ten adres URL, aby pobrać zawartość projektu. Upewnij się, że dołączasz nagłówek Authorization z tym samym tokenem OAuth Bearer.

Oto przykładowe żądanie i odpowiedź:

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

Powyższy przykład zawiera kod prostej aplikacji internetowej z przewodnika po usłudze HTML. Pamiętaj, że otrzymasz tablicę Files, z której każdy element ma te 4 właściwości:

id Wewnętrzny identyfikator pliku w projekcie, potrzebny do odwoływania się do tego pliku podczas aktualizacji.
name Nazwa pliku bez rozszerzenia wyświetlana w edytorze skryptów.
type Są to pliki server_js i html.
source Zakodowany kod źródłowy zawarty w pliku.

Importowanie projektów na Dysk

Aby zaktualizować istniejący projekt, wyślij wywołanie HTTP PUT do interfejsu API pliku update z odpowiednim fileId. Poniższy przykład pokazuje przykładową transakcję dotyczącą części przesyłania multimediów. Korzystając z jednej z bibliotek klienta, Twoja aplikacja może łatwo uwzględnić metadane i multimedia w tym samym wywołaniu przesyłania. Pamiętaj, że nagłówek Content-Type określa typ przesyłanych w tym przypadku treści.

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

Tworzenie nowych plików w projekcie

Aby utworzyć nowy plik w projekcie, wyślij PUT prośbę o plik bez właściwości id. Jeśli dołączysz plik z nieznanym identyfikatorem, system wyświetli komunikat o błędzie.

Usuwanie plików w projekcie

Aby usunąć plik z projektu, wyślij żądanie PUT, które nie zawiera tego pliku (ale zawiera wszystkie inne pliki w projekcie). Każdy plik, który nie zostanie odesłany podczas procesu importowania, zostanie usunięty z serwera.

Zmienianie nazw plików w projekcie

Aby zmienić nazwę pliku w projekcie, wyślij PUT z dotychczasowym id, ale nowym name. Pamiętaj, że serwer ignoruje wszelkie próby zmiany na type.

Utwórz nowy projekt

Aby utworzyć nowy projekt, wyślij żądanie POST do interfejsu API pliku insert. Podobnie jak w przypadku wywołania update możesz użyć biblioteki klienta, aby uwzględnić metadane, takie jak nazwa i opis projektu.

Oto przykładowa transakcja przesyłania multimediów. Spowoduje to utworzenie na Dysku projektu o nazwie „Bez tytułu”. W adresie URL wymagany jest parametr convert. Podobnie jak w przypadku wywołania update wymagany jest nagłówek 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"
    }
  ]
}