Biến dữ liệu lớn thành thông tin chi tiết bằng Google Trang tính và Trang trình bày

1. Từ phân tích dữ liệu lớn đến trình bày bằng trang chiếu

Có nhiều công cụ để nhà khoa học dữ liệu thực hiện phân tích dữ liệu lớn, nhưng cuối cùng, nhà phân tích vẫn phải giải thích kết quả cho ban quản lý. Việc trình bày nhiều con số trên giấy hoặc trong cơ sở dữ liệu cho các bên liên quan chính là điều khó khăn. Lớp học lập trình Google Apps Script ở cấp độ trung cấp này sử dụng 2 nền tảng dành cho nhà phát triển của Google (Google WorkspaceGoogle Cloud Console) để giúp bạn tự động hoá giai đoạn cuối cùng đó.

Các công cụ dành cho nhà phát triển của Google Cloud giúp bạn thực hiện phân tích dữ liệu chuyên sâu. Sau đó, bạn có thể lấy kết quả, chèn kết quả vào một bảng tính và tạo bản trình bày bằng dữ liệu đó. Điều này mang đến một cách phù hợp hơn để cung cấp dữ liệu cho ban quản lý. Lớp học lập trình này đề cập đến API BigQuery của Cloud Console (dưới dạng một dịch vụ nâng cao của Apps Script) và các dịch vụ tích hợp của Apps Script cho Google Trang tínhGoogle Trang trình bày.

Động lực

Ứng dụng mẫu trong lớp học lập trình này được lấy cảm hứng từ những mã mẫu khác sau đây:

Mặc dù ứng dụng mẫu trong lớp học lập trình Slides API cũng có BigQuery và Trang trình bày, nhưng ứng dụng này khác với ứng dụng mẫu trong lớp học lập trình này ở một số điểm:

  • Ứng dụng Node.js của họ so với ứng dụng Apps Script của chúng tôi.
  • Họ sử dụng API REST trong khi chúng tôi sử dụng các dịch vụ Apps Script.
  • Họ sử dụng Google Drive nhưng không sử dụng Google Trang tính, trong khi ứng dụng này sử dụng Trang tính nhưng không sử dụng Drive.

Trong lớp học lập trình này, chúng tôi muốn kết hợp nhiều công nghệ vào một ứng dụng duy nhất, đồng thời giới thiệu các tính năng và API từ Google Cloud theo cách giống với một trường hợp sử dụng thực tế. Mục tiêu của chúng tôi là truyền cảm hứng để bạn sử dụng trí tưởng tượng và cân nhắc sử dụng cả Cloud Console lẫn Google Workspace để giải quyết những vấn đề khó khăn cho tổ chức và khách hàng của bạn.

Kiến thức bạn sẽ học được

  • Cách sử dụng Google Apps Script với nhiều dịch vụ của Google
  • Cách sử dụng Google BigQuery để phân tích dữ liệu lớn
  • Cách tạo một Google Trang tính và chèn dữ liệu vào trang tính đó
  • Cách tạo biểu đồ trong Trang tính
  • Cách chuyển dữ liệu và biểu đồ từ Trang tính sang bản trình bày trên Google Trang trình bày

Bạn cần có

  • Một trình duyệt web có quyền truy cập vào Internet
  • Tài khoản Google (Tài khoản Google Workspace có thể yêu cầu quản trị viên phê duyệt)
  • Hiểu biết cơ bản về Google Trang tính
  • Có thể đọc Ký hiệu A1 của Trang tính
  • Kỹ năng cơ bản về JavaScript
  • Bạn nên có kiến thức về phát triển Apps Script nhưng không bắt buộc

2. Khảo sát

Bạn sẽ sử dụng lớp học lập trình/hướng dẫn này như thế nào?

Đọc để biết thông tin, có thể chuyển cho đồng nghiệp kỹ thuật Đọc kỹ nhất có thể và thử làm nhiều bài tập nhất có thể Dù có chuyện gì xảy ra, tôi cũng sẽ hoàn thành toàn bộ lớp học lập trình này

Bạn đánh giá thế nào về trải nghiệm của mình khi sử dụng các công cụ và API dành cho nhà phát triển của Google Workspace?

Người mới bắt đầu Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm của mình với Apps Script?

Người mới bắt đầu Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm của mình với các API và công cụ dành cho nhà phát triển trên Cloud Console?

Người mới bắt đầu Trung cấp Thành thạo

3. Tổng quan

Giờ đây, bạn đã biết nội dung của lớp học lập trình này. Sau đây là những việc bạn sẽ làm:

  1. Lấy một mẫu Apps Script-BigQuery hiện có và làm cho mẫu đó hoạt động.
  2. Từ mẫu này, hãy tìm hiểu cách gửi truy vấn đến BigQuery và nhận kết quả.
  3. Tạo một Google Trang tính rồi chèn kết quả từ BigQuery vào đó.
  4. Sửa đổi mã để thay đổi một chút dữ liệu được trả về và chèn vào Trang tính.
  5. Sử dụng dịch vụ Trang tính trong Apps Script để tạo biểu đồ cho dữ liệu BigQuery.
  6. Sử dụng dịch vụ Trang trình bày để tạo bản trình bày trong Google Trang trình bày.
  7. Thêm tiêu đề và phụ đề vào trang trình bày tiêu đề mặc định.
  8. Tạo một trang trình bày có bảng dữ liệu và xuất các ô dữ liệu của Trang tính vào trang trình bày đó.
  9. Tạo một trang trình bày khác và chèn biểu đồ trong bảng tính vào trang trình bày đó.

Hãy bắt đầu bằng một số thông tin cơ bản về Apps Script, BigQuery, Trang tính và Trang trình bày.

Google Apps Script và BigQuery

Google Apps Script là một nền tảng phát triển Google Workspace hoạt động ở cấp độ cao hơn so với API REST của Google. Đây là một môi trường phát triển không máy chủ và lưu trữ ứng dụng mà mọi nhà phát triển ở mọi trình độ đều có thể truy cập. Về cơ bản, Apps Script là một thời gian chạy JavaScript không cần máy chủ để tự động hoá, mở rộng và tích hợp Google Workspace.

Nền tảng này sử dụng JavaScript phía máy chủ, tương tự như Node.js, nhưng tập trung vào việc tích hợp chặt chẽ với Google Workspace và các dịch vụ khác của Google thay vì lưu trữ ứng dụng dựa trên sự kiện không đồng bộ, nhanh chóng. Nền tảng này cũng có một môi trường phát triển có thể khác với môi trường mà bạn đang sử dụng. Với Apps Script, bạn có thể:

  • Phát triển tập lệnh bằng trình soạn thảo mã dựa trên trình duyệt nhưng cũng có thể phát triển cục bộ khi sử dụng clasp, công cụ triển khai dòng lệnh cho Apps Script.
  • Viết mã bằng một phiên bản JavaScript chuyên biệt được tuỳ chỉnh để truy cập vào Google Workspace và các dịch vụ khác của Google hoặc dịch vụ bên ngoài (bằng cách sử dụng các dịch vụ URL Fetch hoặc JDBC của Apps Script).
  • Bạn có thể tránh viết mã uỷ quyền vì Apps Script sẽ xử lý mã này cho bạn.
  • Bạn không cần lưu trữ ứng dụng vì ứng dụng sẽ hoạt động trên các máy chủ của Google trên đám mây.

Apps Script tương tác với các công nghệ khác của Google theo 2 cách:

  • Là một dịch vụ tích hợp
  • Là một dịch vụ nâng cao

Dịch vụ tích hợp có các phương thức cấp cao để tương tác với dữ liệu người dùng, các hệ thống khác của Google và các hệ thống bên ngoài. Dịch vụ nâng cao về cơ bản là một trình bao bọc mỏng xung quanh một API của Google Workspace hoặc API REST của Google. Các dịch vụ nâng cao cung cấp phạm vi bao phủ đầy đủ cho API REST và thường có thể làm được nhiều việc hơn các dịch vụ tích hợp, nhưng chúng đòi hỏi độ phức tạp của mã cao hơn (mặc dù vẫn dễ sử dụng hơn API REST đầy đủ). Bạn cũng phải bật dịch vụ nâng cao cho một dự án tập lệnh trước khi sử dụng.

Nếu có thể, nhà phát triển nên sử dụng một dịch vụ tích hợp sẵn vì các dịch vụ này dễ sử dụng hơn và có nhiều chức năng hơn các dịch vụ nâng cao. Tuy nhiên, một số API của Google không có dịch vụ tích hợp, vì vậy, dịch vụ nâng cao có thể là lựa chọn duy nhất. Ví dụ: Google BigQuery không có dịch vụ tích hợp sẵn, nhưng Dịch vụ BigQuery thì có. Dịch vụ BigQuery là một dịch vụ của Cloud Console, cho phép bạn sử dụng API Google BigQuery để thực hiện các truy vấn trên các tập dữ liệu lớn (ví dụ: nhiều terabyte) nhưng vẫn có thể cung cấp kết quả trong vài giây.

Truy cập vào Trang tính và Trang trình bày thông qua Apps Script

Không giống như BigQuery, cả Trang tính và Trang trình bày đều có các dịch vụ tích hợp. Các dịch vụ này cũng có các dịch vụ nâng cao để truy cập vào những tính năng chỉ có trong API. Xem tài liệu cho cả dịch vụ Trang tínhTrang trình bày tích hợp sẵn trước khi chuyển sang mã. Xin lưu ý rằng cũng có tài liệu cho các dịch vụ nâng cao của cả Trang tínhTrang trình bày.

4. Việc 1: Chạy BigQuery và ghi kết quả vào Trang tính

Giới thiệu

Chúng ta sẽ thực hiện phần lớn lớp học lập trình này với nhiệm vụ đầu tiên này. Trên thực tế, sau khi hoàn thành bước này, bạn sẽ hoàn thành khoảng một nửa lớp học lập trình. Được chia thành nhiều phần nhỏ, bạn sẽ:

  • Tạo cả dự án Google Apps Script và dự án Cloud Console.
  • Bật quyền truy cập vào dịch vụ nâng cao của BigQuery.
  • Mở trình chỉnh sửa tập lệnh rồi nhập mã nguồn ứng dụng.
  • Điều hướng quy trình uỷ quyền ứng dụng (OAuth2).
  • Chạy ứng dụng gửi yêu cầu đến BigQuery.
  • Xem lại Google Trang tính mới được tạo bằng kết quả BigQuery.

Thiết lập

  1. Để tạo một dự án Apps Script, hãy chuyển đến script.google.com rồi nhấp vào Dự án mới.
  2. Để đổi tên dự án Apps Script, hãy nhấp vào Dự án chưa có tên, nhập tiêu đề cho dự án rồi nhấp vào Đổi tên.

Tiếp theo, bạn cần tạo một dự án trên Cloud Console để truy vấn dữ liệu trong BigQuery.

  1. Để tạo một dự án trên Cloud Console, hãy dùng đường liên kết tắt này để tạo một dự án, đặt tên cho dự án rồi nhấp vào Tạo.
  1. Khi quá trình tạo dự án hoàn tất, một thông báo sẽ xuất hiện trên trang. Đảm bảo rằng dự án mới của bạn được chọn trong danh sách dự án ở đầu trang.
  2. Nhấp vào biểu tượng Trình đơn f5fbd278915eb7aa.png rồi chuyển đến API và Dịch vụ > Màn hình xin phép bằng OAuth (đường liên kết trực tiếp).
  3. Nhấp vào Nội bộ > Tạo để tạo một ứng dụng cho người dùng Google Workspace trong tổ chức của bạn.
  4. Trong trường Tên ứng dụng, hãy nhập "Big Data Codelab".
  5. Nhập email liên hệ cho các trường Hỗ trợ người dùngThông tin liên hệ của nhà phát triển.
  6. Nhấp vào Lưu và tiếp tục > Lưu và tiếp tục.
  7. Nhấp vào biểu tượng Tuỳ chọn khác 50fa7e30ed2d1b1c.png trên thanh điều hướng rồi chọn Cài đặt dự án (đường liên kết trực tiếp).
  8. Sao chép giá trị có trong mục Số dự án. (Trường Mã dự án riêng biệt sẽ được dùng sau trong lớp học lập trình.)

Tiếp theo, bạn sẽ kết nối dự án Apps Script với dự án trên Cloud Console.

  1. Chuyển sang trình chỉnh sửa tập lệnh App Script rồi nhấp vào Cài đặt dự án settings-gear.
  2. Trong mục Dự án trên Google Cloud Platform (GCP), hãy nhấp vào Thay đổi dự án.
  3. Nhập số dự án rồi nhấp vào Đặt dự án.
  4. Tiếp theo, hãy nhấp vào Trình chỉnh sửa code-editor để bắt đầu thêm dịch vụ nâng cao BigQuery.
  5. Bên cạnh Dịch vụ, hãy nhấp vào biểu tượng Thêm dịch vụ thêm dịch vụ.
  6. Trên hộp thoại Thêm dịch vụ, hãy chọn BigQuery API rồi nhấp vào Thêm.

Bước cuối cùng là bật BigQuery API trên Cloud Console.

  1. Để thực hiện việc này, hãy chuyển sang Cloud Console rồi nhấp vào API và dịch vụ > Trang tổng quan. (Đảm bảo bạn vẫn đang ở trên cùng một dự án mà bạn đã tạo ở Bước 3.)
  2. Nhấp vào Bật API và dịch vụ.
  3. Tìm "big query", chọn BigQuery API (không phải API Chuyển dữ liệu BigQuery) rồi nhấp vào Bật để bật API này.

a0e07fa159de9367.png

Giờ đây, bạn đã sẵn sàng nhập mã xử lý ứng dụng, thực hiện quy trình uỷ quyền và chạy phiên bản đầu tiên của ứng dụng này.

Tải ứng dụng lên và kích hoạt ứng dụng

  1. Trong trình chỉnh sửa tập lệnh, hãy thay thế khối mã myFunction() mặc định bằng mã sau:
// 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());
}
  1. Nhấp vào biểu tượng Lưu lưu.
  2. Bên cạnh Code.gs, hãy nhấp vào biểu tượng Tuỳ chọn khác 50fa7e30ed2d1b1c.png > Đổi tên. Thay đổi tiêu đề từ Code.gs thành bq-sheets-slides.js.
  3. Tiếp theo, hãy xem xét đoạn mã truy vấn BigQuery và ghi kết quả vào một Google Trang tính. Bạn có thể xem thông tin này ở gần đầu 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

Truy vấn này tìm kiếm trong các tác phẩm của Shakespeare (một phần của tập dữ liệu công khai của BigQuery) và tạo ra 10 từ xuất hiện thường xuyên nhất trong tất cả các tác phẩm của ông, được sắp xếp theo thứ tự giảm dần về mức độ phổ biến. Bạn sẽ hình dung được mức độ hữu ích của BigQuery khi tưởng tượng đến khối lượng công việc cần thiết để thực hiện việc tổng hợp này theo cách thủ công.

Hàm này cũng khai báo một biến PROJECT_ID yêu cầu mã dự án hợp lệ trên Cloud Console. Câu lệnh if trong biến này có tác dụng ngăn ứng dụng tiếp tục mà không có mã dự án.

  1. Chuyển sang dự án Cloud Console của bạn, nhấp vào biểu tượng Tuỳ chọn khác 50fa7e30ed2d1b1c.png trên thanh điều hướng rồi chọn Cài đặt dự án.
  2. Sao chép giá trị được liệt kê trong phần Mã dự án.
  3. Chuyển lại sang trình chỉnh sửa Apps Script, tìm biến PROJECT_ID trong bq-sheets-slides.js rồi thêm giá trị.
  4. Nhấp vào Lưu lưu > Chạy.
  5. Nhấp vào Xem xét các quyền để tiếp tục.
  1. Sau khi tập lệnh bắt đầu chạy, nhật ký thực thi tích hợp sẽ mở ra và ghi lại các thao tác của tập lệnh theo thời gian thực.
  1. Sau khi nhật ký thực thi hiển thị "Execution completed" (Đã thực thi xong), hãy chuyển đến Google Drive (drive.google.com) và tìm tệp Google Trang tính có tên "Most common words in all of Shakespeare's works" (Những từ phổ biến nhất trong tất cả các tác phẩm của Shakespeare) (hoặc tên mà bạn đã chỉ định cho biến QUERY_NAME, nếu bạn đã cập nhật tên đó):
  2. Mở bảng tính để xem 10 từ phổ biến nhất và tổng số lần xuất hiện của các từ đó được sắp xếp theo thứ tự giảm dần:

afe500ad43f8cdf8.png

Tóm tắt nhiệm vụ 1

Để xem xét, bạn đã chạy một đoạn mã truy vấn tất cả các tác phẩm của Shakespeare, xem xét từng từ trong từng vở kịch. Công cụ này đếm số từ và sắp xếp chúng theo thứ tự giảm dần về số lần xuất hiện. Bạn cũng đã sử dụng dịch vụ tích hợp Apps Script cho Google Trang tính để hiển thị dữ liệu này.

Bạn cũng có thể tìm thấy mã mà bạn đã dùng cho bq-sheets-slides.js trong thư mục step1 của kho lưu trữ GitHub cho lớp học lập trình này tại github.com/googlecodelabs/bigquery-sheets-slides. Đoạn mã này được lấy cảm hứng từ ví dụ ban đầu này trong trang dịch vụ nâng cao của BigQuery. Ví dụ này chạy một truy vấn hơi khác để truy xuất những từ phổ biến nhất có từ 10 ký tự trở lên mà Shakespeare đã sử dụng. Bạn cũng có thể xem ví dụ trong kho lưu trữ GitHub của ứng dụng này.

Nếu bạn quan tâm đến các truy vấn khác mà bạn có thể tạo bằng các tác phẩm của Shakespeare hoặc các bảng dữ liệu công khai khác, hãy truy cập vào Cách truy vấn các bảng mẫu BigQuerykho lưu trữ này trên GitHub.

Bạn cũng có thể chạy các truy vấn bằng trang BigQuery trên Cloud Console trước khi chạy các truy vấn đó trong Apps Script. Để tìm không gian làm việc này, hãy nhấp vào biểu tượng Trình đơn f5fbd278915eb7aa.png rồi chuyển đến Giao diện người dùng BigQuery > Không gian làm việc SQL (đường liên kết trực tiếp). Ví dụ: sau đây là cách truy vấn của chúng tôi xuất hiện trên giao diện đồ hoạ BigQuery:

BigQueryUI

5. Việc 2: Tạo biểu đồ trong Google Trang tính

Mục đích của runQuery() là sử dụng BigQuery và gửi kết quả dữ liệu của BigQuery đến một Google Trang tính. Tiếp theo, chúng ta cần tạo một biểu đồ bằng dữ liệu này. Hãy tạo một hàm mới có tên là createColumnChart() để gọi phương thức newChart() của Trang tính.

  1. Trong trình chỉnh sửa tập lệnh Apps Script, hãy thêm hàm createColumnChart() vào bq-sheets-slides.js sau runQuery(). Mã này sẽ lấy trang tính và yêu cầu một biểu đồ dạng cột có tất cả dữ liệu. Phạm vi dữ liệu bắt đầu từ ô A2 vì hàng đầu tiên chứa tiêu đề cột.
/**
 * 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);
}
  1. Hàm createColumnChart() cần có một tham số đối tượng bảng tính, vì vậy, chúng ta cần cập nhật runQuery() để trả về một đối tượng spreadsheet mà chúng ta có thể truyền đến createColumnChart(). Ở cuối runQuery(), hãy trả về đối tượng spreadsheet sau khi ghi nhật ký quá trình tạo trang thành công:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. Tạo một hàm createBigQueryPresentation() để gọi cả runQuery()createColumnChart(). Tách riêng một cách hợp lý chức năng tạo biểu đồ và BigQuery là phương pháp hay nhất:
/**
 * Runs the query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. Bạn đã thực hiện 2 bước quan trọng ở trên: trả về đối tượng bảng tính và tạo hàm nhập. Để giúp runQuery() dễ sử dụng hơn, chúng ta cần di chuyển dòng nhật ký từ runQuery() sang createBigQueryPresentation(). Bây giờ, phương thức của bạn sẽ có dạng như sau:
/**
 * 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);
}

Với những thay đổi nêu trên (ngoại trừ PROJECT_ID), bq-sheets-slides.js của bạn giờ đây sẽ có dạng như sau. Bạn cũng có thể tìm thấy đoạn mã này trong step2 của kho lưu trữ GitHub.

// 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);
}

Trong trình chỉnh sửa tập lệnh, hãy lưu dự án tập lệnh của bạn. Sau đó, chọn createBigQueryPresentation trong danh sách hàm rồi nhấp vào Run (Chạy). Sau khi quá trình này hoàn tất, một bảng tính khác sẽ được tạo trong Google Drive của bạn, nhưng lần này, một biểu đồ sẽ được đưa vào trang tính bên cạnh dữ liệu:

Trang tính có biểu đồ

6. Việc 3: Đưa dữ liệu kết quả vào bản trình bày

Phần cuối cùng của lớp học lập trình liên quan đến việc tạo một bản trình bày trên Google Trang trình bày, thêm tiêu đề và phụ đề vào trang trình bày tiêu đề, sau đó tạo các trang trình bày cho các ô dữ liệu và biểu đồ.

  1. Trong trình chỉnh sửa tập lệnh Apps Script, hãy thêm hàm createSlidePresentation() vào bq-sheets-slides.js sau createColumnChart(). Mọi thao tác trên bộ trang trình bày đều diễn ra trong hàm này. Hãy bắt đầu bằng việc tạo một bộ trang trình bày, sau đó thêm tiêu đề và phụ đề vào trang trình bày tiêu đề mặc định.
/**
 * 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');
  1. Bước tiếp theo trong createSlidePresentation() là nhập dữ liệu ô từ Google Trang tính vào bản trình bày mới. Thêm đoạn mã này vào hàm:
  // 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]));
    }
  }
  1. Bước cuối cùng trong createSlidePresentation() là thêm một trang trình bày nữa, nhập biểu đồ từ bảng tính của chúng ta và trả về đối tượng Presentation. Thêm đoạn mã này vào hàm:
  // 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. Bây giờ, hàm của chúng ta đã hoàn tất, hãy xem lại chữ ký của hàm. createSlidePresentation() yêu cầu cả tham số đối tượng biểu đồ và bảng tính. Chúng ta đã điều chỉnh runQuery() để trả về đối tượng Spreadsheet, nhưng chúng ta cần thực hiện một thay đổi tương tự đối với createColumnChart() để hàm này trả về một đối tượng biểu đồ (EmbeddedChart). Quay lại createColumnChart() rồi thêm đoạn mã sau vào cuối hàm:
  // NEW: Return the chart object for later use.
  return chart;
}
  1. createColumnChart() hiện trả về một đối tượng biểu đồ, nên chúng ta cần lưu biểu đồ vào một biến. Sau đó, chúng ta sẽ truyền cả bảng tính và các biến biểu đồ đến createSlidePresentation(). Ngoài ra, vì chúng ta ghi nhật ký URL của bảng tính mới tạo, nên hãy ghi nhật ký URL của bản trình bày mới. Cập nhật createBigQueryPresentation() để có dạng như sau:
/**
 * 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
}
  1. Lưu và chạy lại createBigQueryPresentation(). Tuy nhiên, trước khi thực thi, ứng dụng của bạn cần thêm một bộ quyền nữa của người dùng để xem và quản lý bản trình bày trên Google Trang trình bày. Sau khi bạn xem xét và cho phép các quyền này, ứng dụng sẽ chạy như trước.
  2. Giờ đây, ngoài bảng tính đã tạo, bạn cũng sẽ nhận được một bản trình bày mới trên Trang trình bày có 3 trang trình bày (tiêu đề, bảng dữ liệu, biểu đồ dữ liệu), như minh hoạ dưới đây:

f6896f22cc3cd50d.png

59960803e62f7c69.png

5549f0ea81514360.png

7. Kết luận

Xin chúc mừng! Bạn đã tạo một ứng dụng sử dụng cả hai phía của Google Cloud. Tập lệnh này thực hiện một yêu cầu Google BigQuery để truy vấn một trong các tập dữ liệu công khai của BigQuery, tạo một bảng tính Google Trang tính để lưu trữ kết quả, thêm một biểu đồ dựa trên dữ liệu và cuối cùng tạo một bản trình bày trên Google Trang trình bày có chứa dữ liệu và kết quả biểu đồ từ bảng tính.

Đây là những bước bạn đã thực hiện về mặt kỹ thuật. Nói chung, bạn đã chuyển từ phân tích dữ liệu lớn sang một kết quả mà bạn có thể trình bày cho các bên liên quan – tất cả đều được tự động hoá bằng mã. Chúng tôi hy vọng mẫu này sẽ truyền cảm hứng để bạn tuỳ chỉnh cho các dự án của riêng mình. Khi kết thúc lớp học lập trình này, chúng tôi sẽ đưa ra một số đề xuất về cách bạn có thể nâng cao hơn nữa ứng dụng mẫu này.

Với những thay đổi trong nhiệm vụ cuối cùng (ngoại trừ PROJECT_ID), bq-sheets-slides.js của bạn giờ đây sẽ có dạng như sau:

/**
 * 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());
}

Bạn cũng có thể tìm thấy mã mẫu này trong thư mục final trong kho lưu trữ GitHub.

8. Tài nguyên khác

Dưới đây là các tài nguyên khác giúp bạn tìm hiểu sâu hơn về nội dung được đề cập trong lớp học lập trình này và khám phá những cách khác để truy cập vào các công cụ dành cho nhà phát triển của Google theo phương thức lập trình.

Tài nguyên cho ứng dụng này

Tài liệu

Video

Tin tức và thông tin cập nhật

Các lớp học lập trình khác

Cơ bản

Bậc trung

9. Bước tiếp theo: thử thách về mã

Dưới đây là một số cách để bạn có thể cải thiện hoặc tăng cường mẫu mà chúng ta đã tạo trong lớp học lập trình này. Danh sách này chưa đầy đủ nhưng có thể giúp bạn có thêm ý tưởng để thực hiện bước tiếp theo.

  • Ứng dụng – Bạn không muốn bị giới hạn chỉ sử dụng JavaScript hoặc bị hạn chế bởi Apps Script? Chuyển ứng dụng này sang ngôn ngữ lập trình mà bạn yêu thích bằng cách sử dụng các API REST cho Google BigQuery, Trang tính và Trang trình bày.
  • BigQuery – Thử nghiệm với một truy vấn khác cho tập dữ liệu Shakespeare mà bạn quan tâm. Bạn có thể tìm thấy một truy vấn mẫu khác trong ứng dụng mẫu BigQuery ban đầu của Apps Script.
  • BigQuery – Thử nghiệm với một số tập dữ liệu công khai khác của BigQuery để tìm một tập dữ liệu có ý nghĩa hơn đối với bạn.
  • BigQuery – Trước đó, chúng tôi đã đề cập đến những truy vấn khác mà bạn có thể tạo bằng các tác phẩm của Shakespeare hoặc các bảng dữ liệu công khai khác. Bạn có thể tìm thấy các mẫu này trên trang web nàykho lưu trữ này trên GitHub.
  • Trang tính – Thử nghiệm các loại biểu đồ khác trong Thư viện biểu đồ.
  • Trang tính và BigQuery – Sử dụng tập dữ liệu bảng tính lớn của riêng bạn. Vào năm 2016, nhóm BigQuery đã ra mắt một tính năng cho phép nhà phát triển sử dụng Trang tính làm nguồn dữ liệu. Để biết thêm thông tin, hãy xem bài viết (Google BigQuery tích hợp với Google Drive.
  • Trang trình bày – Thêm các trang trình bày khác vào bản trình bày được tạo, chẳng hạn như hình ảnh hoặc các thành phần khác liên kết với hoạt động phân tích dữ liệu lớn của bạn. Sau đây là tài liệu tham khảo cho dịch vụ tích hợp của Trang trình bày.
  • Google Workspace – Sử dụng các dịch vụ khác của Google Workspace hoặc các dịch vụ cài sẵn của Google từ Apps Script. Ví dụ: Gmail, Lịch, Tài liệu, Drive, Maps, Analytics, YouTube, v.v., cũng như các dịch vụ nâng cao khác. Để biết thêm thông tin, hãy xem tổng quan về thông tin tham khảo cho cả dịch vụ tích hợp và dịch vụ nâng cao.