Big Data in Erkenntnisse verwandeln – mit Google Tabellen und Google Präsentationen

Es gibt viele Tools, mit denen Data Scientists Big-Data-Analysen durchführen können. Aber müssen Sie die Ergebnisse nicht trotzdem der Geschäftsleitung gegenüber rechtfertigen? Blanke Zahlenreihen auf Papier oder in einer Datenbank sind denkbar ungeeignet, um sie wichtigen Stakeholdern zu präsentieren. In diesem Codelab für Fortgeschrittene zu Google Apps Script nutzen Sie zwei Google-Plattformen für Entwickler, mit denen Sie Ihre Daten in ein geeignetes Format bringen: die G Suite und die Google Cloud Platform (GCP).

Mit den Entwicklertools von Google Cloud können Sie eine detaillierte Datenanalyse durchführen, die Ergebnisse in eine Tabelle einfügen und eine Folienpräsentation mit diesen Daten erstellen. So können Sie die Ergebnisse der Führungsebene besser präsentieren. In diesem Codelab arbeiten Sie mit der BigQuery der Google Cloud Platform (als erweiterten Dienst von Apps Script) und mit den integrierten Apps Script-Diensten für Google Sheets und Google Präsentationen.

Motivation/Stand der Technik

Die Beispiel-App in diesem Codelab wurde von diesen anderen Codebeispielen inspiriert…

Die Beispiel-App im Codelab zur Google Slides API enthält zwar auch BigQuery und Google Präsentationen, unterscheidet sich aber in einigen Punkten von der Beispiel-App in diesem Codelab:

  • Node.js-App im Vergleich zu unserer Apps Script-App
  • Verwendet REST APIs, während wir Apps Script-Dienste verwenden
  • Verwendet Google Drive, aber nicht Google Sheets, während diese App Sheets, aber nicht Drive verwendet

In diesem Codelab wollten wir so viele Technologien wie möglich in einer einzigen App zusammenführen und gleichzeitig Funktionen und APIs aus der gesamten Google Cloud auf eine Weise präsentieren, die einem realen Anwendungsfall besser entspricht. Ziel des Labs ist, Sie zu inspirieren, Ihrer Fantasie freien Lauf zu lassen und sowohl die GCP als auch die G Suite zu nutzen, um schwierige Probleme für Ihr Unternehmen oder Ihre Kunden zu lösen.

Lerninhalte

  • Google Apps Script mit mehreren Google-Diensten (GCP und G Suite) verwenden
  • Mit Google BigQuery eine Big-Data-Analyse durchführen
  • Daten in einer Google-Tabelle darstellen
  • Neues Diagramm in Google Tabellen erstellen
  • Diagramme und Daten aus Google Sheets in eine Google-Präsentation übertragen

Voraussetzungen

  • Zugriff auf das Internet und einen Webbrowser
  • Ein Google-Konto (für G Suite-Konten ist möglicherweise die Genehmigung durch den Administrator erforderlich)
  • Grundkenntnisse in JavaScript
  • Apps Script-Entwicklungskenntnisse können hilfreich sein, sind aber nicht erforderlich.

Wie werden Sie dieses Codelab/diese Anleitung verwenden?

Ich lese es mir zur Information durch und leite es gegebenenfalls an technische Kollegen weiter. Ich arbeite es so weit wie möglich durch und versuche, so viele Übungen wie möglich zu machen. Ich werde das gesamte Codelab auf jeden Fall durcharbeiten.

Wie würden Sie Ihre Erfahrungen mit den G Suite-Entwicklertools und ‑APIs bewerten?

Anfänger Fortgeschrittene Experten

Wie würden Sie Ihre Erfahrungen mit Apps Script bewerten?

Anfänger Fortgeschrittene Experten

Wie würden Sie Ihre Erfahrungen mit GCP-Entwicklertools und ‑APIs bewerten?

Anfänger Mittelstufe Fortgeschritten

Jetzt wissen Sie, worum es in diesem Codelab geht. Was genau werden Sie tun?

  1. Ein vorhandenes Apps Script-BigQuery-Beispiel verwenden
  2. Anhand dieses Beispiels erfahren Sie, wie Sie eine Abfrage an BigQuery senden und die Ergebnisse abrufen.
  3. Google-Tabelle erstellen und Ergebnisse aus BigQuery einfügen
  4. Ändern Sie den Code ein wenig, um die zurückgegebenen und der Tabelle hinzugefügten Daten leicht zu verändern.
  5. Sheets-Dienst in Apps Script verwenden, um ein Diagramm für die Daten aus BigQuery zu erstellen
  6. Mit dem Google Präsentationen-Dienst eine neue Präsentation erstellen
  7. Der Titelfolie, die bei allen neuen Präsentationen automatisch erstellt wird, einen Titel und Untertitel hinzufügen
  8. Neue Folie mit einer Datentabelle erstellen und dann die Datenzellen der Tabelle importieren
  9. Fügen Sie eine weitere neue Folie hinzu und fügen Sie das Tabellendiagramm ein.

Sehen wir uns zuerst einige Hintergrundinformationen zu Apps Script, BigQuery, Google Sheets und Google Präsentationen an.

Google Apps Script und BigQuery

Google Apps Script ist eine Entwicklungsplattform für G Suite-Apps, die auf höherer Ebene als die REST APIs von Google eingestuft wird. Hier finden Entwickler mit den unterschiedlichsten Kenntnissen eine serverlose Umgebung für die Entwicklung und das Hosting von Anwendungen. Kodiert wird in JavaScript. Damit lassen sich G Suite-Apps einfach automatisieren, erweitern und in andere Anwendungen einbinden.

Ähnlich wie Node.js ist AppsScript eine serverseitige JavaScript-Plattform. Ihr Schwerpunkt liegt jedoch nicht beim asynchronen, ereignisgetriebenen Hosting von Anwendungen, sondern bei der Einbindung in die G Suite und andere Google-Dienste. Deshalb unterscheidet sich die Entwicklungsumgebung grundlegend von den meisten anderen. mit folgenden Vorteilen:

  • Sie können Code entweder im browserbasierten Editor schreiben oder auch lokal, wenn Sie clasp nutzen, das Deployment-Tool für Apps Script, das in der Befehlszeile ausgeführt wird.
  • Code in einer speziellen Version von JavaScript schreiben, die für den Zugriff auf die G Suite und andere Google- oder externe Dienste (über die Apps Script-Dienste URLfetch oder Jdbc) angepasst ist
  • Schreiben von Autorisierungscode entfällt – das übernimmt Apps Script
  • Hosten entfällt – Ihre Anwendung läuft auf den Google-Servern in der Cloud

HINWEIS: In diesem Codelab lernen Sie nicht, wie Sie Apps Script verwenden. Hilfe dazu erhalten Sie in den umfassenden Online-Ressourcen. In der offiziellen Dokumentation finden Sie eine Übersicht mit Schnellstartanleitungen, ausführlichen Anleitungen und Videos. Vergessen Sie nicht das Einführungs-Codelab zu Apps Script, das Sie vor diesem Codelab durcharbeiten sollten.

Es gibt zwei Möglichkeiten, wie Apps Script mit anderen Google-Technologien interagieren kann:

  • integrierter/nativer Dienst
  • Erweiterte Dienste

Ein integrierter Dienst bietet Top-Level-Methoden für den Zugriff auf G Suite- oder Google-Produktdaten und andere nützliche Hilfsmethoden. Ein erweiterter Dienst ist lediglich ein Thin Wrapper um eine G Suite- oder REST API von Google. Erweiterte Dienste bieten eine uneingeschränkte Nutzung der REST API und können oft mehr als integrierte Dienste. Ihr Code ist etwas komplexer, aber immer noch einfacher zu handhaben als die REST API selbst. Um überhaupt nutzbar zu sein, müssen erweiterte Dienste für ein Skriptprojekt aktiviert werden.

Nach Möglichkeit sollten Entwickler einen integrierten Dienst bevorzugen, da diese einfacher zu verwenden sind und mehr leisten als erweiterte Dienste. Einige Google-APIs haben jedoch keine integrierten Dienste. Dann ist die einzige Option ein erweiterter Dienst. Ein Beispiel dafür ist Google BigQuery: Es gibt keinen integrierten, dafüraber einen erweiterten BigQuery-Dienst. (Und das ist allemal besser als gar kein Dienst.) Falls Sie BigQuery noch nicht kennen: Es handelt es sich um einen GCP-Dienst, mit dem Sie einfache (oder komplexe) Abfragen für sehr große Datasets mit einer Größe von mehreren Terabyte durchführen können. Die Ergebnisse sind innerhalb weniger Sekunden verfügbar.

Aus Apps Script auf Google Sheets und Präsentationen zugreifen

Im Gegensatz zu BigQuery sind Google Sheets und Google Präsentationen mit beiden Apps Script-Dienstarten ausgestattet: den integrierten und den erweiterten. So können die Anwendungen auch auf Funktionen zugreifen, die nur in der API, aber nicht integriert vorhanden sind. Bevor Sie mit dem Code arbeiten, sollten Sie sich die Dokumentation zu den integrierten Diensten Sheets und Präsentationen ansehen. Natürlich gibt es auch Dokumentationen für die erweiterten Dienste. Hier finden Sie die Dokumentationen für Google Sheets und Google Präsentationen.

Einführung

Die erste Aufgabe nimmt viel Platz in diesem Codelab ein. Wenn Sie diesen Abschnitt abgeschlossen haben, sind Sie mit dem gesamten Codelab etwa zur Hälfte fertig. In mehreren Unterabschnitten werden Sie Folgendes tun:

  • Ein neues Google Apps Script-Projekt beginnen
  • Zugriff auf den erweiterten BigQuery-Dienst aktivieren
  • Entwicklungseditor aufrufen und den Quellcode der Anwendung eingeben
  • Autorisierungsprozess (OAuth2) der Anwendung durchlaufen
  • Anwendung ausführen, die eine Anfrage an BigQuery sendet
  • Neue Google Tabelle aufrufen, die aus den BigQuery-Ergebnissen erstellt wurde

Einrichtung

  1. a) Erstellen Sie ein neues Apps Script-Projekt. Rufen Sie dazu script.google.com auf. Es gibt verschiedene G Suite-Versionen. Je nachdem, welche Sie nutzen, ist die Erstellung eines neuen Projekts jeweils etwas unterschiedlich. Wenn Sie nur Ihr Gmail-Konto verwenden und noch keine Projekte entwickelt haben, wird ein leerer Bildschirm mit einer Schaltfläche zum Erstellen Ihres ersten Projekts angezeigt:


b) Andernfalls sehen Sie möglicherweise alle Ihre Projekte und oben links die Schaltfläche + Neu .Klicken Sie darauf.



c) Wenn keines der oben genannten Szenarien zutrifft, sieht Ihr Bildschirm möglicherweise so aus: Suchen Sie in diesem Fall links oben nach dem Dreistrich-Menü und wählen Sie + Neues Script aus.



d) Für alle, die die Befehlszeile bevorzugen. Ihr Tool ist clasp. Sie führen den Befehl clasp create aus.

e) Die letzte Möglichkeit, ein neues Skriptprojekt zu erstellen, besteht darin, einfach den folgenden Shortcut-Link aufzurufen: https://script.google.com/create.

  1. Unabhängig davon, welche Methode Sie zum Starten eines neuen Projekts verwendet haben, sollten Sie im Apps Script-Codeeditor landen. Dieser Bildschirm sieht so aus:


  2. Klicken Sie auf Datei > Speichern und geben Sie Ihrem Projekt einen Namen.
  3. Als Nächstes müssen Sie ein Google Cloud Console-Projekt erstellen, um BigQuery-Abfragen auszuführen.
  1. Erstellen Sie ein neues Projekt, geben Sie ihm einen Namen, wählen Sie ein Rechnungskonto aus und klicken Sie auf ERSTELLEN.
  1. Wenn das Projekt erstellt wurde, wird oben rechts auf der Seite eine Benachrichtigung angezeigt. Klicken Sie auf den Eintrag Projekt erstellen: <Projektname>, um das Projekt zu öffnen.
  2. Klicken Sie oben links auf das Menüsymbol  und rufen Sie APIs und Dienste > Anmeldedaten auf. Klicken Sie auf den Tab OAuth-Zustimmungsbildschirm (Direktlink).
  3. Geben Sie im Feld Name der Anwendung „Big Data Codelab“ ein und klicken Sie unten auf die Schaltfläche Speichern.
  4. Klicken Sie rechts oben auf das Dreipunkt-Menü , um das Menü zu maximieren, und wählen Sie Projekteinstellungen aus(Direktlink).
  5. Kopieren Sie den Wert, der unter Projektnummer aufgeführt ist. Es gibt ein separates Feld Produkt-ID, das wir später im Codelab verwenden.
  6. Klicken Sie im App Script-Editor auf Ressourcen > Cloud Platform-Projekt.
  7. Geben Sie die Projektnummer in das Textfeld ein und klicken Sie auf Projekt festlegen. Wenn Sie dazu aufgefordert werden, klicken Sie auf Bestätigen.
  8. Klicken Sie auf die Schaltfläche Schließen, um das Dialogfeld zu schließen.
  9. Nachdem Sie ein neues Projekt eingerichtet haben, müssen Sie den erweiterten BigQuery-Dienst aktivieren. Klicken Sie dazu auf Ressourcen > Erweiterte Google-Dienste und aktivieren Sie die BigQuery API.


  10. Unten im Dialogfeld wird folgender Hinweis angezeigt: „Diese Dienste müssen auch im Google Cloud Platform API-Dashboard aktiviert werden.“ Klicken Sie auf diesen Link, um einen weiteren Browsertab mit der Entwicklerkonsole (kurz „devconsole“) zu öffnen.
  11. Klicken Sie in der Developer Console oben auf die Schaltfläche + APIs und Dienste aktivieren, suchen Sie nach „bigquery“, wählen Sie die BigQuery API aus (nicht die BigQuery Data Transfer API) und klicken Sie auf Aktivieren, um sie zu aktivieren. Lassen Sie diesen Browsertab geöffnet.

    HINWEIS: Nachdem die API aktiviert wurde, wird auf dieser Seite möglicherweise eine Meldung wie „Um diese API zu verwenden, müssen Sie Anmeldedaten erstellen…“ angezeigt. Das ist aber kein Problem, da Apps Script diesen Schritt für Sie übernimmt.


  12. Sie befinden sich immer noch im Menü „Erweiterte Google-Dienste“. Klicken Sie auf OK, um das Dialogfeld zu schließen. Sie bleiben im Code-Editor. Klicken Sie oben auf den Projektnamen und geben Sie einen beliebigen Titel ein, z. B. „BigQuery-Demo“. Wir haben unser Projekt „Letzte Meile“ genannt.

Jetzt ist alles vorbereitet. Sie können den Anwendungscode eingeben, den Autorisierungsprozess durchlaufen und die Anwendung zum ersten Mal in Aktion sehen.

Anwendung hochladen und ausführen

  1. Kopieren Sie den Code im folgenden Feld und ersetzen Sie damit sämtlichen Code im Codeeditor:
// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into Sheet. You must enable
 * the BigQuery advanced service before you can run this code.
 * @see http://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see http://github.com/googleworkspace/apps-script-samples/blob/main/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BQ job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the new results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to Sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
}


Speichern Sie die gerade erstellte Datei und benennen Sie sie von Code.gs in bq-sheets-slides.js um. Welche Funktionen stecken nun in dem Code? Sie wissen bereits, dass damit eine BigQuery-Abfrage durchgeführt wird und die Ergebnisse in eine neue Google-Tabelle geschrieben werden. Aber was genau wird abgefragt? Sie finden sie oben auf der Seite runQuery():

SELECT
    LOWER(word) AS word,
    SUM(word_count) AS count
FROM [bigquery-public-data:samples.shakespeare]
GROUP BY word
ORDER BY count
DESC LIMIT 10


Diese Abfrage durchsucht die Werke von Shakespeare, die Teil des öffentlichen BigQuery-Datasets sind, und gibt die zehn meist genutzten Wörter in all seinen Werken zurück, absteigend sortiert nach ihrer Häufigkeit. Stellen Sie sich vor, Sie müssten diese Aufgabe manuell erledigen! Das gibt Ihnen eine Vorstellung davon, wie nützlich BigQuery ist.

  1. Wir sind fast so weit, dass wir es ausprobieren können. Wie Sie oben in diesem Code-Snippet sehen, ist eine gültige Projekt-ID erforderlich. Wir müssen also Ihre Projekt-ID in den Anwendungscode einfügen. Kehren Sie dazu zum Browserfenster oder ‑tab mit der Seite der Entwicklerkonsole zurück. (Wir haben dir gesagt, dass du sie offen lassen sollst, erinnerst du dich?)
  2. Klicken Sie oben links neben Ihrem Google-Konto-Avatar auf das Drop-down-Menü () und wählen Sie Projekteinstellungen aus. Sie sehen den Projektnamen, die Projekt-ID und die Projektnummer. Kopieren Sie die Projekt-ID und legen Sie die Variable PROJECT_ID oben in bq-sheets-slides.js auf den Wert fest, den Sie in der Entwicklerkonsole erhalten haben. HINWEIS: Wenn sich die Menüauswahl nicht mehr bewegen oder bedienen lässt, aktualisieren Sie die Seite.
  3. Die if-Anweisung soll verhindern, dass die Anwendung ohne eine gültige Projekt-ID weiter ausgeführt wird. Speichern Sie die Datei und führen Sie den Code aus. Klicken Sie dazu in der Menüleiste auf Ausführen > Funktion ausführen > runQuery. Klicken Sie dann im Dialogfeld Berechtigungen ansehen auf Diese App ist nicht verifiziert. Unten sehen Sie ein animiertes GIF (für eine andere App), in dem die nächsten Schritte veranschaulicht werden:
  4. Wenn Sie die Berechtigungen überprüfen lassen möchten, wird ein neues Dialogfeld angezeigt (siehe oben). Wählen Sie das richtige Google-Konto aus, mit dem das Skript ausgeführt werden soll, wählen Sie Erweitert aus, scrollen Sie nach unten und klicken Sie dann auf „Zu <IHR PROJEKTNAME> (unsicher) wechseln“, um zum Bildschirm für die OAuth2-Anwendungsautorisierung zu gelangen. Weitere Informationen zum Überprüfungsprozess


    HINWEIS:Wenn Sie die App einmal autorisiert haben, brauchen Sie den Vorgang bei den folgenden Ausführungen nicht mehr wiederholen. Der Dialog taucht erst weiter unten in Aufgabe 3 dieses Tutorials wieder auf. Dann erteilen Sie die Berechtigung, dass die Anwendung Google-Präsentationen erstellen und verwalten darf.
  5. Sobald Sie im OAuth2-Dialogfeld auf Zulassen klicken, wird das Skript ausgeführt. Oben wird ein pastellgelbes Dialogfeld angezeigt. Sie wird relativ schnell ausgeführt. Möglicherweise bemerken Sie daher nicht, dass sie ausgeführt wird oder dass die Ausführung abgeschlossen ist.

  6. Sobald die Ausführung beendet ist, verschwindet das Dialogfeld. Wenn Sie es also nicht sehen, wurde die Funktion wahrscheinlich bereits ausgeführt. Gehen Sie zu Google Drive (drive.google.com) und suchen Sie die neue Google-Tabelle mit dem Namen „Most common words in all of Shakespeare's works“ (Die häufigsten Wörter in den Werken Shakespeares) bzw. dem Namen, den Sie in der Variablen QUERY_NAME festgelegt haben:


  7. Öffnen Sie die Tabelle. Sie sollten darin zehn Zeilen mit in absteigender Reihenfolge nach der Häufigkeit ihres Vorkommens sortierten Wörtern vorfinden:

Zusammenfassung von Aufgabe 1

Sie haben Code ausgeführt, der alle Werke Shakespeares abgefragt hat. Es gibt sicherlich noch größere Datenmengen, aber selbst bei dieser Menge Text wäre es schwierig für Sie geworden, alle Wörter aller Werke zu erfassen, ihre jeweilige Anzahl zu notieren und ihre Häufigkeit dann noch in absteigender Reihenfolge zu sortieren. Sie haben nicht nur BigQuery angewiesen, diese Aufgabe für Sie zu erledigen, sondern auch den integrierten Dienst in Apps Script für Google Sheets genutzt, um die Daten in ein leicht verständliches Format zu bringen.

Der Code für bq-sheets-slides.js (unser ausgewählter Dateiname), den Sie oben eingefügt haben (abgesehen von PROJECT_ID, das eine echte Projekt-ID enthalten sollte), ist auch im Ordner step1 im GitHub-Repository dieses Codelabs unter github.com/googlecodelabs/bigquery-sheets-slides verfügbar. Der Code wurde durch das Originalbeispiel auf der Seite „BigQuery Advanced Services“ inspiriert, in dem eine etwas andere Abfrage ausgeführt wurde: Welche Wörter mit mindestens 10 Zeichen hat Shakespeare am häufigsten verwendet? Sie können sich das Beispiel auch im GitHub-Repository ansehen.

Wenn Sie sich für andere Anfragen interessieren, die Sie für Shakespeares Werke oder andere öffentliche Datentabellen ausprobieren können, sehen Sie sich auch diese und diese Webseite an. Unabhängig davon, welche Abfrage Sie verwenden, können Sie sie jederzeit in der BigQuery-Konsole testen, bevor Sie sie in Apps Script ausführen. Die Benutzeroberfläche von BigQuery ist für Entwickler unter bigquery.cloud.google.com verfügbar. So sieht unsere Abfrage beispielsweise in der BigQuery-UI aus:

Bei den obigen Schritten wurde der Codeeditor von Apps Script verwendet. Sie können aber auch lokal über die Befehlszeile entwickeln. Sie können auch ein Skript mit dem Namen bq-sheets-slides.js erstellen, den oben stehenden Code einfügen und es dann mit dem Befehl clasp push in Google hochladen. (Falls Sie ihn zuvor übersehen haben, finden Sie clasp und eine Anleitung zur Verwendung hier.)

Die Funktion runQuery() dient dazu, mit BigQuery zu kommunizieren und die Ergebnisse an eine Tabelle zu senden. Jetzt müssen wir ein Diagramm mit den Daten erstellen. Erstellen wir eine neue Funktion namens createColumnChart(), die die Methode newChart() der Tabelle aufruft, um dies zu tun.

  1. Diagramm erstellen: Fügen Sie den unten gezeigten Text von createColumnChart() in bq-sheets-slides.js direkt nach runQuery() ein. Sie ruft die Tabelle mit den Daten ab und fordert ein Säulendiagramm mit allen Daten an. Der Datenbereich beginnt bei Zelle A2, weil in der ersten Zeile keine Daten vorhanden sind, sondern dort nur die Spaltenüberschriften stehen.
/**
 * Uses spreadsheet data to create columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} visualizing the results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first and only) Sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in Sheet is from cell A2 to B11
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the Sheet using above params.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
}
  1. Tabelle zurückgeben: Im Code oben benötigt createColumnChart() das Tabellenobjekt. Wir müssen also runQuery() so aktualisieren, dass das Objekt spreadsheet zurückgegeben wird, damit wir es an createColumnChart() übergeben können. Nachdem Sie protokolliert haben, dass die Google-Tabelle erfolgreich erstellt wurde, geben Sie das spreadsheet-Objekt am Ende von runQuery() zurück, direkt nach der Logzeile:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. FunktioncreateBigQueryPresentation()Autofahren. Es ist sinnvoll, die Funktionen für die BigQuery-Abfrage und für die Diagrammerstellung getrennt voneinander aufzurufen. Erstellen wir nun eine createBigQueryPresentation()-Funktion, um die App zu starten und danach die beiden Funktionen aufzurufen: runQuery() und createColumnChart(). Der Code, den Sie einfügen, sollte in etwa so aussehen:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. Code wiederverwendbarer machen: Sie haben eben zwei wichtige Schritte ausgeführt: das Tabellenobjekt zurückgegeben und eine Startfunktion erstellt. Was ist nun, wenn auch ein Kollege die Funktion runQuery() verwenden möchte, aber nicht will, dass der Link protokolliert wird? Wenn Sie runQuery() für allgemeinere Zwecke nutzbar machen möchten, müssen Sie die Log-Zeile verschieben. Wohin am besten? Wenn Ihre Antwort createBigQueryPresentation() ist, dann liegen Sie richtig. Nach dem Verschieben der Log-Zeile sollte der Code so aussehen:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); // MOVED HERE
  createColumnChart(spreadsheet);
}

Mit diesen Änderungen oben (wieder mit Ausnahme von PROJECT_ID) sollte bq-sheets-slides.js jetzt so aussehen (und auch im Ordner step2 des GitHub-Repositorys zu finden sein):

// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into Sheet. You must enable
 * the BigQuery advanced service before you can run this code.
 * @see http://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see http://github.com/googleworkspace/apps-script-samples/blob/main/advanced/bigquery.gs
 *
 * @returns {Sheet} Returns a sheet with results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/sheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BQ job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the new results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to Sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  // Return the spreadsheet object for later use.
  return spreadsheet;
}

/**
 * Uses spreadsheet data to create columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} visualizing the results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first and only) Sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in Sheet is from cell A2 to B11
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the Sheet using above params.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
}

/**
 * Runs a BigQuery query, adds data and a chart in a Sheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  createColumnChart(spreadsheet);
}

Speichern Sie die Datei und führen Sie oben im Codeeditor die Funktion createBigQueryPresentation() statt runQuery() aus. Wenn die Ausführung abgeschlossen ist, sehen Sie eine weitere Google-Tabelle. Doch diesmal wird neben den Daten ein Diagramm angezeigt:

Im letzten Teil des Codelabs erstellen Sie eine neue Google-Präsentation, tragen in der Titelfolie einen Titel und Untertitel ein und fügen zwei neue Folien hinzu: eine für alle Datenzellen und eine weitere für das Diagramm.

  1. Präsentation erstellen Alle Arbeitsschritte, die Sie an der Präsentation vornehmen, finden in der Funktion createSlidePresentation() statt. Diese fügen Sie in der Datei bq-sheets-slides.js direkt nach createColumnChart() ein. Beginnen Sie mit dem Erstellen einer neuen Folienpräsentation und fügen Sie auf der Titelfolie, die bei allen neuen Präsentationen automatisch erzeugt wird, Titel und Untertitel ein.
/**
 * Create presentation with spreadsheet data & chart
 * @param {Spreadsheet} Spreadsheet with results data
 * @param {EmbeddedChart} Sheets chart to embed on slide
 * @returns {Presentation} Slide deck with results
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the new presentation.
  var deck = SlidesApp.create(QUERY_NAME);

  // Populate the title slide.
  var [title, subtitle] = deck.getSlides()[0].getPageElements();
  title.asShape().getText().setText(QUERY_NAME);
  subtitle.asShape().getText().setText('via GCP and G Suite APIs:\n' +
    'Google Apps Script, BigQuery, Sheets, Slides');
  1. Datentabelle hinzufügen Der nächste Schritt in createSlidePresentation() besteht darin, die Zellendaten aus der Google-Tabelle in die neue Präsentation zu importieren. Fügen Sie dieses Code-Snippet in die Funktion ein:
  // Data range to copy is from cell A1 to B11
  var START_CELL = 'A1';  // include header row
  var END_CELL = 'B11';
  // Add the table slide and insert an empty table on it of
  // the dimensions of the data range; fails if Sheet empty.
  var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var sheetValues = spreadsheet.getSheets()[0].getRange(
      START_CELL + ':' + END_CELL).getValues();
  var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);

  // Populate the table with spreadsheet data.
  for (var i = 0; i < sheetValues.length; i++) {
    for (var j = 0; j < sheetValues[0].length; j++) {
      table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
    }
  }
  1. Diagramm importieren Mit dem letzten Schritt in createSlidePresentation() erstellen Sie eine weitere Folie, importieren das Diagramm aus der Tabelle und geben das Objekt Presentation zurück. Fügen Sie dieses letzte Snippet in die Funktion ein:
  // Add a chart slide and insert the chart on it.
  var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  chartSlide.insertSheetsChart(chart);

  // Return the presentation object for later use.
  return deck;
}
  1. Diagramm für Rendite Da die letzte Funktion jetzt vollständig ist, lohnt sich ein genauerer Blick auf ihre Signatur. Ja, createSlidePresentation() erfordert sowohl ein Tabellen- als auch ein Diagrammobjekt. Sie haben runQuery() bereits so angepasst, dass das Objekt Spreadsheet zurückgegeben wird. Jetzt nehmen Sie eine ähnliche Änderung in der Funktion createColumnChart() vor, durch welche diese das Diagrammobjekt (EmbeddedChart) zurückgibt. Gehen Sie in Ihrer Anwendung zurück zum Code und fügen Sie am Ende von createColumnChart() eine letzte Zeile ein:
  // NEW: Return chart object for later use
  return chart;
}
  1. AktualisierencreateBigQueryPresentation() Da createColumnChart() das Diagramm zurückgibt, müssen wir es in einer Variablen speichern und dann sowohl das Tabellenblatt als auch das Diagramm an createSlidePresentation() übergeben. Da wir den Link des neu erstellten Tabellenblatts protokollieren, protokollieren wir auch den Link zur neuen Folienpräsentation. Aktualisieren Sie createBigQueryPresentation() so, dass es so aussieht:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet,
 * and adds the data and chart to a new slide presentation.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  var chart = createColumnChart(spreadsheet); // UPDATED
  var deck = createSlidePresentation(spreadsheet, chart); // NEW
  Logger.log('Results slide deck created: %s', deck.getUrl()); // NEW
}
  1. Speichern Sie die Datei und führen Sie createBigQueryPresentation() noch einmal aus. Bevor die Funktion ausgeführt wird, werden Sie im Autorisierungsdialog gefragt, ob die Anwendung Google-Präsentationen aufrufen und verwalten darf. Sobald Sie diese Berechtigung erteilt haben, wird der Export wie gewohnt ausgeführt.
  2. Neben der erstellten Tabelle ist hier auch eine neue Google-Präsentation mit drei Folien vorhanden (Titel, Datentabelle, Datendiagramm), wie in den folgenden Abbildungen zu sehen:

Glückwunsch! Sie haben jetzt eine Anwendung erstellt, die beide Seiten von Google Cloud nutzt. Dazu wird eine Google BigQuery-Anfrage ausgeführt, mit der eines der öffentlichen Datasets abgefragt wird. Anschließend wird eine neue Google-Tabelle erstellt, in der die Ergebnisse gespeichert werden. Dann wird ein Diagramm auf Grundlage der gerade abgerufenen Daten hinzugefügt. Schließlich wird eine Google-Präsentation mit den Ergebnissen und dem Diagramm in der Tabelle erstellt.

Das ist die technische Beschreibung. Allgemeiner formuliert, haben Sie eine Big-Data-Analyse in eine nachvollziehbare Form gebracht, die Sie anderen an Ihrem Projekt Interessierten vorstellen können, und zwar in Codeform und völlig automatisiert. Wir hoffen, dass dieses Beispiel Sie dazu inspiriert, es für Ihre eigenen Projekte zu verwenden und anzupassen. Am Ende dieses Codelabs geben wir Ihnen einige Vorschläge, wie Sie diese Beispiel-App weiter verbessern können.

Mit den Änderungen aus der letzten Aufgabe (wieder mit Ausnahme von PROJECT_ID) sollte die Datei bq-sheets-slides.js jetzt so aussehen (und ist auch im final-Ordner im GitHub-Repository zu finden):

bq-sheets-slides.js

/**
 * Copyright 2018 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into Sheet. You must enable
 * the BigQuery advanced service before you can run this code.
 * @see http://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see http://github.com/googleworkspace/apps-script-samples/blob/main/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BQ job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the new results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to Sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  // Return the spreadsheet object for later use.
  return spreadsheet;
}

/**
 * Uses spreadsheet data to create columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} visualizing the results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first and only) Sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in Sheet is from cell A2 to B11
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the Sheet using above params.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);

  // Return the chart object for later use.
  return chart;
}

/**
 * Create presentation with spreadsheet data & chart
 * @param {Spreadsheet} Spreadsheet with results data
 * @param {EmbeddedChart} Sheets chart to embed on slide
 * @returns {Presentation} Returns a slide deck with results
 * @see http://developers.google.com/apps-script/reference/slides/presentation
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the new presentation.
  var deck = SlidesApp.create(QUERY_NAME);

  // Populate the title slide.
  var [title, subtitle] = deck.getSlides()[0].getPageElements();
  title.asShape().getText().setText(QUERY_NAME);
  subtitle.asShape().getText().setText('via GCP and G Suite APIs:\n' +
    'Google Apps Script, BigQuery, Sheets, Slides');

  // Data range to copy is from cell A1 to B11
  var START_CELL = 'A1';  // include header row
  var END_CELL = 'B11';
  // Add the table slide and insert an empty table on it of
  // the dimensions of the data range; fails if Sheet empty.
  var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var sheetValues = spreadsheet.getSheets()[0].getRange(
      START_CELL + ':' + END_CELL).getValues();
  var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);

  // Populate the table with spreadsheet data.
  for (var i = 0; i < sheetValues.length; i++) {
    for (var j = 0; j < sheetValues[0].length; j++) {
      table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
    }
  }

  // Add a chart slide and insert the chart on it.
  var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  chartSlide.insertSheetsChart(chart);

  // Return the presentation object for later use.
  return deck;
}

/**
 * Runs a BigQuery query, adds data and a chart in a Sheet,
 * and adds the data and chart to a new slide presentation.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  var chart = createColumnChart(spreadsheet);
  var deck = createSlidePresentation(spreadsheet, chart);
  Logger.log('Results slide deck created: %s', deck.getUrl());
}

Die „zweite Datei“ in diesem Codelab, die Apps Script-Manifestdatei appsscript.json, spielt in diesem Codelab keine Rolle. Sie können darauf zugreifen, indem Sie im Browser-Tab des Code-Editors oben im Menü Ansicht > Manifestdatei anzeigen auswählen. Der Inhalt sollte in etwa so aussehen:

appsscript.json

{
  "timeZone": "America/Los_Angeles",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "BigQuery",
      "serviceId": "bigquery",
      "version": "v2"
    }]
  },
  "exceptionLogging": "STACKDRIVER"
}

Die Manifestdatei ist eine Konfigurationsdatei auf Systemebene, die Apps Script verwendet, um zu wissen, welche Ausführungsumgebung für Ihre Anwendung verfügbar sein muss. Der Inhalt einer Manifestdatei wird in diesem Codelab nicht behandelt. Sie können sich aber einen Überblick verschaffen.

Unten finden Sie weitere Ressourcen, die detaillierte Informationen zu den Inhalten in diesem Codelab sowie zu Möglichkeiten für einen programmatischen Zugriff auf die Google-Entwicklertools enthalten. Wir versuchen, dieses Codelab auf dem gleichen Stand wie das Repository zu halten.

Ressourcen für diese Anwendung

Dokumentation

Weitere Codelabs

Einführung

Fortgeschritten

Referenz-Apps

Unten finden Sie verschiedene „Code-Herausforderungen“, mit denen Sie das Beispiel, das wir in diesem Codelab erstellt haben, verbessern oder erweitern können. Diese Liste ist natürlich nicht vollständig, soll Ihnen aber einige Ideen für den nächsten Schritt geben.

  • Anwendung: Sie möchten nicht durch die Verwendung von JavaScript oder durch Einschränkungen von Apps Script eingeschränkt werden? Portieren Sie diese Anwendung in Ihre bevorzugte Programmiersprache, die die REST APIs für Google BigQuery, Sheets und Präsentationen verwendet.
  • BigQuery: Probieren Sie eine andere Anfrage für das Shakespeare-Dataset aus – vielleicht finden Sie eine, die Sie interessiert. Eine weitere Beispielabfrage finden Sie in der ursprünglichen Apps Script-Beispielanwendung für BigQuery.
  • BigQuery: Probieren Sie einige der anderen öffentlichen Datasets von BigQuery aus. Vielleicht finden Sie ein Dataset, das für Sie aussagekräftiger ist.
  • BigQuery: Wir haben bereits andere Abfragen erwähnt, die Sie für die Werke von Shakespeare oder andere öffentliche Datentabellen ausprobieren können. Wir möchten diese Webseite und diese noch einmal teilen.
  • Google Sheets Andere Diagrammtypen ausprobieren
  • Google Tabellen und BigQuery Vielleicht haben Sie ja irgendwo ein großes Dataset in einer Tabelle. 2016 führte das BigQuery-Team die Funktion ein, mit der Entwickler ein Tabellenblatt als Datenquelle verwenden können. Weitere Informationen finden Sie in den Blogposts eins und zwei.
  • Präsentationen Fügen Sie der generierten Präsentation weitere Folien hinzu, z. B. Bilder oder andere Assets, die mit Ihrer Big Data-Analyse zusammenhängen. Hier finden Sie eine Anleitung für den integrierten Google-Präsentationen-Dienst.
  • G Suite Apps Script für andere integrierte G Suite- oder Google-Dienste verwenden, z.B. Gmail, Google Drive, Google Kalender, Google Docs, Google Maps, Google Analytics, YouTube usw. sowie andere erweiterte Dienste. Weitere Informationen finden Sie in der Referenzübersicht für integrierte und erweiterte Dienste.