Importowanie i eksportowanie projektów

Projekty Google Apps Script znajdują się na Dysku Google, więc deweloperzy 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).

Deweloper może na przykład tworzyć nowy kod Apps Script na swoim komputerze lokalnym w ulubionym edytorze kodu i używać systemu kontroli wersji, takiego jak Git, do współpracy z innymi deweloperami. 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ń ich nazwę, aby zawierała rozszerzenie .gs.
  2. Pliki skryptu 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. Jeśli spróbujesz przesłać pusty plik, wywołanie aktualizacji interfejsu API Dysku Google zakończy się niepowodzeniem i zostanie zwrócony błąd 5xx.
  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. Interfejs Google Drive API nie udostępnia też zasobów takich jak właściwości projektu czy logi. Za pomocą interfejsu Google Drive API nie można wykonywać takich działań jak przechowywanie wersji skryptu, publikowanie czy uruchamianie skryptu.
  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 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 uwierzytelnionego 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, które próbują importować lub eksportować projekty Google Apps Script, muszą żądać specjalnego zakresu:

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

Aby przetestować te przykładowe żądania, użyj tokena okaziciela OAuth 2.0 uzyskanego z OAuth 2.0 Playground.

Wyświetlanie listy istniejących projektów

Aby wyświetlić listę wszystkich projektów Apps Script na Dysku, użyj zasobu Pliki, aby wyszukać pliki o typie MIME application/vnd.google-apps.script. Aby filtrować odpowiedź i uwzględniać w niej tylko pliki, których jesteś właścicielem, dodaj 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

Identyfikator pliku projektu nie jest taki sam jak klucz projektu. Identyfikator pliku to ciąg alfanumeryczny w adresie URL projektu.

Eksportowanie projektów z Dysku

Gdy interfejs API zwróci zasób File, właściwość exportLinks będzie zawierać adres URL, z którego można 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"
    }
  ]
}

W przykładzie powyżej znajduje się kod aplikacji internetowej z przewodnika HTML Service. Otrzymasz tablicę obiektów Files, z których każdy 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, aplikacja może łatwo uwzględnić metadane i multimedia w tym samym wywołaniu przesyłania. 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 żądanie PUT pliku 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 importu, zostanie usunięty z serwera.

Zmienianie nazw plików w projekcie

Aby zmienić nazwę pliku w projekcie, wyślij PUT z dotychczasowym id, ale z nowym name. 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”. Parametr convert w adresie URL jest wymagany. Podobnie jak w przypadku wywołania update, nagłówek Content-Type jest wymagany.

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