Lấy dữ liệu từ Google Sheet lên Google Form

  • File luyện tập
  • Mô tả ví dụ và Chuẩn bị
  • Xác thực dữ liệu cho cột C “Phê duyệt”
  • Code hoàn chỉnh
  • Giải thích
  • 1. Biến toàn cục
  • 2. Chương trình chính
  • Ứng dụng Liên kết Form – Sheet – Apps Script

Google Form và Google Sheet là 2 dịch vụ quá đỗi thân thuộc với người dùng. Nhưng còn liên kết chúng với Apps Script và ứng dụng trong thực tiễn như thế nào thì hôm nay HocGgSheet.com sẽ giới thiệu đến với các bạn.

File luyện tập

Tạo bản sao về Drive của bạn để xem và chỉnh sửa code nhé

https://docs.google.com/spreadsheets/d/1oUruazoQd4l5dQBy97-HpNCsxV2Rminy25yjpu4mnJw/edit?usp=sharing

Google Form:
https://goo.gl/forms/AV4rw3fhxqYjfWFF3

Mô tả ví dụ và Chuẩn bị

Lấy dữ liệu từ Google Sheet lên Google Form

Cho 1 form đơn giản như hình trên và liên kết với sheet “answer” trong file Google Sheet như sau (có sẵn một vài mẫu):

Lấy dữ liệu từ Google Sheet lên Google Form

Ở file Google Sheet, mình tạo thêm 1 sheet tên là “database”, 2 cột “Phê duyệt” và “Ngày chỉnh sửa”. Mục đích của chúng là:

  • Phê duyệt: Mỗi khi chọn “Duyệt” hoặc “Không duyệt” thì dòng đó sẽ được chuyển sang “database”. Ví dụ, chọn C6 là “Duyệt”, thì ta sẽ di chuyển dòng 6 sang “database”
  • Ngày chỉnh sửa: Mỗi khi chọn giá trị “Phê duyệt”, thời điểm bao gồm ngày và giờ hiện tại sẽ được cập nhật ghi ra vào ô cùng hàng trong cột D

Xác thực dữ liệu cho cột C “Phê duyệt”

Ta thấy “Phê duyệt” có 2 giá trị là “Duyệt” và “Không duyệt”. Vậy nên có thể xác thực dữ liệu cho nó

Lấy dữ liệu từ Google Sheet lên Google Form
Xác thực dữ liệu cho “Phê duyệt”

Các bạn lưu ý, chúng ta không cần Xác thực cho cả cột C. Mà chỉ cần Xác thực cho Những dòng hiện có và Dòng trắng tiếp theo. Ví dụ, mình có 9 dòng đầu là Những dòng hiện có, vậy thì chỉ cần Xác thực cho 9 dòng đó và dòng thứ 10. Mục đích là để khi có người gửi form mới, bản ghi mới sẽ tự động lấy định dạng (xác thực) của dòng trước

Code hoàn chỉnh

functiononEdit(){

   varss=SpreadsheetApp.getActiveSpreadsheet();

   varanswer= ss.getSheetByName('answer');

   vardbSheet=ss.getSheetByName('database');

   varactiveCell= ss.getActiveCell();

   if(activeCell.getColumn()==3&&(activeCell.getValue() =="Duyệt"||activeCell.getValue()=="Không duyệt")){

     varcurrentTime=new Date();

     activeCell.offset(0,1).setValue(currentTime);  

     varluu= answer.getRange(activeCell.getRow(),1,1,4).getValues();    

     dbSheet.getRange(dbSheet.getLastRow()+1,1,1,4).setValues(luu);

     answer.deleteRow(activeCell.getRow());

   }

}

Giải thích

1. Biến toàn cục

  • answer là sheet “answer”
  • dbsheet là sheet “database”
  • activeCell là ô chúng ta đang bấm vào

2. Chương trình chính

Sử dụng trigger onEdit() để khi thay đổi giá trị ở cột “Phê duyệt” thì sẽ tiến hành chạy chương trình

if(activeCell.getColumn()==3&&(activeCell.getValue()=="Duyệt"|| activeCell.getValue()=="Không duyệt")){

“Phê duyệt” nằm ở cột C, tức cột 3, và nếu nó bằng “Duyệt” hoặc “Không duyệt” thì sẽ lưu bản ghi vào trong database

varcurrentTime=newDate();

activeCell.offset(0,1).setValue(currentTime);

Đây là cách để lấy thời điểm hiện tại ra và ghi vào ô bên cột D. Hàm offset có chức năng dóng hàng dóng cột. Ở đây, nó dóng sang ô cùng hàng với activeCell bên cột D

3 câu lệnh cuối là kỹ thuật Di chuyển dòng từ sheet này sang sheet khác

varluu=answer.getRange(activeCell.getRow(),1,1,4).getValues();

Biến luu dùng để ghi giá trị của dải ô bao gồm các ô cùng hàng với activeCell

dbSheet.getRange(dbSheet.getLastRow()+1,1,1,4).setValues(luu);

Dòng này để ghi dải ô của biến luu vào Dòng cuối cùng tiếp theo trong sheet “database”

answer.deleteRow(activeCell.getRow());

Sau cùng là xóa dòng đã duyệt bên sheet “answer”

Các bạn có thể ứng dụng ví dụ trên vào các trường hợp sau:

  • Xử lí dữ liệu văn phòng
  • Tạo Cơ sở dữ liệu (Database)
  • Xét duyệt nội dung