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 trang trình bày

Có rất nhiều công cụ để nhà khoa học dữ liệu tiến hành phân tích dữ liệu lớn, nhưng cuối cùng, các nhà phân tích vẫn phải chứng minh kết quả cho cấp quản lý. Việc có quá nhiều số liệu trên giấy hoặc trong cơ sở dữ liệu hầu như không thể trình bày được cho các bên liên quan chính. Lớp học lập trình trung cấp về Google Apps Script 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á bước cuối cùng.

Các công cụ cho nhà phát triển của Google Cloud giúp bạ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 bảng tính và tạo một bản trình bày trang trình bày có dữ liệu. Điều này giúp cung cấp phương thức phù hợp hơn để phân phối dữ liệu cho bộ phận quản lý. Lớp học lập trình này bao gồm API BigQuery của Cloud Console (dưới dạng dịch vụ nâng cao của Apps Script) và dịch vụ Apps Script tích hợp dành 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ừ các mã mẫu khác sau đây:

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

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

Đối với 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 hiển thị các tính năng và API trên Google Cloud theo cách giống với trường hợp sử dụng thực tế. Mục tiêu của chương trình là truyền cảm hứng cho bạn vận dụng trí tưởng tượng và cân nhắc việc sử dụng cả Cloud Console và 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 Google Trang tính và chèn dữ liệu vào đó
  • 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ể cần phải được quản trị viên phê duyệt)
  • Quen thuộc cơ bản với Google Trang tính
  • Khả năng đọc Ký hiệu A1 trên Trang tính
  • Kỹ năng JavaScript cơ bản
  • Kiến thức về cách phát triển Apps Script rất hữu ích 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?

Hãy đọc qua để tham khảo, có thể chuyển cho đồng nghiệp kỹ thuật Cố gắng học hết mức có thể và thử nhiều bài tập nhất có thể Ôi trời ơi, tôi sẽ hoàn thành toàn bộ lớp học lập trình

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ụ của Google Workspace cho nhà phát triển và API?

Người mới tập Trung cấp Thành thạo

Cụ thể, bạn sẽ đánh giá trải nghiệm của mình với Apps Script như thế nào?

Người mới tập Trung cấp Thành thạo

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

Người mới tập Trung cấp Thành thạo

3. Tổng quan

Giờ thì 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ó để sử dụng.
  2. Từ mẫu, 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 tệp Google Trang tính rồi chèn kết quả từ BigQuery vào tệp đó.
  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 trên 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 trong Trang tính vào đó.
  9. Tạo một trang trình bày khác rồi chèn biểu đồ trong bảng tính vào trang đó.

Hãy bắt đầu với 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 của Google Workspace hoạt động ở cấp độ cao hơn các API Google REST. Đây là môi trường phát triển không máy chủ và lưu trữ ứng dụng mà mọi cấp độ kỹ năng của nhà phát triển đều có thể tiếp cận. Về cơ bản, Apps Script là một môi trường thời gian chạy JavaScript không máy chủ dành cho hoạt động tự động hoá, mở rộng và tích hợp Google Workspace.

Dịch vụ 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 nhanh chóng và không đồng bộ dựa trên sự kiện. Phiên bản này cũng có môi trường phát triển có thể khác với những gì bạn đã quen thuộc. Với Apps Script, bạn:

  • 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 bên ngoài (bằng các dịch vụ URL Fetch hoặc JDBC của Apps Script).
  • Có thể tránh viết mã uỷ quyền vì Apps Script xử lý mã này cho bạn.
  • Không phải lưu trữ ứng dụng của bạn—ứng dụng tồn tại và chạy trên các máy chủ của Google trên đám mây.

Apps Script kết nối với các công nghệ khác của Google theo 2 cách:

  • Dưới dạng dịch vụ tích hợp
  • Là dịch vụ nâng cao

Dịch vụ tích hợp sẵn chứa 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 API Google Workspace hoặc API Google REST. Các dịch vụ nâng cao cung cấp đầy đủ phạm vi của API REST và thường có thể hoạt động nhiều hơn so với các dịch vụ tích hợp sẵn. Tuy nhiên, các dịch vụ này yêu cầu mã phức tạp hơn (trong khi vẫn dễ sử dụng hơn so với API REST đầy đủ). Bạn cũng phải bật dịch vụ nâng cao cho dự án tập lệnh trước khi sử dụng.

Khi có thể, nhà phát triển nên sử dụng dịch vụ tích hợp sẵn vì dịch vụ này dễ dùng hơn và nhiều tính năng hơn so với các dịch vụ nâng cao. Tuy nhiên, một số API của Google không có các dịch vụ tích hợp sẵn, 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ó tồn tại. Dịch vụ BigQuery là một dịch vụ Cloud Console cho phép bạn sử dụng Google BigQuery API để thực hiện truy vấn trên các tập sao lục dữ liệu lớn (ví dụ: nhiều terabyte). Tuy nhiên, dịch vụ này vẫn có thể cung cấp kết quả sau vài giây.

Truy cập Trang tính và Trang trình bày từ 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 sẵn. Họ cũng có các dịch vụ nâng cao để sử dụng những tính năng chỉ có trong API. Hãy xem tài liệu về cả dịch vụ Trang tínhTrang trình bày tích hợp sẵn trước khi xem mã. Xin lưu ý rằng chúng tôi cũng có tài liệu về các dịch vụ nâng cao của cả Trang tínhTrang trình bày.

4. Nhiệm vụ 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 nội dung của lớp học lập trình này bằng nhiệm vụ đầu tiên này. Trên thực tế, sau khi hoàn tất, bạn sẽ đi được khoảng một nửa của toàn bộ lớp học lập trình. Được chia thành nhiều phần phụ, bạn sẽ:

  • Tạo cả một dự án Google Apps Script và Cloud Console.
  • Bật quyền truy cập vào dịch vụ BigQuery nâng cao.
  • Mở trình chỉnh sửa tập lệnh và nhập mã nguồn của ứng dụng.
  • Di chuyển trong quy trình uỷ quyền ứng dụng (OAuth2).
  • Chạy ứng dụng sẽ gửi yêu cầu đến BigQuery.
  • Xem lại tệp 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 phầ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 không có tiêu đề, nhập tên cho dự án của bạn rồi nhấp vào Đổi tên.

Tiếp theo, bạn sẽ 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 sử dụng đường liên kết đến lối tắt này để tạo 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. Hãy nhớ chọn dự án mới của bạ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 phầ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 "Lớp học lập trình về dữ liệu lớn".
  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 liệt kê trong phần Số dự án. (Bạn sẽ sử dụng một trường Mã dự án riêng biệt trong phần sau của lớp học lập trình này.)

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

  1. Chuyển sang trình chỉnh sửa App Script rồi nhấp vào biểu tượng Cài đặt dự án bánh-cài-đặt.
  2. Trong phần Dự á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 biểu tượng Trình chỉnh sửa trình soạn thảo mã để bắt đầu thêm dịch vụ BigQuery nâng cao.
  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. Trong hộp thoại Thêm dịch vụ, hãy chọn API BigQuery 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 Bảng điều khiển Cloud rồi nhấp vào API và Dịch vụ > Trang tổng quan. (Đảm bảo bạn vẫn đang sử dụng chính 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 "truy vấn lớn", chọn API BigQuery (không phải API chuyển dữ liệu BigQuery) rồi nhấp vào Bật để bật.

a0e07fa159de9367.png

Bây giờ, bạn đã sẵn sàng nhập mã xử lý ứng dụng, thực hiện quy trình cấp phép và bắt đầu hoạt động lặp lại đầu tiên của ứng dụng này.

Tải ứng dụng lên và chạy ứ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 đoạn 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 Lưu lưu.
  2. Bên cạnh Code.gs, 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 cùng xem mã truy vấn BigQuery và ghi kết quả vào Google Trang tính. Bạn có thể xem tệp 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 xem xét các tác phẩm của Shakespeare, một phần trong 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ự mức độ phổ biến giảm dần. Bạn sẽ hiểu được mức độ hữu ích của BigQuery khi hình dung việc tổng hợp video theo cách thủ công sẽ tốn nhiều công sức đến mức nào.

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 dùng để ngăn ứng dụng tiếp tục chạy khi 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. Quay lại trình chỉnh sửa App Script, tìm biến PROJECT_ID trong bq-sheets-slides.js rồi thêm giá trị này.
  4. Nhấp vào biểu tượng 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 hành động của tập lệnh theo thời gian thực.
  1. Sau khi nhật ký thực thi có nội dung "Execution đã hoàn tất", hãy truy cập vào Google Drive (drive.google.com) rồi tìm Google Trang tính có tên "Các từ phổ biến nhất trong mọi 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 biến đó):
  2. Mở bảng tính để xem 10 từ phổ biến nhất và tổng số của những từ này được sắp xếp theo thứ tự giảm dần:

afe500ad43f8cdf8.png

Thông tin tóm tắt về Nhiệm vụ 1

Để xem lại, bạn đã chạy một số mã truy vấn tất cả các tác phẩm của Shakespeare để xem xét mọi từ trong mỗi vở kịch. Google đếm các từ và sắp xếp chúng theo thứ tự xuất hiện giảm dần. Bạn cũng sử dụng dịch vụ Apps Script tích hợp trong 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 đã sử dụng cho bq-sheets-slides.js trong thư mục step1 thuộc kho lưu trữ GitHub của lớp học lập trình này tại github.com/googlecodelabs/bigquery-sheets-slides. Mã này lấy cảm hứng từ ví dụ ban đầu trên trang Dịch vụ nâng cao của BigQuery. Mã này đã chạy một truy vấn hơi khác một chút để truy xuất những từ phổ biến nhất có 10 ký tự trở lên mà Shakespeare sử dụng. Bạn cũng có thể xem một ví dụ trong kho lưu trữ GitHub.

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

Bạn cũng có thể chạy truy vấn bằng trang BigQuery trên Cloud Console trước khi chạy truy vấn trong Apps Script. Để tìm trang 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ụ: dưới đâ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. Nhiệm vụ 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 Google Trang tính. Tiếp theo, chúng ta cần tạo biểu đồ sử dụng dữ liệu. Hãy tạo một hàm mới có tên là createColumnChart() để gọi Trang tính newChart().

  1. Trong trình chỉnh sửa 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 tạo một biểu đồ cột có tất cả dữ liệu. Dải ô dữ liệu bắt đầu tại ô A2 do 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() yêu cầu tham số đối tượng trong bảng tính, vì vậy, chúng ta cần cập nhật runQuery() để trả về đối tượng spreadsheet mà chúng ta có thể truyền đến createColumnChart(). Ở cuối runQuery(), trả về đối tượng spreadsheet sau khi ghi nhật ký việc tạo trang tính 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(). Phương pháp hay nhất là tách biệt chức năng tạo biểu đồ và BigQuery theo cách hợp lý:
/**
 * 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 thông tin. Để 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 ở trên (ngoại trừ PROJECT_ID), giờ đây bq-sheets-slides.js của bạn sẽ có dạng như sau. Bạn cũng có thể tìm thấy 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 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 đồ được đưa vào trang tính bên cạnh dữ liệu:

Trang tính có biểu đồ

6. Nhiệm vụ 3: Đưa dữ liệu kết quả vào một trang trình bày

Phần cuối cùng của lớp học lập trình sẽ là 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 trang trình bày cho các ô dữ liệu và biểu đồ.

  1. Trong trình chỉnh sửa Apps Script, hãy thêm hàm createSlidePresentation() vào bq-sheets-slides.js sau createColumnChart(). Mọi công việc trên bản trình bày đều diễn ra trong hàm này. Hãy bắt đầu từ việc tạo một bản trình bày, sau đó thêm tiêu đề và phụ đề vào trang trình bày có 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 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 thay đổi tương tự đối với createColumnChart() để trả về một đối tượng biểu đồ (EmbeddedChart). Quay lại createColumnChart() và 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 chuyển cả bảng tính và biến biểu đồ vào createSlidePresentation(). Đồng thời, vì chúng ta ghi nhật ký URL của bảng tính mới tạo, nên chúng ta cũng sẽ ghi lại URL của bản trình bày mới. Cập nhật createBigQueryPresentation() thành giao diện 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 nhóm quyền nữa từ người dùng để xem và quản lý các bản trình bày trên Google Trang trình bày. Sau khi bạn xem xét và cấp các quyền này, quy trình sẽ chạy như trước đây.
  2. Bây giờ, ngoài bảng tính được tạo, bạn cũng sẽ có một bản trình bày mới trên Trang trình bày với 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.pngS

5549f0ea81514360.pngS

7. Kết luận

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

Các bước này là những bước bạn đã thực hiện về mặt kỹ thuật. Nói chung, bạn đã đi từ việc phân tích dữ liệu lớn thành 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 điều chỉnh mẫu này cho 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ể cải thiện hơn nữa ứng dụng mẫu này.

Với những thay đổi từ tác vụ cuối cùng (ngoại trừ PROJECT_ID), giờ đây bq-sheets-slides.js của bạn 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 kỹ 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 truy cập lập trình vào các công cụ dành cho nhà phát triển của Google.

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

Tài liệu

Video

Tin tức và các bản cập nhật

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 lập trình

Dưới đây là một số cách giúp bạn cải thiện hoặc tăng cường mẫu mà chúng tôi đã xây dựng trong lớp học lập trình này. Đây chưa phải là danh sách đầy đủ nhưng sẽ cung cấp một số ý tưởng truyền cảm hứng để bạn có thể thực hiện bước tiếp theo.

  • Ứng dụng—Bạn không muốn bị giới hạn sử dụng JavaScript hay các hạn chế do Apps Script áp đặt? Chuyển ứng dụng này sang ngôn ngữ lập trình bạn yêu thích (sử dụng 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 Apps Script ban đầu.
  • BigQuery – Thử nghiệm với một số tập dữ liệu công khai khác của BigQuery để tìm ra 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 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. Bạn có thể tìm thấy các tệp này trên trang web nàykho lưu trữ GitHub này.
  • Trang tính—Thử nghiệm với 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. 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 đã 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 bản phân tích dữ liệu lớn. Sau đây là tài liệu tham khảo về dịch vụ tích hợp sẵn 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 dịch vụ tích hợp sẵn của Google trong 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 chuyển đến phần tổng quan về tài liệu tham khảo cho cả dịch vụ tích hợp sẵn và dịch vụ nâng cao.