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 (nicht zu verwechseln mit dem Drive-Dienst in Apps Script).

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

Codeänderungen können in den lokalen Versionen vorgenommen und über die Google Drive API mit dem Apps Script-Projekt synchronisiert werden. Vorhandene Projekte können von 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 voraussichtlich auf „.gs“. Wenn Sie lokal mit .js-Dateien entwickeln möchten, müssen Sie vor dem Importieren in Google Drive die Dateiendung „.gs“ hinzufügen.
  2. Clientseitige Scriptdateien müssen auf „.html“ enden. Dies gilt auch für clientseitige HTML-, JS- oder CSS-Dateien. Auch hier können Sie andere Erweiterungen lokal für die Entwicklung verwenden, es ist jedoch wichtig, dass Sie vor dem Import in Google Drive die HTML-Erweiterung haben.
  3. Wenn Sie Projektdateien in Google Drive importieren, werden alle vorhandenen Daten in diesen Dateien überschrieben. Sie können keinen Teiltext anhängen oder einfügen. Die gesamte Datei muss aktualisiert werden.
  4. Serverseitige Scriptdateien müssen gültigen JavaScript-Code enthalten. Wenn die .js-Serverdateien Fehler enthalten, schlägt der Updateaufruf für die Google Drive API mit einem 5xx-Fehler fehl. Sie können dies verhindern, indem Sie den Code vor dem Import mit Linting verknüpfen.
  5. Leere Dateien können nicht importiert werden. Wenn Sie versuchen, eine leere Datei hochzuladen, schlägt der Update-Aufruf der Google Drive API mit einem 5xx-Fehler fehl.
  6. Nur eigenständige Skripts können importiert oder exportiert werden. Der Zugriff auf containergebundene Skripts ist über die Google Drive API nicht möglich.
  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 Skriptversionsverwaltung, das Veröffentlichen oder Ausführen des Skripts sind über die Google Drive API nicht möglich.
  8. Sie sind nicht auf eine einzelne Code.gs-Serverdatei beschränkt. Zur Erleichterung der Entwicklung können Sie Servercode über 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. Diese API verwendet GET zum Herunterladen von Dateien und PUT/POST zum Hochladen von Dateien. Eine ausführliche Dokumentation und Kurzanleitungen finden Sie auf der Übersichtsseite der Google Drive API.

In diesem Leitfaden geht es hauptsächlich um das Auflisten und Verschieben von Dateien mit der Ressource "Dateien". Dazu werden folgende 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 Ihrer Ablage auflisten möchten, verwenden Sie die Ressource „Dateien“, um Dateien mit dem MIME-Typ application/vnd.google-apps.script abzufragen. Wenn Sie die Antwort so filtern möchten, dass nur Dateien enthalten sind, deren Eigentümer Sie sind, fügen Sie den Suchparameter 'me' in owners ein.

Hier sehen Sie eine Beispielanfrage und -antwort mit einem Array 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 sie 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 eine File-Ressource von der API zurückgegeben wird, enthält das Attribut exportLinks eine URL, die abgerufen werden kann, um die Inhalte des Projekts als JSON-Daten abzurufen. Diese URL könnte beispielsweise so aussehen:

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

Senden Sie eine Anfrage an diese URL, um den Inhalt des Projekts abzurufen. Achten Sie darauf, einen Authorization-Header mit demselben OAuth-Bearer-Token anzugeben.

Hier sehen Sie 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 obige Beispiel enthält Code für eine einfache Webanwendung aus dem Leitfaden für den HTML-Dienst. Sie erhalten ein Array von Files mit jeweils den folgenden vier Attributen:

id Interne Kennung einer Datei in einem Projekt, die erforderlich ist, um bei Aktualisierungen auf diese Datei zu verweisen.
name Der Name der Datei ohne Erweiterungen, wie er im Skripteditor angezeigt wird.
type Es gibt zwei Dateitypen: server_js und HTML.
source Der codierte Quellcode in der Datei.

Projekte in Drive importieren

Um ein vorhandenes Projekt zu aktualisieren, senden Sie einen HTTP-PUT-Aufruf an die API update mit dem entsprechenden fileId. Das folgende Beispiel zeigt eine Beispieltransaktion für den Medien-Upload-Teil. Mit einer der Clientbibliotheken kann Ihre Anwendung Metadaten und die Medien in denselben Uploadaufruf einbeziehen. Der Header Content-Type 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 hinzufügen, gibt das System eine Fehlermeldung aus.

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, aber alle anderen Dateien im Projekt enthält. Alle Dateien, die während des Importvorgangs nicht zurückgeschickt 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 einem neuen name. Beachten Sie, dass der Server alle Versuche, in type zu ändern, ignoriert.

Neues Projekt erstellen

Senden Sie eine POST-Anfrage an die Datei insert API, um ein neues Projekt zu erstellen. Ähnlich wie beim update-Aufruf können Sie eine Clientbibliothek verwenden, um Metadaten wie den Projektnamen und die Beschreibung einzubeziehen.

Hier sehen Sie eine Beispieltransaktion des Medienuploads. Dadurch wird in Drive ein Projekt mit dem Namen „Unbenannt“ erstellt. Der Parameter convert in der URL ist erforderlich. Wie beim update-Aufruf ist 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"
    }
  ]
}