1. 包括大數據分析和投影片簡報等
數據資料學家提供多種可用來執行大數據分析的工具,但最終分析師仍必須證明結果能夠合理化。重要利害關係人很難在紙上或資料庫中大量數據。這個中階 Google Apps Script 程式碼研究室會使用 2 個 Google 開發人員平台 (Google Workspace 和 Google Cloud 控制台),協助您完成最後的進程。
Google Cloud 的開發人員工具可讓您進行深度資料分析,您可將得到的結果插入試算表,再產生一份包含資料的投影片簡報。這樣就能更輕鬆地將資料送交管理。本程式碼研究室涵蓋 Cloud 控制台的 BigQuery API (做為 Apps Script 進階服務),以及適用於 Google 試算表和 Google 簡報的內建 Apps Script 服務。
動機
本程式碼研究室中的範例應用程式參考了下列其他程式碼範例:
- GitHub 上的開放原始碼 Google Apps Script BigQuery 服務範例應用程式。
- 以下是透過試算表資料產生投影片開發人員影片所介紹的範例應用程式,並發布於這篇網誌文章。
- Google Slides API 程式碼研究室提供的範例應用程式。
雖然 Slides API 程式碼研究室範例應用程式也包含 BigQuery 和簡報,但與本程式碼研究室的範例應用程式有下列幾種不同:
- 比較他們的 Node.js 應用程式和 Apps Script 應用程式。
- 在使用 Apps Script 服務時,這些應用程式使用的是 REST API。
- 使用的是 Google 雲端硬碟,但使用 Google 試算表,但未使用 Google 試算表。
在本程式碼研究室中,我們希望將多項技術整合為單一應用程式,並以類似於實際用途的方式展示 Google Cloud 中的功能和 API。我們的目標是鼓勵您發揮想像力,並考慮同時使用 Cloud 控制台和 Google Workspace,為機構和客戶解決棘手的問題。
課程內容
- 如何搭配使用 Google Apps Script 與多項 Google 服務
- 如何使用 Google BigQuery 分析大數據
- 如何建立 Google 試算表並插入資料
- 如何在試算表中建立圖表
- 如何將試算表中的資料和圖表轉移至 Google 簡報檔案
軟硬體需求
- 可連上網際網路的網路瀏覽器
- Google 帳戶 (Google Workspace 帳戶可能需要經過管理員核准)
- 熟悉 Google 試算表的基本知識
- 可讀取試算表的 A1 標記法
- 基本 JavaScript 技能
- 具備 Apps Script 開發知識有幫助,但並非硬性規定
2. 問卷調查
您將如何使用這個程式碼研究室/教學課程?
針對 Google Workspace 開發人員工具和 Google Workspace 開發人員工具的體驗,您會給予什麼評價?API?
針對使用 Apps Script 的經驗,您會給予什麼評價?
請問您對 Cloud 控制台開發人員工具的滿意度為何?API?
3. 總覽
現在您已瞭解這個程式碼研究室的內容,接下來您將執行以下課程:
- 取得現有的 Apps Script-BigQuery 範例,讓 API 正常運作。
- 在此範例中,您會瞭解如何將查詢傳送至 BigQuery 並取得結果。
- 建立 Google 試算表,並將 BigQuery 的結果插入該試算表。
- 修改程式碼,稍微改變傳回及插入工作表的資料。
- 使用 Apps Script 中的試算表服務,為 BigQuery 資料建立圖表。
- 使用簡報服務建立 Google 簡報檔案。
- 為預設標題投影片新增標題和副標題。
- 製作內含資料表的投影片,然後將工作表的資料儲存格匯出至工作表。
- 建立另一張投影片,並在其中插入試算表圖表。
讓我們先瞭解 Apps Script、BigQuery、試算表和簡報的背景資訊。
Google Apps Script 和 BigQuery
Google Apps Script 是 Google Workspace 開發平台,運作範圍比 Google REST API 更高。這是一種無伺服器的開發與應用程式代管環境,所有開發人員皆可使用。基本上,Apps Script 是無伺服器的 JavaScript 執行階段,適用於 Google Workspace 自動化、擴充功能和整合功能。
這項服務使用與 Node.js 類似的伺服器端 JavaScript,但著重於與 Google Workspace 和其他 Google 服務緊密整合,而不是以非同步事件驅動的快速非同步應用程式託管服務。同時提供的開發環境可能與您原本的情況不同。使用 Apps Script 時,您可以:
- 使用瀏覽器式程式碼編輯器開發指令碼,但使用 Apps Script 的指令列工具部署工具
clasp
時,也可以在本機開發指令碼。 - 使用 Apps Script 的
URL Fetch
或JDBC
服務,建立專門用來存取 Google Workspace 和其他 Google 或外部服務的專屬 JavaScript 版本程式碼。 - 不必編寫授權碼,因為 Apps Script 會替您處理。
- 您無須託管應用程式,Google 伺服器會在雲端的 Google 伺服器中運作。
Apps Script 與其他 Google 技術的介面有 2 種不同:
- 內建服務
- 做為進階服務
內建服務具備高階方法,可以與使用者資料、其他 Google 系統和外部系統互動。基本上,「進階服務」是 Google Workspace API 或 Google REST API 的精簡包裝函式。進階服務提供 REST API 的完整涵蓋範圍,通常的運作方式不如內建服務,但所需的程式碼更加複雜,但比完整 REST API 還是容易使用。請務必先為指令碼專案啟用進階服務,才能使用進階服務。
如果可以的話,開發人員應使用內建服務,因為這類服務比進階服務更簡單易用,不過,有些 Google API 沒有內建服務,因此進階服務或許是唯一的選項。例如,Google BigQuery 沒有內建服務,但 BigQuery 服務存在。BigQuery 服務是一項 Cloud 控制台服務,可讓您使用 Google BigQuery API 對大型資料公司 (例如多個 TB) 執行查詢,但仍可在幾秒內提供結果。
存取試算表和Apps Script 的投影片
有別於 BigQuery,試算表和簡報都有內建服務。也能透過進階服務使用 API 專屬的功能。請先查看內建試算表和簡報服務的說明文件,再跳入程式碼。請注意,試算表和簡報的進階服務另附文件。
4. 工作 1:執行 BigQuery 並將結果記錄到試算表
簡介
我們將在本程式碼研究室的第一項工作中,進行大部分的內容。事實上,在完成所有步驟後,即可完成整個程式碼研究室的一半。拆解成數個子區段,您可以:
- 建立 Google Apps Script 和 Cloud 控制台專案。
- 啟用 BigQuery 進階服務的存取權。
- 開啟指令碼編輯器,然後輸入應用程式原始碼。
- 瀏覽應用程式授權程序 (OAuth2)。
- 執行向 BigQuery 傳送要求的應用程式。
- 查看使用 BigQuery 結果建立的新 Google 試算表。
設定
- 如要建立 Apps Script 專案,請前往
script.google.com
,然後按一下「新增專案」。 - 如要重新命名 Apps Script 專案,請按一下「未命名專案」、輸入專案名稱,然後按一下「重新命名」。
接下來,您需要建立 Cloud 控制台專案,以便在 BigQuery 中查詢資料。
- 如要建立 Cloud 控制台專案,請使用這個捷徑連結建立專案、為專案命名,然後按一下「建立」。
- 專案建立完畢後,頁面上會顯示通知。在頁面頂端的專案清單中確認已選取新專案。
- 按一下「選單」圖示 ,然後前往「API 與」服務 >OAuth 同意畫面 (直接連結)。
- 按一下 [內部] > [內部]建立:為貴機構的 Google Workspace 使用者建構應用程式。
- 在「App name」(應用程式名稱) 欄位中,輸入「Big Data Codelab」。
- 在「使用者支援」和「開發人員聯絡資訊」欄位中輸入聯絡電子郵件地址。
- 按一下 [儲存並繼續] >儲存並繼續。
- 按一下導覽列中的「更多」圖示 ,然後選取「專案設定」 (直接連結)。
- 複製「專案編號」下方列出的值。(本程式碼研究室稍後會使用獨立的「專案 ID」欄位)。
接下來,請將 Apps Script 專案連結至 Cloud 控制台專案,
- 切換至 App Script 編輯器,然後按一下「Project Settings」 圖示 。
- 在「Google Cloud Platform (GCP) 專案」下方,按一下「變更專案」。
- 輸入專案編號,然後按一下「設定專案」。
- 接著點選「編輯器」 ,開始新增 BigQuery 進階服務。
- 按一下「服務」旁的「新增服務」圖示 。
- 在「新增服務」對話方塊中,選取「BigQuery API」,然後按一下「新增」。
最後一個步驟是在 Cloud 控制台上啟用 BigQuery API。
- 方法是切換至 Cloud 控制台,然後按一下「API 與」服務 >資訊主頁。(請確定您仍在執行在步驟 3 建立的專案)。
- 點選「啟用 API 和服務」。
- 搜尋「查詢」並選取 [BigQuery API] (「不是」BigQuery Data Transfer API),然後按一下「啟用」來啟用。
您現在可以輸入應用程式代碼、完成授權程序,然後開始進行應用程式的第一次疊代作業。
上傳並執行應用程式
- 在指令碼編輯器中,將預設的
myFunction()
程式碼區塊替換成以下程式碼:
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into a Sheet. You must turn on
* the BigQuery advanced service before you can run this code.
* @see https://developers.google.com/apps-script/advanced/bigquery#run_query
* @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see https://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 BigQuery 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 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());
}
- 按一下 [儲存 ]。
- 在
Code.gs
旁邊,按一下「更多」圖示 >「重新命名」。將標題從「Code.gs
」變更為「bq-sheets-slides.js
」。 - 接著,請查看查詢 BigQuery 的程式碼,並將結果寫入 Google 試算表。您可以在
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
這項查詢會查詢莎士比亞的作品,做為 BigQuery 公開資料集的一部分,並產出所有作品中最常用的 10 個字詞,並以熱門程度由高至低排序。在想像一下手動執行這項編譯作業時,您會瞭解 BigQuery 的實用性有多高。
這個函式也會宣告 PROJECT_ID
變數,需要有效的 Cloud 控制台專案 ID。變數底下的 if
陳述式不正確,可避免應用程式在沒有專案 ID 的情況下繼續進行。
- 切換至您的 Cloud 控制台專案,按一下導覽列中的「更多」圖示 ,然後選取「專案設定」。
- 複製「專案 ID」下方列出的值。
- 切換回 App Script 編輯器,在
bq-sheets-slides.js
中找出PROJECT_ID
變數,然後新增值。 - 按一下「儲存」 >執行
- 按一下「查看權限」繼續操作。
- 指令碼開始執行後,內建執行記錄會即時開啟並記錄指令碼動作。
- 執行記錄顯示「執行完成」後,請前往 Google 雲端硬碟 (
drive.google.com
),找出名為「莎士比亞作品所有作品中的最常見的字詞」的 Google 試算表。(若您已更新QUERY_NAME
變數,則為指派給該變數的名稱): - 開啟試算表即可查看 10 個最常見的字詞,以及各字詞總數 (遞減排序):
工作 1 摘要
為了審查,您執行了一些程式碼,查詢莎士比亞每部作品的所有字。計算字詞並依顯示順序遞減排序。並且使用 Google 試算表專用的 Apps Script 內建服務顯示這項資料。
您也可以在本程式碼研究室的 GitHub 存放區 (github.com/googlecodelabs/bigquery-sheets-slides) 中找到用於 bq-sheets-slides.js
的程式碼。step1
程式碼參考自這個 BigQuery 進階服務頁面中的原始範例,而該頁面會執行略為不同的查詢,擷取含有莎士比亞所使用的 10 個以上字元的熱門字詞。您也可以在 GitHub 存放區中查看範例。
如果您對可透過莎士比亞作品或其他公開資料表建立的其他查詢感興趣,請參閱如何查詢 BigQuery 範例資料表和這個 GitHub 存放區。
您也可以在 Apps Script 中,先使用 Cloud 控制台的 BigQuery 頁面執行查詢。如要查看這個專區,請按一下「選單」圖示 ,然後前往「BigQuery UI」SQL 工作區 (直接連結)。舉例來說,以下是查詢在 BigQuery 圖形介面中的顯示方式:
5. 工作 2:在 Google 試算表中建立圖表
runQuery()
的用途是使用 BigQuery,並將資料結果傳送到 Google 試算表。接下來,我們需要使用資料製作圖表。我們來建立名為 createColumnChart()
的新函式,該函式會呼叫 Google 試算表newChart()
方法。
- 在 Apps Script 編輯器中,將
createColumnChart()
函式新增至bq-sheets-slides.js
,並在runQuery()
後方。程式碼會取得工作表,並要求包含所有資料的柱狀圖。第一列包含欄標題,因此資料範圍從儲存格 A2 開始。
/**
* Uses spreadsheet data to create a column chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} Visualizes the results
* @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first) 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 values.
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);
}
createColumnChart()
函式需要試算表物件參數,因此我們必須更新runQuery()
,以傳回可傳遞至createColumnChart()
的spreadsheet
物件。在runQuery()
結尾,記錄成功建立工作表後傳回spreadsheet
物件:
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
// NEW: Return the spreadsheet object for later use.
return spreadsheet;
}
- 建立
createBigQueryPresentation()
函式,同時呼叫runQuery()
和createColumnChart()
。最佳做法是將 BigQuery 和圖表建立功能進行邏輯區隔:
/**
* Runs the query, adds data and a chart to a spreadsheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
createColumnChart(spreadsheet);
}
- 您完成上述 2 個重要步驟:傳回試算表物件並建立項目函式。為了讓
runQuery()
更實用,我們必須將記錄行從runQuery()
移至createBigQueryPresentation()
。您的方法現在應如下所示:
/**
* Runs a BigQuery query, adds data and a chart to a spreadsheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); // MOVED HERE
createColumnChart(spreadsheet);
}
透過上述變更 (PROJECT_ID
除外),bq-sheets-slides.js
現在應如下所示。您也可以在 GitHub 存放區的 step2
中找到這個程式碼。
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into a sheet. You must turn on
* the BigQuery advanced service before you can run this code.
* @see https://developers.google.com/apps-script/advanced/bigquery#run_query
* @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see https://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 BigQuery 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 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 a columnar chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} Visualizes the results
* @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first) 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 values.
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 to a spreadsheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
createColumnChart(spreadsheet);
}
在指令碼編輯器中儲存指令碼專案。接著,從函式清單中選取 createBigQueryPresentation
,然後按一下「Run」。完成後,您的 Google 雲端硬碟中會建立另一份試算表,但現在資料旁顯示的工作表中會顯示圖表:
6. 任務 3:將結果資料應用到簡報中
程式碼研究室的最後一個部分,是建立 Google 簡報,在標題投影片中加入標題和副標題,然後為資料儲存格和圖表製作投影片。
- 在 Apps Script 編輯器中,將
createSlidePresentation()
函式新增至bq-sheets-slides.js
,並在createColumnChart()
後方。簡報中的所有作業都是透過這個函式進行。我們先建立簡報,然後在預設標題投影片中新增標題和副標題。
/**
* Create presentation with spreadsheet data and a chart
* @param {Spreadsheet} Spreadsheet containing results data
* @param {EmbeddedChart} Sheets chart to embed on a slide
* @returns {Presentation} Slide deck with the results
* @see https://developers.google.com/apps-script/reference/slides/presentation
*/
function createSlidePresentation(spreadsheet, chart) {
// Create the 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('using Google Cloud Console and Google Workspace APIs:\n' +
'Google Apps Script, BigQuery, Sheets, Slides');
createSlidePresentation()
的下一步是將 Google 試算表中的儲存格資料匯入到新的簡報。將下列程式碼片段新增至函式:
// 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 with
// the dimensions of the data range; fails if the sheet is 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]));
}
}
createSlidePresentation()
的最後一個步驟是再加入一張投影片、從試算表匯入圖表,然後傳回Presentation
物件。將下列程式碼片段新增至函式:
// 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;
}
- 現在函式已經完成,請再查看其簽章。
createSlidePresentation()
需要試算表和圖表物件參數。我們調整了runQuery()
以傳回Spreadsheet
物件,但同時也需要與createColumnChart()
進行類似變更,以便傳回圖表物件 (EmbeddedChart
)。返回createColumnChart()
,然後將下列程式碼片段新增至函式的結尾:
// NEW: Return the chart object for later use.
return chart;
}
- 由於
createColumnChart()
現在會傳回圖表物件,因此我們需要將圖表儲存至變數。然後,我們會將試算表和圖表變數「同時」傳遞至createSlidePresentation()
。同理,由於我們會記錄新建立試算表的網址,所以也可以記錄新簡報的網址。請更新createBigQueryPresentation()
,如下所示:
/**
* Runs a BigQuery query, adds data and a chart to a spreadsheet,
* 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
}
- 儲存並執行
createBigQueryPresentation()
。但使用者需要額外授予一組權限,才能檢視及管理 Google 簡報檔案,然後再加以執行。一旦您檢閱並允許這些權限,就會照常運作。 - 現在,除了自行建立的試算表外,建議您也安裝一份新的簡報,內含 3 張投影片 (標題、資料表、資料圖表),如下所示:
7. 結語
恭喜!您已成功建立同時使用 Google Cloud 兩側的應用程式。其執行 Google BigQuery 要求,查詢其其中一個公開資料集、建立 Google 試算表來儲存結果、根據資料新增圖表,最後再使用 Google 簡報建立包含試算表資料和圖表結果的 Google 簡報。
這些步驟就是您在技術上執行的作業。廣泛來說,您從大數據分析到可以向相關人員呈現的結果,所有作業都能使用程式碼自動進行。希望這個範例可鼓勵您根據自己的專案自訂此範例。在本程式碼研究室的結尾,我們會提供一些建議,協助您瞭解如何進一步強化這個範例應用程式。
完成最終工作 (PROJECT_ID
除外) 的變更後,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.
*/
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into a spreadsheet. You must turn on
* the BigQuery advanced service before you can run this code.
* @see https://developers.google.com/apps-script/advanced/bigquery#run_query
* @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see https://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 BigQuery 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 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 a column chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} Visualizes the results
* @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first) 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 values.
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 and a chart
* @param {Spreadsheet} Spreadsheet containing results data
* @param {EmbeddedChart} Sheets chart to embed on a slide
* @returns {Presentation} Slide deck with the results
* @see https://developers.google.com/apps-script/reference/slides/presentation
*/
function createSlidePresentation(spreadsheet, chart) {
// Create the 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('using Google Cloud Console and Google Workspace 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 with
// the dimensions of the data range; fails if the sheet is 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 to a spreadsheet,
* 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());
}
您也可以在 GitHub 存放區的 final
資料夾中找到這個程式碼範例。
8. 其他資源
下列資源有助於深入瞭解本程式碼研究室涵蓋的內容,並探索透過程式輔助方式存取 Google 開發人員工具的其他方式。
這個應用程式的資源
說明文件
影片
新聞與動態
- Google Cloud Platform 網誌
- Google Cloud 資料分析網誌
- Google Developers 網誌
- Twitter:Google Developers (@googledevs)
- Google Workspace 開發人員網誌
- Twitter:Google Workspace Developers (@workspacedevs)
其他程式碼研究室
入門
- [Google 試算表] Google 試算表 Apps Script 基礎知識
- [REST API] 使用 Google Workspace 和使用 Google API 來存取檔案和Google 雲端硬碟中的資料夾
中級
- [Apps Script] CLASP Apps Script 指令列工具
- [Apps Script] Gmail 專用 Google Workspace 外掛程式
- [Apps Script] Hangouts Chat 專用的自訂機器人
- [REST API] 使用 Google 試算表做為應用程式的報表工具
- [REST API] 使用 BigQuery API 產生 Google 簡報檔案
9. 下一步:程式碼挑戰
以下列出各種強化或擴充本程式碼研究室建構範例的方法。這份清單並不完整,但會提供一些靈感,協助您瞭解如何採取下一步。
- 應用程式:不想使用 JavaScript,或是 Apps Script 的限制將應用程式轉移至您偏好的程式設計語言,而且該語言使用 Google BigQuery、試算表和簡報的 REST API。
- BigQuery - 嘗試不同的查詢,找到感興趣的莎士比亞資料集。您可以在原始的 Apps Script BigQuery 範例應用程式中找到其他查詢範例。
- BigQuery:試用 BigQuery 的其他公開資料集,找出對您比較有意義的資料集。
- BigQuery:我們稍早曾提過,您可以運用莎士比亞作品或其他公開資料表建構的其他查詢。您可以在這個網頁和這個 GitHub 存放區中找到上述範例。
- 試算表:在圖表庫中測試其他圖表類型。
- 試算表與BigQuery:使用自己的大型試算表資料集。2016 年,BigQuery 團隊推出了一項功能,可讓開發人員使用試算表做為資料來源。詳情請參閱「Google BigQuery 與 Google 雲端硬碟整合」。
- 簡報:在產生的簡報中新增其他投影片,例如與大數據分析相關的圖片或其他資產。以下是簡報內建服務的參考說明文件。
- Google Workspace:使用其他 Google Workspace 或 Google 提供的 Apps Script 內建服務。例如 Gmail、日曆、文件、雲端硬碟、地圖、Analytics 和 YouTube 等。詳情請參閱內建和進階服務的參考資料總覽。