Importowanie i eksportowanie projektów

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

Programistka może na przykład utworzyć nowy kod Apps Script na komputerze lokalnym za pomocą swojego ulubionego edytora kodu, a do współpracy z innymi deweloperami używać systemu kontroli wersji, takiego jak Git. Po sfinalizowaniu wersji może ona przesłać (zaimportować) pliki na Dysk Google za pomocą interfejsu API REST, skąd będzie można ich używać tak samo jak każdego innego projektu Apps Script.

Zmiany kodu 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 importować lub eksportować projekty za pomocą interfejsu Google Drive API, pamiętaj o tych kwestiach:

  1. Pliki skryptów po stronie serwera powinny mieć na końcu „.gs”. Możesz programować lokalnie, używając plików .js, ale przed zaimportowaniem plików na Dysk Google zmień ich nazwę, aby uwzględnić rozszerzenie .gs.
  2. Pliki skryptu po stronie klienta muszą kończyć się rozszerzeniem „.html”. Dotyczy to też plików .html, .js i .css po stronie klienta. Możesz także tworzyć treści lokalnie, korzystając z innych rozszerzeń, ale przed zaimportowaniem danych na Dysk Google ważne jest, aby mieć rozszerzenie .html.
  3. Gdy zaimportujesz pliki projektu na Dysk Google, wszystkie dane w tych plikach zostaną zastąpione. Nie można dołączyć ani wstawić częściowego tekstu. Cały plik musi zostać zaktualizowany.
  4. Pliki skryptów po stronie serwera muszą zawierać prawidłowy kod JavaScript. Jeśli pliki .js serwera zawierają błędy, wywołanie aktualizacji interfejsu Google Drive API zakończy się niepowodzeniem 5xx. Możesz temu zapobiec, lintując kod przed jego zaimportowaniem.
  5. Nie można zaimportować pustych plików. Wywołanie aktualizacji interfejsu Google Drive API zakończy się niepowodzeniem i wywołaniem błędu 5xx, jeśli spróbujesz przesłać pusty plik.
  6. Można importować i eksportować tylko samodzielne skrypty. Nie można uzyskać dostępu do skryptów powiązanych z kontenerem za pomocą interfejsu Google Drive API.
  7. Można importować i eksportować tylko kod źródłowy. Zasoby, takie jak właściwości i logi projektu, również nie są udostępniane przez interfejs Google Drive API. Działania, takie jak obsługa wersji skryptów, publikowanie lub 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 programowanie, możesz rozłożyć kod serwera na kilka plików. Wszystkie pliki serwera są wczytywane w tej samej globalnej przestrzeni nazw, dlatego jeśli chcesz zapewnić ich bezpieczne zamknięcie, używaj klas JavaScript.

Drive API

Interfejs Google Drive API pozwala programistom na programowy dostęp do plików na Dysku Google. Ten interfejs API używa metody GET do pobierania plików i PUT/POST do przesyłania plików. Na stronie z omówieniem interfejsu Google Drive API znajdziesz szczegółową dokumentację i krótkie wprowadzenia.

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

Upoważnienie

Wszystkie żądania wysyłane do interfejsu Google Drive API muszą być autoryzowane przez użytkownika przy użyciu 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 (na przykład 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świetlenie listy istniejących projektów

Aby wyświetlić wszystkie projekty Apps Script na Dysku, użyj zasobu Pliki, aby wyszukać pliki z typem MIME application/vnd.google-apps.script. Aby w odpowiedzi uwzględnić tylko pliki należące do Ciebie, dodaj parametr wyszukiwania 'me' in owners.

Oto przykładowe żądanie i odpowiedź, które wyświetlają tablicę projektów Apps Script zwracanych 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, używając tego wywołania interfejsu API:

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

Eksportowanie projektów z Dysku

Gdy pobierzesz z interfejsu API zasób File, właściwość exportLinks będzie zawierać adres URL do pobrania zawartości projektu w postaci danych JSON. Oto przykładowy adres URL:

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

Wyślij żądanie na ten adres URL, aby pobrać zawartość samego projektu. Pamiętaj, aby dołączyć 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. Zauważ, że zwracasz tablicę typu Files, z których każda ma 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 rozszerzeń wyświetlana w edytorze skryptów.
type Dostępne są 2 typy plików:server_js i html.
source Zakodowany kod źródłowy w pliku.

Importuj projekty na Dysk

Aby zaktualizować istniejący projekt, wykonaj wywołanie HTTP PUT do pliku update API z odpowiednim fileId. Przykład poniżej pokazuje przykładową transakcję dotyczącą części przesyłania multimediów. Korzystając z jednej z bibliotek klienta, aplikacja może łatwo dołączyć metadane i multimedia w tym samym wywołaniu przesyłania. Pamiętaj, że nagłówek Content-Type określa typ treści, które przesyłasz w tym przypadku.

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 dotyczące pliku bez właściwości id. Jeśli dołączysz plik o nieznanym identyfikatorze, system zgłosi 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 obejmuje wszystkie inne pliki w projekcie). Wszystkie pliki, które nie zostaną odesłane podczas importu, zostaną usunięte z serwera.

Zmienianie nazw plików w projekcie

Aby zmienić nazwę pliku w projekcie, wyślij żądanie PUT z istniejącymi elementami id, ale nowymi name. Pamiętaj, że serwer ignoruje wszystkie próby zmiany na type.

Utwórz nowy projekt

Aby utworzyć nowy projekt, wyślij żądanie POST do pliku insert API. Podobnie jak w przypadku wywołania update, za pomocą biblioteki klienta możesz dołączyć metadane, takie jak nazwa i opis projektu.

Oto przykładowa transakcja dotycząca przesł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, 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"
    }
  ]
}