# \[Series Email] Bài 3: Gửi Email Cho Danh Sách Nhập Vào Từ Google Sheet

Trong bài lần này, mình sẽ chia sẻ về cách **gửi email cho danh sách nhập vào từ Google Sheet**. Ngoài ra, có một số lưu ý khi các bạn muốn kết hợp trigger onEdit và onOpen với hàm sendEmail()

**File luyện tập (Tạo bản sao về Drive để sử dụng):**

<https://docs.google.com/spreadsheets/d/1sxxxA1MRgxoPeIdfs3QkN0IbtDYGNLmyYjeobQnkU9s/edit?usp=sharing>

### 1. Gửi email cho danh sách nhập từ Google Sheet

Cho file Google Sheet như sau

![Gửi Email bằng Google Sheet](https://i0.wp.com/hocggsheet.com/wp-content/uploads/2019/06/1.png?resize=553%2C199\&ssl=1)

Mục đích của chúng ta là gửi nội dung ở cột **Body** cho các email tương ứng ở cột **Email**. Bắt đầu nhé!

| 01234567 | function guiHet() {  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();  var lr = ss.getLastRow();  var email   = ss.getRange(2,1,lr-1).getValues();  var subject = ss.getRange(2,2,lr-1).getValues();  var body    = ss.getRange(2,3,lr-1).getValues();} |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

Sau khi mở Apps Script bằng cách vào phần Công cụ -> Trình chỉnh sửa tập lệnh. Ta tiến hành bước [khai báo biến](https://hocggsheet.com/khai-bao-bien-doc-ghi-o-dai-o-cell-range/). Sử dụng các biến **email**, **subject**, và **body** để lấy danh sách **email**, **chủ đề**, và phần **nội dung** ở các cột A, B, và C

Tiếp đến, sử dụng [vòng lặp for](https://hocggsheet.com/vong-lap-for-app-script/) để gửi email cho từng địa chỉ ở cột A. Kết quả cuối cùng sẽ được như đoạn code sau:

| 01234567891011 | function guiHet() {  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();  var lr = ss.getLastRow();  var email   = ss.getRange(2,1,lr-1).getValues();  var subject = ss.getRange(2,2,lr-1).getValues();  var body    = ss.getRange(2,3,lr-1).getValues();   for (var i = 0; i < email.length; i++) {    MailApp.sendEmail(email\[i], subject\[i], body\[i]);  }} |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### Một vài lưu ý nhỏ cho phần body

* Nếu muốn **xuống dòng** trong 1 ô của Google Sheet, bấm **Alt + Enter**
* Bạn có thể format cho ô trong Google Sheet, nhưng khi lấy dữ liệu từ ô đó để gửi email, thì các kiểu định dạng của bạn sẽ bị mất đi. Để xem cách gửi email có format, [mời các bạn xem bài 1](https://hocggsheet.com/gui-email-bang-app-script-co-ban/)

### 2. Gửi email kết hợp trigger onOpen – onEdit <a href="#mce_23" id="mce_23"></a>

Một câu hỏi khác mà chắc nhiều bạn đã nghĩ tới khi đọc bài này. Đó là làm thế nào để tự động gửi email khi thay đổi một giá trị bất kì trong Apps Script? Hay thực tế hơn, chúng ta đã biết Google Sheet có thể liên kết biểu mẫu với Google Form. Sẽ thế nào nếu mỗi lần có người gửi form thì ta tự động gửi email cho người đó?

![Gửi Email bằng Google Sheet và liên kết google form](https://i1.wp.com/hocggsheet.com/wp-content/uploads/2019/06/form3.jpg?resize=300%2C197\&ssl=1)Kết hợp gửi email với Google Form?

Theo tự nhiên thì có thể bạn sẽ nghĩ ngay đến 2 trigger cực kì thông dụng là [onOpen và onEdit](https://hocggsheet.com/gioi-thieu-trigger-app-script-onedit-onopen/). Tuy nhiên thì thực tế sẽ làm bạn thất vọng thôi. Một lần nữa các trigger giới hạn chúng ta không thể làm được những điều trên. Nguyên nhân là vì các trigger không thể kết hợp được với các function sử dụng thông tin (identity) của người dùng. Khi các bạn dùng hàm sendEmail để gửi email, các bạn đã để Apps Script sử dụng email của các bạn với tư cách người gửi để gửi đi email đó. Nói cách khác, email của bạn chính là thông tin người dùng. Các bạn có thể đọc thêm về [những thứ trigger giới hạn](https://developers.google.com/apps-script/guides/triggers/#restrictions)

#### Add-on

Vậy nên kết hợp Google Form – onOpen – sendEmail là chuyện không thể. Tuy nhiên “gửi email xác nhận khi có người vừa gửi form” thì có thể thực hiện được. Một trong các cách đỡ nhức đầu nhất là nhờ sự can thiệp của bên thứ 3 – add-on.

Với từ khóa “Email confirmation” bạn sẽ tìm được cả tá những add-on giúp bạn thực hiện điều trên.

![](https://i1.wp.com/hocggsheet.com/wp-content/uploads/2019/06/email.png?resize=696%2C88\&ssl=1)Add-on **Email Notifications for Forms** (max 20 email / ngày, trả phí để gửi nhiều hơn)![](https://i1.wp.com/hocggsheet.com/wp-content/uploads/2019/06/9.jpg?resize=696%2C49\&ssl=1)Add-on **Form Confirmation Emails** (sử dụng thủ thuật để gửi email không giới hạn)

Các bạn có thể tìm hiểu về 2 add-on **Email Notifications for Forms** và **Form Confirmation Emails** (tải về *miễn phí* trực tiếp trong phần add-on của Google form).


---

# 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/series-email-bai-3-gui-email-cho-danh-sach-nhap-vao-tu-google-sheet.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.
