Sunday, July 27, 2014

Google Apps Script - những kinh nghiệm đầu tiên

Tôi biết về Google Apps Script được gần 6 tháng. Nhưng "biết" ở đây đúng nghĩa của từ "chỉ biết" mà thôi. Tuần trước tôi mới sử dụng nó.

Nó là cái gì? Là một sản phẩm của Google, muốn biết chi tiết thì đọc ở đây: https://developers.google.com/apps-script/

Giải thích ngắn gọn: Google đã có các sản phẩm như Google Docs, Spreadsheet, Calendar,... Giờ thì Google tạo ra Apps Script để có thể viết tương tác với các sản phẩm này một cách dễ dàng, hoặc thực hiện một hành vi tự động.



Ví dụ: Bạn có một file dữ liệu lớn trên Spreadsheet, bạn muốn nó tạo biểu đồ ngay khi bạn thêm dữ liệu vào đó. Còn nếu không thì mỗi lần thêm dữ liệu, bạn phải chọn chart hoặc pivot table các kiểu rồi chờ nó generate. Thêm một điểm lợi nữa là Apps Script cũng có thể gửi email đến sếp của bạn báo kết quả thay vì bạn phải export biểu đồ ra và gửi email.


Và sau đây là bài học tôi học được.

Bài toán: Tôi có một file gồm khoảng 30 sheet chứa dữ liệu, và tôi cần nó tổng hợp dữ liệu vào một sheet duy nhất để tôi có thể thấy tổng quát.

Theo bạn nghĩ tôi sẽ làm thế nào?

Phương án 1: Cứ viết script và chạy thôi. Tôi viết một script dài, công việc là đọc dữ liệu của từng sheet, tính toán và đưa và sheet Summary.

Quá đơn giản, và tôi hì hục viết. Xong. Chạy thử. Và chờ...

2 phút... Tôi đứng dậy lấy nước uống, rồi trở lại màn hình và... chờ...

Dữ liệu của tôi thật sự lớn, đến khoảng 300 row trong mỗi sheet, và có khoảng 30 sheet như vậy. Cuối cùng, nó cũng có phản hồi với tôi, và rằng "Exceeded maximum execution time".

Đọc thêm document, tôi biết rằng Apps Script bị giới hạn trong 5 phút xử lý. Phương án 1 bị bỏ.

Phương án 2: Theo hướng dẫn trên stackoverflow, tôi đưa trigger vào, và định khi xử lý 1 sheet xong thì đặt trigger để 1 phút sau chạy tiếp sheet tiếp theo, và cứ thế.

Viết xong, trông mọi thứ có vẻ hoàn hảo. Ngoại trừ việc nó có tạo trigger mà đến thời hạn thì trigger vẫn nằm sờ ra đó, không chịu chạy. Ặc ặc.

Lò dò mãi... tôi không tìm thấy cách nào cho nó chạy... Trước khi phát hiện ra trong document có ghi mà tôi không để ý rằng trigger có thể chạy trước hoặc sau thời gian ấn định 15 phút... Mình đang cần nó chạy ngay mà! Đâu có cần nó có khoảng delta thời gian thế!!! Dẹp. Không chơi với phương án 2 này nữa.

Phương án 3: Tôi để một link trên menu của Google Spreadsheet, để mình có thể chạy nhiều lần, mỗi lần xử lý cho 3 sheet, và khi nào chạy xong một lượt thì bấm lần nữa để chạy tiếp.

Phương án này cũng dễ làm, chỉ là mình đưa danh sách 30 sheet vào queue, và mỗi lần chạy là pop() trong queue ra từng sheet mà làm, khi nào nhắm sắp hết 5 phút thì ngừng lại, lưu trạng thái và để dành cho lần chạy kế.

Đây là một cheat khá hiệu quả mà tôi nghĩ ra, nó giúp cho tôi có thể xử lý hết 30 sheet mà không gặp trở ngại nào.

Điểm bất lợi duy nhất là... tôi không thấy nó tự động cho lắm, bởi tôi phải click, rồi chờ, rồi lại click, rồi lại chờ... Mệt mỏi luôn!

Phương án 4: Cố gắng cả buổi mới phát hiện ra Apps Script có hỗ trợ cái sidebar. Tôi quyết định đưa sidebar vào, và sidebar sẽ gọi lệnh lên server của Apps Script mà chạy cho từng sheet một.

Mô tả sơ bộ là khi khởi động sidebar, nó sẽ tạo cái queue các sheet cần chạy, và khi tôi bấm Run thì nó trình tự gọi lên server, hết sheet này đến sheet khác. Và đó là phương án cuối cùng của tôi, tôi cảm thấy hài lòng với phương án này.

Điểm yếu ư? Có 2 điểm yếu này:

Một là tôi phải để màn hình spreadsheet trên trình duyệt. Để nó có thể gọi liên tục lên server check trạng thái và để thực hiện sheet tiếp theo. Tuy nhiên, không hề gì cả, tôi có thể để nó chạy, và mở một tab khác để xem phim trong khi đợi. Tất nhiên, tôi code thêm một vài dòng để nó có thể resume khi tôi cần.

Hai là Google lâu lâu thì bị ngưng cấp phát resource để chạy, do cái sidebar gọi liên tục lên server Google nên nó... giận, không chạy nữa. Cách né cũng đơn giản là đợi một thời gian dài hơn trước khi gọi lên server, và đồng thời áp dụng cơ chế resume là có thể đảm bảo.

OK. Vài kinh nghiệm để share với bà con thôi. Cảm ơn mọi người.

------------

Edit 28/04/2015: Vì mình nhận một email của một bạn hỏi về hướng dẫn cách làm, nên mình bổ sung thêm cái này ở đây luôn.

Để bắt đầu, mình khuyên các bạn vào trang https://developers.google.com/apps-script/ và thử làm hết "5-minute quickstart" có sẵn, nó sẽ giúp các bạn hiểu hơn về Apps Script.

Mình cũng xin lướt qua những link mà các bạn có thể cần:

  • Bắt đầu với Google Sheets: https://developers.google.com/apps-script/guides/sheets
  • Thêm menu: https://developers.google.com/apps-script/guides/menus
  • Tạo sidebar: https://developers.google.com/apps-script/guides/dialogs. Bạn có thể làm được nhiều việc hơn tôi đã làm ở phương án 4 bằng cái này đó.
  • Trigger các sự kiện: https://developers.google.com/apps-script/guides/triggers/

4 comments:

  1. Biết thêm một thứ về google, thanks anh

    ReplyDelete
  2. Rất cảm ơn bài viết bổ ích của tác giả

    ReplyDelete
  3. bạn có thể chia sẽ làm thế nào sử dụng thuật toán and / or trong điều kiện for không ? tks

    ReplyDelete
    Replies
    1. mình đã tìm được 1 phương án khác, nhưng vẩn ko có cách dùng and/or trong script được.

      Delete

Biểu mẫu liên hệ

Name

Email *

Message *