Projekte importieren und exportieren

Da sich Apps Script-Projekte in Google Drive befinden, können Entwickler Apps Script-Quellcode mithilfe der Google Drive API importieren und exportieren. Diese API ist nicht mit dem Drive-Dienst in Apps Script zu verwechseln.

So kann ein Entwickler beispielsweise neuen Apps Script-Code auf seinem lokalen Computer mit seinem bevorzugten Code-Editor erstellen und ein Versionskontrollsystem wie Git verwenden, um mit anderen Entwicklern zusammenzuarbeiten. Wenn eine Version fertig ist, kann sie die Dateien mit der REST API in Google Drive hochladen (importieren). Dort können sie wie jedes andere Apps Script-Projekt verwendet werden.

Codeänderungen können an den lokalen Versionen vorgenommen und mithilfe der Google Drive API mit dem App Script-Projekt synchronisiert werden. Vorhandene Projekte können aus Google Drive auf einen lokalen Computer heruntergeladen (exportiert) werden.

Funktionen und Einschränkungen

Wenn Sie die Google Drive API zum Importieren oder Exportieren von Projekten verwenden möchten, beachten Sie Folgendes:

  1. Serverseitige Scriptdateien enden normalerweise auf „.gs“. Sie können die Entwicklung lokal mit .js-Dateien durchführen. Achten Sie aber darauf, die Dateien vor dem Importieren in Google Drive in .gs umzubenennen.
  2. Clientseitige Scriptdateien müssen auf „.html“ enden. Dazu gehören clientseitige .html-, .js- oder .css-Dateien. Auch hier können Sie lokal mit anderen Erweiterungen entwickeln. Es ist jedoch wichtig, dass die Datei die Erweiterung „.html“ hat, bevor Sie sie in Google Drive importieren.
  3. Wenn Sie Projektdateien in Google Drive importieren, werden alle vorhandenen Daten in diesen Dateien überschrieben. Sie können keinen Text anhängen oder einfügen, sondern die gesamte Datei muss aktualisiert werden.
  4. Serverseitige Scriptdateien müssen gültiges JavaScript enthalten. Wenn in Ihren Server-JS-Dateien Fehler vorhanden sind, schlägt der Google Drive API-Updateaufruf mit einem 5xx-Fehler fehl. Sie können dies verhindern, indem Sie Ihren Code vor dem Importieren linten.
  5. Leere Dateien können nicht importiert werden. Der Google Drive API-Updateaufruf schlägt mit einem 5xx-Fehler fehl, wenn Sie versuchen, eine leere Datei hochzuladen.
  6. Nur eigenständige Scripts können importiert oder exportiert werden. Auf an einen Container gebundene Scripts kann nicht über die Google Drive API zugegriffen werden.
  7. Nur Quellcode kann importiert oder exportiert werden. Ressourcen wie Projekteigenschaften oder Protokolle werden ebenfalls nicht über die Google Drive API freigegeben. Aktionen wie die Scriptversionierung, ‑veröffentlichung oder ‑ausführung sind über die Google Drive API nicht möglich.
  8. Sie sind nicht auf eine einzelne Server-Code.gs-Datei beschränkt. Sie können den Servercode zur Vereinfachung der Entwicklung auf mehrere Dateien verteilen. Alle Serverdateien werden in denselben globalen Namespace geladen. Verwenden Sie daher JavaScript-Klassen, wenn Sie eine sichere Kapselung bereitstellen möchten.

Drive API

Mit der Google Drive API können Entwickler programmatisch auf Dateien in Google Drive zugreifen. Bei dieser API werden Dateien mit GET heruntergeladen und mit PUT/POST hochgeladen. Ausführliche Dokumentation und Schnellstarts finden Sie auf der Übersichtsseite der Google Drive API.

In diesem Leitfaden geht es hauptsächlich darum, Dateien mit der Dateiressource aufzulisten und zu verschieben. Dazu werden die folgenden Aufrufe verwendet:

Autorisierung

Alle Anfragen an die Google Drive API müssen von einem authentifizierten Nutzer über das OAuth 2.0-Protokoll autorisiert werden. Weitere Informationen finden Sie in der Autorisierungsdokumentation für die Google Drive API.

Zusätzlich zu anderen Bereichen, die eine Anwendung möglicherweise benötigt (z. B. https://www.googleapis.com/auth/drive), müssen alle Anwendungen, die versuchen, Google Apps Script-Projekte zu importieren oder zu exportieren, den speziellen Bereich anfordern:

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

Vorhandene Projekte auflisten

Wenn Sie alle Apps Script-Projekte in Google Drive auflisten möchten, verwenden Sie die Dateiressource, um nach Dateien mit dem MIME-Typ application/vnd.google-apps.script zu suchen. Wenn Sie die Antwort so filtern möchten, dass nur Dateien enthalten sind, deren Eigentümer Sie sind, geben Sie den Suchparameter 'me' in owners an.

Hier sehen Sie eine Beispielanfrage und ‑antwort mit einer Reihe von Apps Script-Projekten, die über eine JSON-Antwort zurückgegeben werden.

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

Wenn Sie die Datei-ID eines Apps Script-Projekts kennen, können Sie es mit dem folgenden API-Aufruf direkt abrufen:

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

Projekte aus Drive exportieren

Sobald du eine File-Ressource von der API zurückerhältst, enthält die Property exportLinks eine URL, über die der Inhalt des Projekts als JSON-Daten abgerufen werden kann. Hier ist ein Beispiel für eine solche URL:

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

Stelle eine Anfrage an diese URL, um den Inhalt des Projekts abzurufen. Fügen Sie einen Authorization-Header mit demselben OAuth-Bearer-Token ein.

Hier ist eine Beispielanfrage und -antwort:

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

Das Beispiel oben enthält Code für eine einfache Webanwendung aus dem Leitfaden HTML-Dienst. Hinweis: Sie erhalten ein Array von Files mit den folgenden vier Eigenschaften:

id Interne Kennung einer Datei in einem Projekt, die für die Referenzierung dieser Datei bei Updates erforderlich ist.
name Der Name der Datei ohne Erweiterung, wie er im Script-Editor angezeigt wird.
type Die beiden Dateitypen sind „server_js“ und „html“.
source Der in der Datei enthaltene codierte Quellcode.

Projekte in Drive importieren

Wenn Sie ein bestehendes Projekt aktualisieren möchten, führen Sie einen HTTP-PUT-Aufruf an die Datei update API mit der entsprechenden fileId aus. Das folgende Beispiel zeigt eine Beispieltransaktion für den Teil zum Hochladen von Medien. Mit einer der Clientbibliotheken können Sie Metadaten und Medien ganz einfach in einem einzigen Uploadaufruf in Ihre Anwendung einbinden. Der Content-Type-Header gibt in diesem Fall den Typ der hochgeladenen Inhalte an.

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

Neue Dateien in einem Projekt erstellen

Wenn Sie eine neue Datei in einem Projekt erstellen möchten, senden Sie eine PUT-Anfrage für eine Datei ohne das Attribut id. Wenn Sie eine Datei mit einer unbekannten Kennung angeben, wird vom System eine Fehlermeldung ausgegeben.

Dateien in einem Projekt löschen

Wenn Sie eine Datei aus einem Projekt löschen möchten, senden Sie eine PUT-Anfrage, die diese Datei nicht enthält, aber alle anderen Dateien im Projekt. Alle Dateien, die während des Importvorgangs nicht zurückgesendet werden, werden vom Server gelöscht.

Dateien in einem Projekt umbenennen

Wenn Sie eine Datei in einem Projekt umbenennen möchten, senden Sie eine PUT-Anfrage mit der vorhandenen id, aber einer neuen name. Der Server ignoriert alle Versuche, zu type zu wechseln.

Neues Projekt erstellen

Senden Sie zum Erstellen eines neuen Projekts eine POST-Anfrage an die Datei-insert API. Ähnlich wie beim update-Aufruf können Sie mit einer Clientbibliothek Metadaten wie den Projektnamen und die Projektbeschreibung angeben.

Hier ist eine Beispieltransaktion für den Medienupload. Dadurch wird in Google Drive ein Projekt mit dem Namen „Untitled“ (Ohne Titel) erstellt. Der Parameter convert in der URL ist erforderlich. Wie beim update-Aufruf ist auch hier der Content-Type-Header erforderlich.

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