GSP240

Opis
Badacze danych mają dostęp do wielu narzędzi, które pozwalają na przeprowadzanie analiz big data. Narzędzia te nie dają jednak możliwości odpowiedniego objaśniania lub uzasadniania wyników tych analiz kierownictwu i innym zainteresowanym osobom. Zaprezentowanie takiemu gronu jedynie kolumn liczb na papierze lub w tabeli bazy danych raczej się nie sprawdzi. Z tego modułu dotyczącego Google Apps Script dowiesz się więc, jak nadawać analizom danych formę nadającą się do skutecznej prezentacji, korzystając z 2 platform Google dla programistów: Workspace i Google Cloud.
Narzędzia dla programistów Google Cloud umożliwiają zbieranie i analizę danych. Potem za pomocą slajdów i arkuszy kalkulacyjnych możesz stworzyć prezentację, która nie tylko będzie bardzo atrakcyjna, ale przede wszystkim przekona zarząd i inne zainteresowane osoby do wyciągniętych przez Ciebie wniosków.
W tym module poznasz dostępny w Google Cloud (jako zaawansowana usługa Apps Script) interfejs API BigQuery oraz wbudowane usługi Apps Script w Arkuszach Google i Prezentacjach Google.
W module realizowany jest scenariusz, który mógłby wystąpić w rzeczywistości. W użytej aplikacji zastosowano funkcje i interfejsy API pochodzące z wielu usług Google Cloud. Chcemy Ci pokazać, jak można wykorzystać możliwości Google Cloud i Workspace do rozwiązywania skomplikowanych problemów, z którymi borykają się Twoja organizacja lub klienci.
Czego się nauczysz
- Jak używać Google Apps Script z wieloma usługami Google
- Jak za pomocą BigQuery przeprowadzać analizy big data
- Jak utworzyć arkusz Google i zapełnić go danymi, a także jak utworzyć wykres na podstawie danych z arkusza kalkulacyjnego
- Jak przenieść wykres i dane z arkusza kalkulacyjnego do osobnych slajdów Prezentacji Google
Konfiguracja
Zanim klikniesz przycisk Rozpocznij moduł
Zapoznaj się z tymi instrukcjami. Moduły mają limit czasowy i nie można ich zatrzymać. Gdy klikniesz Rozpocznij moduł, na liczniku wyświetli się informacja o tym, na jak długo udostępniamy Ci zasoby Google Cloud.
W tym praktycznym module możesz spróbować swoich sił w wykonywaniu opisywanych działań w prawdziwym środowisku chmury, a nie w jego symulacji lub wersji demonstracyjnej. Otrzymasz nowe, tymczasowe dane logowania, dzięki którym zalogujesz się i uzyskasz dostęp do Google Cloud na czas trwania modułu.
Do ukończenia modułu potrzebne będą:
- Dostęp do standardowej przeglądarki internetowej (zalecamy korzystanie z przeglądarki Chrome).
Uwaga: uruchom ten moduł w oknie incognito (zalecane) lub przeglądania prywatnego. Dzięki temu unikniesz konfliktu między swoim kontem osobistym a kontem do nauki, co mogłoby spowodować naliczanie dodatkowych opłat na koncie osobistym.
- Odpowiednia ilość czasu na ukończenie modułu – pamiętaj, że gdy rozpoczniesz, nie możesz go wstrzymać.
Uwaga: w tym module używaj tylko konta do nauki. Jeśli użyjesz innego konta Google Cloud, mogą na nim zostać naliczone opłaty.
Wstęp
Google Apps Script i BigQuery
Google Apps Script to rozwiązanie programistyczne dla narzędzi Workspace, które pozwala działać na wyższym poziomie niż interfejsy API Google typu REST. Jest to bezserwerowe środowisko do programowania i hostingu aplikacji, odpowiednie dla programistów o bardzo różnym poziomie zaawansowania. Apps Script można opisać jednym zdaniem jako bezserwerowe środowisko wykonawcze języka JavaScript służące do automatyzacji, rozszerzania i integracji funkcji Workspace.
Jako implementacja języka JavaScript po stronie serwera Apps Script przypomina Node.js. Jednak w przeciwieństwie do tego środowiska wykonawczego, które wykorzystywane jest do szybkiego, asynchronicznego hostingu aplikacji opartego na zdarzeniach, Apps Script służy do programowania rozwiązań w ścisłej integracji z Workspace i innymi usługami Google. Ponadto środowisko programistyczne Apps Script może całkowicie różnić się od innych używanych przez Ciebie do tej pory. Apps Script umożliwia:
- programowanie w edytorze kodu działającym w przeglądarce oraz możliwość pracy lokalnej i późniejszego przesłania plików do Apps Script przy użyciu narzędzia wiersza poleceń clasp;
- tworzenie kodu w wyspecjalizowanej wersji języka JavaScript, zapewniającej dostęp do Workspace oraz innych usług Google lub pozostałych firm (za pomocą narzędzi Apps Script URLfetch lub Jdbc);
- pominięcie ręcznego pisania kodu autoryzacji, ponieważ Apps Script zapewnia jego obsługę;
- rezygnację z hostowania utworzonej aplikacji – będzie ona działać na serwerach Google w chmurze.
Uwaga: więcej informacji o Apps Script znajdziesz w oficjalnej dokumentacji, która zawiera również omówienie z krótkimi wprowadzeniami, samouczki i filmy.
Apps Script współpracuje z innymi technologiami Google na 2 różne sposoby:
- jako usługa wbudowana,
- jako usługa zaawansowana.
Usługa wbudowana udostępnia metody wysokiego poziomu zapewniające dostęp do danych Workspace i usług Google oraz inne przydatne metody narzędziowe. Usługa zaawansowana to tylko cienka otoka dla API typu REST w aplikacji Workspace lub innej usłudze Google. Usługi zaawansowane umożliwiają użycie wszystkich funkcji typowych dla interfejsu API typu REST i często ich możliwości są większe niż usług wbudowanych, ale wymagają one bardziej skomplikowanego kodu (wciąż jednak są łatwiejsze w obsłudze niż API REST).
Użycie usług zaawansowanych wymaga ich wcześniejszego włączenia w projekcie skryptu. Wszędzie tam, gdzie to możliwe, preferowane jest korzystanie z usług wbudowanych, ponieważ są łatwiejsze w użyciu i wykonują za programistów więcej złożonych zadań niż usługi zaawansowane. Jednak niektóre interfejsy API Google nie mają usług wbudowanych i w takiej sytuacji użycie usługi zaawansowanej może być jedyną możliwością. Takim przykładem jest BigQuery. Dostępna jest tylko usługa zaawansowana BigQuery – nie ma żadnej usługi wbudowanej. To i tak lepiej, niż gdyby nie było ich wcale.
Uwaga: jeśli jeszcze tego nie wiesz, BigQuery to usługa Google Cloud umożliwiająca wykonywanie prostych (lub złożonych) zapytań do bardzo dużych zbiorów danych (rzędu wielu terabajtów), która zwraca wyniki w czasie liczonym w sekundach, a nie godzinach lub nawet dniach.
Dostęp do Arkuszy i Prezentacji Google z poziomu Apps Script
Usługa BigQuery jest dostępna tylko jako usługa zaawansowana Apps Script. Jednak zarówno Arkusze, jak i Prezentacje Google mają usługi wbudowane Apps Script oraz usługi zaawansowane, na przykład pozwalające na korzystanie z funkcji, które są dostępne wyłącznie w interfejsie API. Jeśli tylko jest to możliwe, wybieraj usługę wbudowaną zamiast równoważnej usługi zaawansowanej. Usługi wbudowane udostępniają konstrukcje wyższego poziomu i wygodne wywołania, które upraszczają programowanie.
Uwaga: zanim zagłębimy się w kod, zapoznaj się z usługą Arkuszy oraz usługą Prezentacji.
Zadanie 1. Tworzenie zapytania BigQuery i zapisywanie wyników w pliku Arkuszy Google
To pierwsze zadanie obejmuje dużą część tego modułu. Gdy zakończysz tę sekcję, zostanie Ci jeszcze mniej więcej połowa całego dostępnego materiału.
W tej sekcji:
- Rozpoczniesz nowy projekt Google Apps Script.
- Włączysz dostęp do usługi zaawansowanej BigQuery.
- Otworzysz edytor programistyczny i wpiszesz kod źródłowy aplikacji.
- Przejdziesz proces autoryzacji aplikacji (OAuth2).
- Uruchomisz aplikację wysyłającą żądanie do BigQuery.
- Wyświetlisz nowy arkusz Google utworzony na podstawie wyników pochodzących z BigQuery.
Tworzenie nowego projektu Apps Script
- Aby utworzyć nowy projekt Apps Script, wejdź na script.google.com. Na potrzeby tego modułu kliknij Utwórz Apps Script.

- Otworzy się edytor kodu Apps Script:

-
Nazwij swój projekt, klikając nazwę projektu u góry (na grafice powyżej jest to „Untitled project”, czyli projekt bez nazwy).
-
W oknie Zmień nazwę projektu wpisz wybraną nazwę projektu (np. „BigQuery”, „Arkusze”, „wersja demonstracyjna Prezentacji”), a potem kliknij Zmień nazwę.
Włączanie usługi zaawansowanej BigQuery
Włącz w swoim nowym projekcie usługę zaawansowaną BigQuery i włącz BigQuery API.
- Kliknij ikonę dodawania usług obok opcji Usługi.

- W oknie Dodaj usługę wybierz odpowiednie usługi i interfejsy APIs.

- Otwórz konsolę Cloud i kliknij Menu nawigacyjne > Interfejsy API i usługi > Biblioteka.

- W polu wyszukiwania wpisz lub wklej BigQuery API, a potem kliknij BigQuery API.

- Jeśli trzeba, kliknij Włącz, aby włączyć BigQuery API.

-
Wróć do swojego projektu. Okno Dodaj usługę powinno być wciąż otwarte.
-
Wybierz BigQuery API i kliknij Dodaj, aby zamknąć okno.

Wpisywanie i uruchamianie kodu aplikacji
Możesz teraz wpisać kod aplikacji, przejść przez proces autoryzacji i zobaczyć swoją aplikację po raz pierwszy w działaniu.
- Skopiuj kod znajdujący się w polu poniżej i wklej go w edytorze kodu, zastępując całą wcześniejszą zawartość:
/**
* 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 = '<YOUR_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/gsuitedevs/apps-script-samples/blob/master/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());
}
-
Zapisz utworzony plik, wybierając ikonę zapisywania projektu na pasku menu lub naciskając Ctrl + S.
-
Zmień nazwę pliku, wybierając 3 kropki obok jego nazwy i klikając Zmień nazwę.

- Zmień nazwę pliku na bq-sheets-slides.gs i naciśnij Enter.
Co robi ten kod? Wiesz, że wykonuje zapytanie BigQuery i zapisuje wyniki w nowym arkuszu Google. Ale co to za zapytanie?
- Spójrz na kod zapytania w funkcji
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
To zapytanie przeszukuje dzieła Szekspira (część publicznego zbioru danych BigQuery) i generuje 10 słów najczęściej występujących we wszystkich jego tekstach, posortowanych pod względem częstotliwości występowania w kolejności malejącej. Jeśli wyobrazisz sobie, ile wysiłku trzeba włożyć, by zrobić to ręcznie, z łatwością przekonasz się o przydatności BigQuery.
Prawie gotowe. W zmiennej PROJECT_ID
na początku pliku bq-sheets-slides.gs
musisz jeszcze wstawić prawidłowy identyfikator projektu.
- Zastąp ciąg znaków
<YOUR_PROJECT_ID>
identyfikatorem projektu znajdującym się w panelu po lewej stronie.
Oto przykładowy kod z przykładowym identyfikatorem projektu. Rzeczywista wartość zmiennej PROJECT_ID w Twoim projekcie będzie inna.
Przykładowy kod:
// 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 = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
Uwaga: w tym fragmencie kodu instrukcja if
służy do tego, by działanie aplikacji nie było kontynuowane bez identyfikatora projektu.
Uwaga: jeśli selektor menu przestanie działać, załaduj stronę ponownie.
-
Zapisz plik i uruchom kod, klikając Uruchom na pasku menu.
-
Potem kliknij Przejrzyj uprawnienia.
Uwaga: jeśli zobaczysz błąd Wyjątek: usługa BigQuery API nie została włączona w projekcie zarządzanym przez Apps Script(...)
, usuń usługę BigQuery API i dodaj ją jeszcze raz.
- W oknie Choose an account from qwiklabs.net kliknij swoją nazwę użytkownika i kliknij Zezwól.
Uwaga: gdy raz autoryzujesz tę aplikację, nie będziesz musiał(a) tego robić przy każdym jej uruchomieniu. Zobaczysz to okno ponownie dopiero, gdy dojdziesz do sekcji „Umieszczanie wyników w prezentacji” w dalszej części tego modułu. Pojawi się tam prośba o utworzenie prezentacji Google i nadanie uprawnień do zarządzania nią.
- Po uruchomieniu funkcji u góry wyświetli się pole wiadomości.

Pole wiadomości znika po zakończeniu działania funkcji, więc jeśli go nie widzisz, być może funkcja została już wykonana.
- Otwórz swój Dysk Google i znajdź nowy arkusz Google o nazwie Most common words in all of Shakespeare's works (Słowa występujące najczęściej we wszystkich dziełach Szekspira) lub innej przypisanej do zmiennej
QUERY_NAME
:

- Otwórz arkusz kalkulacyjny. Powinien zawierać 10 wierszy ze słowami i ich łącznymi liczbami wystąpień, posortowanymi w kolejności malejącej:

Kliknij Sprawdź postępy, aby zobaczyć, jak Ci poszło.
Utworzenie zapytania BigQuery i zapisanie wyników w arkuszu Google
Podsumowanie
Co się przed chwilą stało? Udało Ci się uruchomić kod, który przeszukał wszystkie dzieła Szekspira. (Ilość danych może nie jest OLBRZYMIA, ale z pewnością tekstu jest więcej, niż można w rozsądnym czasie samodzielnie przeczytać, licząc wystąpienia poszczególnych słów w każdej sztuce, by na koniec posortować je w kolejności malejącej). Większość pracy wykonała za Ciebie usługa BigQuery, a za przygotowanie danych do łatwego użycia w Arkuszach Google odpowiada usługa wbudowana w Apps Script.
Zanim uruchomisz zapytanie w Apps Script, zawsze możesz je przetestować w konsoli BigQuery. Interfejs użytkownika usługi BigQuery jest dostępny dla programistów.
- Otwórz konsolę Cloud i kliknij Menu nawigacyjne > BigQuery.

- W oknie Witamy w usłudze BigQuery w konsoli Cloud kliknij GOTOWE.
Otworzy się konsola BigQuery.
- Wpisz swój kod w edytorze zapytań i kliknij Uruchom:
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

Zadanie 2. Tworzenie wykresu w Arkuszach Google
Wróć do edytora skryptów. Na razie masz gotową aplikację, która przeszukuje dzieła Szekspira, sortuje wyniki i wyświetla je w Arkuszach. Funkcja runQuery()
w kodzie komunikuje się z BigQuery i wysyła wyniki do arkusza. Teraz dodasz kod, który tworzy wykres na podstawie danych. W tej sekcji utworzysz nową funkcję o nazwie createColumnChart()
, która wywołuje metodę newChart()
arkusza w celu utworzenia wykresu z danymi.
Funkcja createColumnChart()
pobiera arkusz z danymi i wysyła żądanie utworzenia wykresu kolumnowego zawierającego wszystkie dane. Początek zakresu danych to komórka A2, ponieważ pierwszy wiersz zawiera nagłówki kolumn, a nie dane.
- Utwórz wykres: dodaj funkcję
createColumnChart()
do pliku bq-sheets-slides.gs
zaraz po funkcji runQuery()
{za ostatnim wierszem kodu}:
/**
* 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);
}
-
Zwróć arkusz kalkulacyjny: w kodzie przedstawionym powyżej funkcja createColumnChart()
wymaga obiektu spreadsheet (arkusz kalkulacyjny), dlatego dostosuj aplikację w taki sposób, by zwracała obiekt spreadsheet
, który można przekazać do funkcji createColumnChart()
. Po zalogowaniu pomyślnego utworzenia arkusza Google zwróć obiekt na końcu funkcji runQuery()
.
-
Zastąp ostatni wiersz (zaczynający się od Logger.log) tym fragmentem kodu:
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
// Return the spreadsheet object for later use.
return spreadsheet;
}
- Wykorzystaj funkcję
createBigQueryPresentation()
: bardzo dobrym pomysłem jest logiczne oddzielenie funkcji wykonywania zapytania BigQuery od funkcji tworzenia wykresu. Utwórz funkcję createBigQueryPresentation()
, która będzie realizować działanie aplikacji, wywołując zarówno zapytanie, jak i funkcję createColumnChart()
. Dodaj kod podobny do tego:
/**
* Runs a BigQuery query, adds data and a chart in a Sheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
createColumnChart(spreadsheet);
}
- Umieść funkcję
createBigQueryPresentation()
zaraz za tym blokiem kodu:
// 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 = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
- Przygotuj kod do możliwości wielokrotnego użycia: powyżej wykonywane są 2 ważne kroki – zwracany jest obiekt arkusza kalkulacyjnego i tworzona jest funkcja odpowiedzialna za działanie aplikacji. Łatwo sobie wyobrazić, że ktoś chciałby skorzystać z funkcji
runQuery()
, ale bez konieczności logowania URL-a.
Jeśli chcesz, by funkcja runQuery()
była bardziej uniwersalna, możesz przenieść w inne miejsce wiersz logowania. Które miejsce byłoby najlepsze? Jeśli uważasz, że najlepiej byłoby umieścić ją w ramach funkcji createBigQueryPresentation()
, to masz rację.
Po przeniesieniu wiersza logowania funkcja powinna wyglądać podobnie do tej:
/**
* 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);
}
Po wprowadzeniu powyższych zmian Twój plik bq-sheets-slides.js
powinien wyglądać podobnie do tego (naturalnie z wyjątkiem zmiennej PROJECT_ID
):
/**
* 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 = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* 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);
}
/**
* 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/gsuitedevs/apps-script-samples/blob/master/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());
// 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);
}
-
Zapisz plik.
-
Na pasku menu kliknij runQuery i wybierz z menu createBigQueryPresentation.
-
Następnie kliknij Uruchom.
Po uruchomieniu na Twoim Dysku Google pojawi się kolejny arkusz Google, ale tym razem obok danych będzie zawierał wykres:

Zadanie 3. Umieszczanie wyników w prezentacji
W ostatniej części modułu utworzysz nową prezentację Google: wpiszesz tytuł i podtytuł na slajdzie tytułowym, a potem dodasz 2 nowe slajdy – jeden ze wszystkimi komórkami danych, a drugi z wykresem.
- Utwórz prezentację: zacznij od utworzenia nowej prezentacji, następnie dodaj tytuł i podtytuł na domyślnym slajdzie tytułowym, który mają wszystkie nowe prezentacje. Wszystkie operacje związane z prezentacją są wykonywane w funkcji
createSlidePresentation()
,
którą dodasz do pliku bq-sheets-slides.gs
zaraz za kodem funkcji createColumnChart()
:
/**
* 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');
- Dodaj tabelę danych: następnym krokiem w funkcji
createSlidePresentation()
jest zaimportowanie danych z komórek arkusza Google do nowej prezentacji. Dodaj ten fragment kodu do funkcji createSlidePresentation()
:
// 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]));
}
}
- Zaimportuj wykres: ostatnim krokiem w funkcji
createSlidePresentation()
jest utworzenie kolejnego slajdu, zaimportowanie wykresu z arkusza kalkulacyjnego i zwrócenie obiektu Presentation
. Dodaj do funkcji ten ostatni fragment kodu:
// 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;
}
- Zwróć wykres: teraz gdy ostatnia funkcja jest gotowa, jeszcze raz przyjrzyj się jej deklaracji. Tak, funkcja
createSlidePresentation()
wymaga przekazania obiektów spreadsheet (arkusz kalkulacyjny) i chart (wykres). Skorygowaliśmy już funkcję runQuery()
tak, że zwraca obiekt Spreadsheet
, a teraz trzeba wprowadzić podobną zmianę do funkcji createColumnChart()
– musi ona zwracać obiekt wykresu (EmbeddedChart
). Cofnij się w kodzie aplikacji i dodaj jeszcze jeden wiersz na końcu funkcji createColumnChart()
:
// Return chart object for later use
return chart;
}
- Zaktualizuj funkcję
createBigQueryPresentation()
: ponieważ funkcja createColumnChart()
zwraca wykres, musisz zapisać ten wykres w zmiennej i przekazać do funkcji createSlidePresentation()
obydwa obiekty: spreadsheet (arkusz kalkulacyjny) i chart (wykres). Logujesz URL nowo utworzonego arkusza kalkulacyjnego, dlatego możesz również logować URL nowej prezentacji. Zastąp ten blok kodu:
/**
* 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);
}
Tym blokiem:
/**
* 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());
}
Po wszystkich aktualizacjach plik bq-sheets-slides.gs
powinien wyglądać podobnie do tego (z wyjątkiem zmiennej PROJECT_ID
):
bq-sheets-slides.gs - final version
// 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 = '<YOUR_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/gsuitedevs/apps-script-samples/blob/master/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());
}
- Zapisz i jeszcze raz uruchom funkcję
createBigQueryPresentation()
. Zanim się wykona, jeszcze raz pojawi się prośba o ustawienie uprawnień do wyświetlania prezentacji Google i zarządzania nimi.
- Przejdź do folderu Mój dysk. Zobaczysz, że oprócz utworzonego arkusza jest w nim także nowa prezentacja zawierająca 3 slajdy (tytułowy, z tabelą danych i z wykresem danych) podobne do przedstawionych poniżej:



Gratulacje!
Udało Ci się utworzyć aplikację wykorzystującą obie funkcjonalności Google Cloud. Zapytanie BigQuery przeszukało jeden z publicznych zbiorów danych, wyniki tego zapytania zostały zapisane w nowym arkuszu Google, dodany został wykres utworzony na podstawie pobranych danych, a na koniec powstała prezentacja Google zawierająca wyniki zapytania w postaci arkusza kalkulacyjnego oraz wykresu.
Tak to wygląda z technicznego punktu widzenia. Mówiąc prościej, analiza dużego zbioru danych została przekształcona do postaci, którą łatwo zaprezentować wszystkim zainteresowanym. Zostało to wykonane przy użyciu kodu i w zautomatyzowany sposób. Teraz możesz dostosować ten moduł do własnych projektów.
Kolejne kroki / Więcej informacji
Kod zaprezentowany w tym module jest również dostępny na GitHubie. Staramy się na bieżąco uwzględniać w tym module wszystkie zmiany wprowadzane w repozytorium. Poniżej znajdziesz dodatkowe zasoby, pozwalające pogłębić informacje przedstawione w tym module i poznać inne sposoby korzystania z narzędzi Google dla programistów.
Dokumentacja
Filmy dotyczące zagadnień powiązanych i ogólnych
- Another Google (Apps) secret (Kolejny sekret Google (Apps)) – film wprowadzający do Apps Script
- Accessing Google Maps from a spreadsheet (Dostęp do Map Google z poziomu arkusza kalkulacyjnego) – film
-
Biblioteka filmów o korzystaniu z Google Apps Script
-
Cykl filmów Launchpad Online
-
Cykl filmów The Google Workspace Dev Show
Najnowsze informacje dotyczące zagadnień powiązanych i ogólnych
Ostatnia aktualizacja instrukcji: 4 listopada 2024 r.
Ostatni test modułu: 4 listopada 2024 r.
Copyright 2025 Google LLC. Wszelkie prawa zastrzeżone. Google i logo Google są znakami towarowymi Google LLC. Wszelkie inne nazwy firm i produktów mogą być znakami towarowymi odpowiednich podmiotów, z którymi są powiązane.