Nội dung
Mảng (Array) là một trong những thành phần cơ bản và không thể thiếu của Java Script cũng như App Script. Để sử dụng mảng thành thạo, bạn sẽ cần nắm chắc kiến thức cơ bản. Trong bài này, hocggsheet.com sẽ giới thiệu đến với các bạn cách Đọc Ghi Mảng từ App Script ra Google Sheet.
Vài điều cần nắm rõ
- Đọc ghi mảng từ App Script ra Google Sheet khác với ghi dải ô ra dải ô trong Google Sheet vì nó yêu cầu khắt khe hơn
- Hàm getValues() và setValues() luôn trả về kết quả dưới dạng Mảng 2 chiều
- Tùy dải ô có kích thước hàng cột như thế nào mà ta sử dụng các mảng tương ứng
File luyện tập cho phần Đọc Ghi Mảng
Các bạn Tạo bản sao (Make a copy) về Drive file bên dưới để tiến hành luyện tập nhé
https://docs.google.com/spreadsheets/d/1A87WquX2EqGaRy4hIAszP9ztofLovS7fbN_l9-9t8Is/edit?usp=sharing
1. Dải ô có 1 hàng – nhiều cột

Cho dải ô A1:C1 như hình, dải ô này có kích thước là 1 hàng và 3 cột. Mục tiêu của chúng ta hiện giờ là ghi mảng arr có 3 phần từ a, b, c vào dải ô trên
0 1 | var arr = ['a','b','c']; |
Tuy nhiên, nếu chỉ đơn thuần là dùng setValues() thì chắc chắn sẽ xảy ra lỗi
0 1 2 3 4 5 6 | function docGhiMang1() { var ss = SpreadsheetApp.getActive(); var arr = ['a','b','c']; ss.getRange('A1:C1').setValues(arr); } |

Để giải quyết vấn đề này, trước tiên chúng ta cần biết định dạng của mảng arr và dải ô A1:C1 là gì. Ở đây mình sẽ dùng getValues() để ghi 2 cái này vào file log
0 1 2 3 4 5 6 7 8 | function docGhiMang1() { var ss = SpreadsheetApp.getActive(); var arr = ['a','b','c']; var range = ss.getRange('A1:C1').getValues(); Logger.log(arr); Logger.log(range); } |

Như các bạn đã thấy, mảng arr định dạng là Mảng 1 chiều, được bao bọc bởi 1 cặp dấu ngoặc vuông ở đầu và cuối. Còn dải ô A1:C1 là mảng 2 chiều, gồm có 1 phần tử mẹ và bên trong nó có 3 phần tử con.
Câu hỏi đặt ra là: làm thế nào để chuyển từ mảng 1 chiều về mảng 2 chiều có 1 phần tử mẹ và nhiều phần tử con
Rất đơn giản thôi, bạn chỉ cần thêm 1 cặp dấu ngoặc vuông ở trước và sau mảng arr
0 1 2 3 4 5 6 7 8 | function docGhiMang1() { var ss = SpreadsheetApp.getActive(); var arr = ['a','b','c']; var range = ss.getRange('A1:C1').getValues(); Logger.log([arr]); //Thêm vào ở đây Logger.log(range); } |

Vậy là ta đã chuyển đổi thành công giữa mảng 1 chiều arr về định dạng của dải ô A1:C1. Bây giờ ta mới có thể dùng setValues() để ghi [arr] vào A1:C1
0 1 2 3 4 5 6 | function docGhiMang1() { var ss = SpreadsheetApp.getActive(); var arr = ['a','b','c']; ss.getRange('A1:C1').setValues([arr]); } |
2. Dải ô có 1 cột – nhiều hàng

Tiếp theo là dải ô A4:A6. Trước khi Đọc Ghi mảng, hãy cùng hocggsheet.com phân tích một chút nhé
A4:A6 là dải ô có 1 cột và 3 hàng. Định dạng của nó sẽ rất khác so với dải ô A1:C1 ở trên. Trước tiên, hãy thử ghi mảng arr gồm 3 kí tự a, b, c và A4:A6 ra file log
0 1 2 3 4 5 6 7 8 | function docGhiMang2() { var ss = SpreadsheetApp.getActive(); var arr = ['a','b','c']; var range = ss.getRange('A4:A6').getValues(); Logger.log(arr); Logger.log(range); } |

Như ở trên mình đã nói, mảng arr là mảng 1 chiều. Còn khi dùng getValues để lấy giá trị của dải ô A4:A6, thì ta lại được mảng 2 chiều. Bao gồm 3 phần tử mẹ (được bao bọc bởi [ ]), mỗi phần tử mẹ có 1 phần tử con
Vậy làm thế nào để chuyển đổi mảng 1 chiều thành mảng 2 chiều có nhiều phần tử mẹ, mỗi phần tử mẹ có 1 phần tử con?
Câu trả lời là dùng vòng lặp For kết hợp với hàm push() của Java script
0 1 2 3 4 5 6 7 8 9 10 11 12 | function docGhiMang2() { var ss = SpreadsheetApp.getActive(); var arr = ['a','b','c']; var arr2 = []; var range = ss.getRange('A4:A6').getValues(); for (var i = 0; i<3; i++) { arr2.push([arr[i]]); } Logger.log(arr2); Logger.log(range); } |
Chú thích
- arr2 là mảng đã chuyển đổi của mảng arr
- push() là hàm cho phép “đẩy” những phần tử trong ngoặc vào trong mảng đằng trước
- Bằng cách thêm dấu ngoặc vuông như thế này [arr[i]], ta đã biến mỗi phần tử của arr thành 1 mảng riêng. Tóm lại, “đẩy” mảng 1 chiều vào trong mảng 1 chiều khác, thì ta sẽ được mảng 2 chiều

Như vậy, mảng arr2 mới đã có định dạng giống với dải ô A4:A6 – mảng 2 chiều với 3 phần tử mẹ, mỗi mẹ có 1 con. Bây giờ thì ta có thể ghi arr2 vào dải ô
0 1 2 3 4 5 6 7 8 9 10 | function docGhiMang2() { var ss = SpreadsheetApp.getActive(); var arr = ['a','b','c']; var arr2 = []; for (var i = 0; i<3; i++) { arr2.push([arr[i]]); } ss.getRange('A4:A6').setValues(arr2); } |
3. Dải ô có nhiều hàng – nhiều cột

Ví dụ cuối cùng là dải ô A9:C11, gồm 3 hàng và 3 cột. Hãy cùng xem định dạng của dải ô này trong file log trước:
0 1 2 3 4 5 | function docGhiMang3() { var ss = SpreadsheetApp.getActive(); var range = ss.getRange('A9:C11').getValues(); Logger.log(range); } |

Ta thấy, dải ô A9:C11 là mảng 2 chiều có 3 phần tử mẹ (được bao bọc bởi [ ]). Mỗi phần tử mẹ có 3 phần tử con bên trong
Vì dải ô có đến 9 giá trị, nên nếu muốn ghi 1 mảng vào dải ô thì mảng đó phải có kích thước và định dạng tương tự
0 1 2 3 4 5 6 | function docGhiMang3() { var ss = SpreadsheetApp.getActive(); var arr = [['a','b','c'],['d','e','f'],['g','h','i']]; ss.getRange('A9:C11').setValues(arr); } |
Admin ơi, cho mình hỏi – bên mình làm y chang admin như khi mình chạy leejng Logger.log(arr); và Logger.log(arr2); – hiện thị màn hình không có dấu ngoặc vuông.
Ad giúp mình chỉnh như thế nào để khi nhật ký chạy hiện ngoặc vuông để mình biết đó làm mảng gì ạ.
You must log in to post a comment.