Bài 10: Đọc Ghi Mảng (Array) App Script

https://hocggsheet.com/doc-ghi-mang-array-app-script/

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

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

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

function docGhiMang1() {
   var ss = SpreadsheetApp.getActive();
   var arr = ['a','b','c'];
  
   ss.getRange('A1:C1').setValues(arr);
 }

Lỗi khi đọc ghi mảng

Để 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

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

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

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

Dải ô A4:A6

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

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

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

Kết quả file log gồm mảng arr2 và dải ô A4:A6

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 ô

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

Dải ô A9:C11

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:

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ự

function docGhiMang3() {
   var ss = SpreadsheetApp.getActive();
 
   var arr = [['a','b','c'],['d','e','f'],['g','h','i']];
   ss.getRange('A9:C11').setValues(arr);
 }

Last updated

Navigation

Lionel

@Copyright 2023