Cách lấy dữ liệu từ sheet này sang sheet khác trong Google Sheet

Đây là Bài 3 trong chuỗi serie Học Ứng dụng Google App Script vào Google Sheet. Trong bài này, mục tiêu chính của chúng ta là tìm hiểu cách Copy và Di chuyển dải ô từ sheet này sang sheet khác. Clip hướng dẫn:

Nội dung

  • Copy và Di chuyển dải ô trong 1 sheet
  • Copy và Di chuyển dải ô từ sheet này sang sheet khác
  • Xóa hàng, xóa cột
  • Tóm tắt các hàm lấy phân lớp Sheet

Tóm tắt

  • copyTo() copy dải ô đứng trước và paste vào vị trí dải ô trong ngoặc
  • moveTo() chuyển dải ô đước trước vào trị ví dải ô trong ngoặc
  • getSheetByName() đi đến sheet có tên trong ngoặc
  • deleteRow() xóa dòng có số thứ tự trong ngoặc
  • deleteColumn() xóa cột có số thứ tự trong ngoặc
  • deleteRows(rowPosition, howMany) xóa howMany dòng, bắt đầu từ dòng rowPosition
  • deleteColumns(columnPosition, howMany) xóa howMany cột, bắt đầu từ cột columnPosition

I. Copy và Di chuyển dải ô trong 1 sheet

Ở các bài trước thì mình đã giới thiệu các hàm getValue(), getValues(), setValue() và setValues(). Các hàm này được thiết lập nhằm mục đích chính là lấy giá trị và đặt giá trị. Chúng ta đã lợi dụng điều đó để copy và paste dải ô. Tuy nhiên thì các hàm trên không chuyên dùng để làm vậy. Thay vào đó chúng ta nên dùng hàm copyTo()moveTo().

Ở Bài 2: Các hàm lấy giá trị và đặt giá trị dải ô,mình có đoạn code cuối cùng như sau:

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var range = sheet.getRange("A1:D7"); var giatri1 = range.getValues(); var dich = sheet.getRange("F8:I14"); dich.setValues(giatri1); }

function myFunction() {

  var ss    = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getActiveSheet();

  var range = sheet.getRange("A1:D7");

  var giatri1 = range.getValues();  

  var dich = sheet.getRange("F8:I14");

  dich.setValues(giatri1);

}

Chức năng của nó là gán các giá trị của dải ô A1:D7 vào biến giatri1, sau đó đi đến dải ô F8:I14 để ghi các giá trị đó vào. Đây hoàn toàn giống với việc chúng ta đi copy và paste. App Script cung cấp 1 hàm chuyên dùng để làm điều này, đó là copyTo(). Bây giờ, mình không dùng đến các hàm getValues() và setValues() nữa, mình viết lại như sau:

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var range = sheet.getRange("A1:D7"); var dich = sheet.getRange("F8:I14"); range.copyTo(dich); }

function myFunction() {

  var ss    = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getActiveSheet();

  var range = sheet.getRange("A1:D7");

  var dich = sheet.getRange("F8:I14");

  range.copyTo(dich);

}

Câu lệnh range.copyTo(dich); thực hiện nhiệm vụ:

  1. Đi đến dải ô trong biến range -> dải A1:D7
  2. Copy các ô trong dải
  3. Đi đến dải ô F8:I14 để Paste (Dán) vào

copyTo() là hàm copy dải ô đứng trước và paste vào vị trí dải ô trong ngoặc

Lưu ý rằng, biến “range” và biến “dich” phải có cùng kích thước (7 hàng, 4 cột). Tương tự dải ô mà các bạn muốn copy phải cùng kích thước hàng cột với dải ô mà cách bạn paste vào.

Cách sử dụng hàm moveTo cũng tương tự như copyTo

moveTo() là hàm di chuyển dải ô đước trước vào trị ví dải ô trong ngoặc

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var range = sheet.getRange("A1:D7"); var dich = sheet.getRange("F8:I14"); range.moveTo(dich); }

function myFunction() {

  var ss    = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getActiveSheet();

  var range = sheet.getRange("A1:D7");

  var dich = sheet.getRange("F8:I14");

  range.moveTo(dich);

}

Tuy nhiên vì bản chất là “move” nên nó dữ liệu ở dải ô cũ cũng không còn. Xem hình:

Cách lấy dữ liệu từ sheet này sang sheet khác trong Google Sheet

II. Copy / Di chuyển dải ô từ sheet này sang sheet khác

Để copy hoặc di chuyển dải ô từ sheet này sang sheet khác thì bạn phải xác định sheet mà bạn muốn copy / move vào (sheet đích đến). Để phân biệt, mình sẽ đặt sheet0 là sheet mà chúng ta lấy dữ liệu, và sheet1 là sheet đích đến.

Mục tiêu: di chuyển dải ô A1:D7 ở sheet0 và paste sang dải ô F8:I14 ở sheet1

Để xác định sheet khác, chúng ta dùng hàm getSheetByName()

getSheetByName() là hàm đi đến sheet có tên trong ngoặc

Lưu ý tên phải để trong dấu ngoặc kép ” “

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet0 = ss.getActiveSheet(); var sheet1 = ss.getSheetByName("sheet1"); var range = sheet0.getRange("A1:D7"); var dich = sheet1.getRange("F8:I14"); range.moveTo(dich); }

function myFunction() {

  var ss    = SpreadsheetApp.getActiveSpreadsheet();

  var sheet0 = ss.getActiveSheet();

  var sheet1 = ss.getSheetByName("sheet1");

  var range = sheet0.getRange("A1:D7");

  var dich = sheet1.getRange("F8:I14");

  range.moveTo(dich);

}

Ở trên, mình đã thay biến sheet cũ thành sheet0 (để phân biệt với sheet1). Biến sheet1 sẽ đi đến sheet có tên là sheet1. Đồng thời biến dich lúc này sẽ là dải ô F8:I14 trong sheet1

Vì cách dùng của copyTo() và moveTo() là giống nhau nên mình chỉ minh họa moveTo() thôi, các bạn có thể tự thử với copyTo().

III. Xóa hàng, xóa cột bằng App Script

Để xóa 1 hàng hoặc 1 cột trong 1 sheet, các bạn sử dụng hàm deleteRow() hoặc deleteColumn()

deleteRow() thực hiện việc xóa dòng có số thứ tự trong ngoặc

deleteColumn() thực hiện việc xóa cột có số thứ tự trong ngoặc

Ví dụ (không liên quan đến đoạn code trên), mình muốn xóa hàng 2 và cột 2 trong sheet đang thao tác (sheet0), mình viết như sau:

function xoahangcot() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); sheet.deleteRow(2); sheet.deleteColumn(2); }

function xoahangcot() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var sheet = ss.getActiveSheet();

  sheet.deleteRow(2);

  sheet.deleteColumn(2);

}

Cách lấy dữ liệu từ sheet này sang sheet khác trong Google Sheet
Trước khi chạy đoạn code trên
Cách lấy dữ liệu từ sheet này sang sheet khác trong Google Sheet
Sau khi chạy đoạn code thực hiện xóa dòng 2 và cột 2

Để xóa nhiều hàng / nhiều cột trong 1 sheet, chúng ta sử dụng hàm deleteRows() hoặc deleteColumns()

deleteRows(rowPosition, howMany) thực hiện việc xóa howMany dòng, bắt đầu từ dòng rowPosition

deleteColumns(columnPosition, howMany) thực hiện việc xóa howMany cột, bắt đầu từ cột columnPosition

Quay lại đoạn code chính của chúng ta. Mình muốn làm 1 việc như sau:

Sau khi đã di chuyển dải ô A1:D7 từ sheet0 sang F8:I14 ở sheet1, khu vực A1:D7 sẽ bị trống không. Bây giờ chúng ta sẽ xóa đi những hàng trống và cột trống đó. Có tất cả 7 dòng và 5 cột trống. Chúng ta được đoạn code hoàn chỉnh như sau:

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet0 = ss.getActiveSheet(); var sheet1 = ss.getSheetByName("sheet1"); var range = sheet0.getRange("A1:D7"); var dich = sheet1.getRange("F8:I14"); range.moveTo(dich); sheet0.deleteRows(1, 7); //Xóa 7 dòng, bắt đầu từ dòng 1 sheet0.deleteColumns(1, 5); //Xóa 5 cột, bắt đầu từ cột A }

function myFunction() {

  var ss    = SpreadsheetApp.getActiveSpreadsheet();

  var sheet0 = ss.getActiveSheet();

  var sheet1 = ss.getSheetByName("sheet1");

  var range = sheet0.getRange("A1:D7");

  var dich = sheet1.getRange("F8:I14");

  range.moveTo(dich);

  sheet0.deleteRows(1, 7); //Xóa 7 dòng, bắt đầu từ dòng 1

  sheet0.deleteColumns(1, 5); //Xóa 5 cột, bắt đầu từ cột A

}

Vậy là mình chia sẻ xong phần xóa dòng / cột. Tiếp đến mình sẽ tóm tắt các hàm lấy sheet.

IV. Tóm tắt các hàm lấy phân lớp Sheet

Chúng ta đã biết hàm getActiveSheet() sẽ lấy sheet mà chúng ta đang thao tác trên Google Sheet và getSheetByName() lấy sheet có tên ở trong ngoặc. Ngoài ra để lấy sheet, chúng ta còn 1 hàm nữa, đó là getSheets().

Bạn có thể đọc thêm về hàm getSheets() tại đây:

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheets

Mình muốn chia sẻ 1 cách dùng của getSheets() để lấy sheet có số thứ tự trong bảng tính. Để giải thích bằng lời thì hơi khó, nên mình sẽ lấy ví dụ cho dễ hiểu. Ở đoạn code chính, mình đã dùng getActiveSheet() cho sheet0 và getSheetByName() cho sheet1. Bây giờ mình sẽ thay chúng bằng getSheets()

function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet0 = ss.getSheets()[0]; var sheet1 = ss.getSheets()[1]; var range = sheet0.getRange("A1:D7"); var dich = sheet1.getRange("F8:I14"); range.moveTo(dich); sheet0.deleteRows(1, 7); sheet0.deleteColumns(1, 5); }

function myFunction() {

  var ss    = SpreadsheetApp.getActiveSpreadsheet();

  var sheet0 = ss.getSheets()[0];

  var sheet1 = ss.getSheets()[1];

  var range = sheet0.getRange("A1:D7");

  var dich = sheet1.getRange("F8:I14");

  range.moveTo(dich);

  sheet0.deleteRows(1, 7);

  sheet0.deleteColumns(1, 5);

}

Bằng việc bỏ số thứ tự của sheet trong bảng tính vào trong [ ], mình đã có kết quả tương tự. Lưu ý: sheet đầu tiên sẽ có số thứ tự là 0, sheet thứ 2 có số thứ tự là 1,… Đó là do trong Java Script, mảng bắt đầu đếm từ 0. Cho nên khi gọi sheet0 mình đã dùng getSheets()[0], còn gọi sheet1 thì dùng getSheets()[1]

Cách lấy dữ liệu từ sheet này sang sheet khác trong Google Sheet
Trước khi chạy code. Bạn hãy chạy thử code để xem kết quả nhé ^^