# Bài 7: Giới thiệu các Trigger App Script – onEdit onOpen

onEdit() và onOpen() là hai trigger cơ bản và phổ biến nhất của App Script. Để sử dụng chúng, bạn chỉ đơn giản là đổi tên function của bạn thành onEdit hoặc onOpen. Ví dụ:

| 01 | function onEdit() {} |
| -- | -------------------- |

Để đọc thêm về các trigger, các bạn có thể truy cập vào link sau:

<https://developers.google.com/apps-script/guides/triggers/>

Trong bài này mình sẽ đưa ra các ví dụ cụ thể về việc ứng dụng chúng trong App Script Sheet. **Để xem file luyện tập, các bạn hãy kéo xuống dưới cùng** nhé. Còn đây là video hướng dẫn:

### 1. onEdit()

Một function có tên là onEdit sẽ: chạy chương trình khi người dùng (user) thay đổi một giá trị bất kì trong bảng tính Google Sheet

#### Ví dụ

Tiếp nối ví dụ của [bài 6: câu lệnh if](https://hocggsheet.com/cau-lenh-dieu-kien-if/) , lần này mình thực hiện yêu cầu sau:

Hình minh họa ví dụ onEdit

![](https://i0.wp.com/hocggsheet.com/wp-content/uploads/2019/01/1.jpg?resize=604%2C490\&ssl=1)

* Trên Google Sheet, mình thêm một cột bên trái cột A cũ trong bài 6. Cột này được Xác thực dữ liệu, chỉ nhận 2 giá trị “Duyệt” hoặc “Không duyệt”
* Khi chọn những lựa chọn ở cột A mới, ô chúng ta đang bấm vào được gọi là *Active cell*
* Khi chọn “Duyệt”, dải ô gồm các ô cùng hàng với *Active cell* sẽ được di chuyển sang sheet1 ngay lập tức
* Nếu chọn “Không duyệt” hoặc giá trị khác, thì để nguyên, không làm gì cả

#### Code hoàn chỉnh

```
function onEdit() {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet0 = ss.getSheetByName("sheet0");
   var sheet1 = ss.getSheetByName("sheet1");  
   var activeCell = ss.getActiveCell();
   var range = sheet0.getRange(activeCell.getRow(), activeCell.getColumn(), 1, sheet0.getLastColumn());
   var dich = sheet1.getRange(sheet1.getLastRow()+1, 1, 1);
   var activeCellValue = activeCell.getValue();
 
   if (activeCellValue == "Duyệt") {
     range.moveTo(dich);
     sheet0.deleteRow(activeCell.getRow());
   }
 }
```

#### Chú thích các biến

| **Biến**        | **Ý nghĩa**                                         |
| --------------- | --------------------------------------------------- |
| activeCell      | ô đang được kích hoạt ở Google Sheet                |
| activeCellValue | giá trị của activeCell                              |
| range           | lấy dải ô chứa các giá trị cùng hàng với activeCell |
| dich            | đích đến khi thực hiện Di chuyển hoặc Copy dòng     |

### 2. onOpen()

Một function có tên là onOpen sẽ: chạy chương trình khi user mở file Google Sheet, hoặc làm mới (refresh) file. Ngoài ra, nếu file Google Sheet được kết nối với Google Form (biểu mẫu) thì onOpen sẽ chạy code mỗi khi có người gửi form (new response)

#### Ví dụ

Để minh họa ví dụ onOpen, mình viết một đoạn code đơn giản có mục đích như sau:

Khi user Làm mới / Mở file Google Sheet, ô H1 trong sheet0 sẽ ghi số lượng dòng có dữ liệu hiện đang có trong sheet0

```
function onOpen() {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet0 = ss.getSheetByName("sheet0");
   var numRow = sheet0.getLastRow();
   
   sheet0.getRange('H1').setValue(numRow);
 }
```

#### Chú thích các biến

* numRow dùng để lưu lại số lượng dòng có dữ liệu hiện đang có trong sheet0

#### Code nâng cao – Nối chuỗi

Ví dụ nâng cao minh họa onOpen

![](https://i0.wp.com/hocggsheet.com/wp-content/uploads/2019/01/2.jpg?resize=696%2C363\&ssl=1)

Để cải tiến code của ví dụ onOpen, mình muốn ô H1 hiện lên thông báo: “Hiện có … dòng”, với … là biến numRow. Để nối chuỗi, ta dùng dấu cộng (+). Lưu ý nhớ để kí tự trống ở sau hoặc trước các chuỗi nối.

```
function onOpen() {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet0 = ss.getSheetByName("sheet0");
   var numRow = sheet0.getLastRow();
   
   sheet0.getRange('H1').setValue("Hiện có: " + numRow + " dòng");
 }
```

#### File luyện tại cho Bài 7

<https://docs.google.com/spreadsheets/d/1Xtibys_azXe7DcQsgYno6yYEbNZo6CALrPd5zsq3d2s/edit#gid=0>

Lưu ý: để xem, chỉnh sửa file và code, các bạn vui lòng chọn File (tệp) -> Make a copy (copy) để Copy file vào Google Drive của các bạn nhé.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://javascriptuse.gitbook.io/javascript/advanced/bai-7-gioi-thieu-cac-trigger-app-script-onedit-onopen.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
