ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [구글 앱스 스크립트 기본 4] 범위를 가져오는 getRange의 다양한 종류의 매개변수
    구글 시트&앱스스크립트&루커스튜디오/구글 앱스 스크립트 2023. 8. 2. 19:36

     

     

    [구글 앱스 스크립트 기본 4] 범위를 가져오는 getRange의 다양한 종류의 매개변수

     

     

    글의 순서 

    더보기

     

     

    getRange 메서드의 다양한 종류의 매개변수

    구글 앱스 스크립트 레퍼런스 중 클래스 Sheet 문서를 보게 되면 getRange라는 메서드는 하나인데 각각 다른 4가지 종류의 매개변수들을 받을 수 있다고 되어 있습니다. 이 글에서는 비슷하면서도 미묘하게 다른 4가지 종류의 매개변수들에 대해서 알아보고 각 타입의 매개변수들을 이용해 값을 가져오고 입력해 보도록 하겠습니다. 

     

    클래스 Sheet의 매개변수 getRange의 각각 다른 매개변수들.

     

     

    a1Notation 타입의 매개변수, getRange(a1Notation)

    네 가지의 타입의 매개변수 중 우리가 지난 두 글에서 살펴보았던 매개변수의 타입은 a1 Notation으로 원하는 셀을 직접 선택할 수 있는 두 종류의 notation 중 하나입니다. 이 a1 notation은 a1이라는 이름에서 볼 수 있듯, 열 이름 + 행 번호의 조합으로 셀을 직접 선택하는, 엑셀이나 구글 시트와 같은 스프레드시트 프로그램을 많이 다루신 분들이라면 아주 익숙한 형태를 가지고 있습니다. 한 개의 셀을 선택하는 경우는 A1, B2, Z99와 같이 열 이름 + 행 번호의 조합으로 선택할 수 있습니다. 두 개 이상의 셀을 선택하는 경우는 무조건 인접한 행이나 열을 포함하는 범위로만 지정할 수 있고 행과 열이 하나도 인접하지 않은 다른 범위를 함께 선택할 수는 없습니다. 따라서 a1 notation 방법으로 영역을 지정하게 되면 사각형 형태의 영역이 지정되게 되는데 이때 가장 왼쪽 위에 존재하는 셀의 열 이름 + 행 번호의 조합 + 콜론(:) + 가장 오른쪽 아래에 존재하는 셀의 열 이름 + 행 번호의 조합으로 영역을 지정할 수 있습니다. A1:B2나 A1:Z100 같은 경우가 이에 해당합니다. (셀을 직접 선택하는 다른 notation 타입은 R1C1 notation으로 R1C1 notation 또한  a1Notation타입 대신 사용할 수 있습니다만, 여기에서는 자세히 다루지 않도록 하겠습니다.) a1Notation타입의 예제는 3X2 크기를 가지는 테이블을 활용합니다. A1셀부터 B3셀까지, 셀에는 열 이름과 행 번호를 이용한 값을 집어넣었습니다.  해당 범위에서 가져온 값을 입력할 범위는 D1셀부터 E3셀까지로 같은 3X2 크기를 가지는 범위입니다. 

     

    예제에서 살펴볼 데이터와 범위 1

     

    function example1() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var range1 = sheet.getRange("A1:B3");
      var val = range1.getValues();
      var range2 = sheet.getRange("D1:E3");
    
      range2.setValues(val);
    }

     

    example1이라는 이름을 가지는, a1 Notation을 매개변수로 받는 getRange 메서드를 활용한 코드입니다. getRange의 매개변수로 각각 a1Notation 타입인 "A1:B3", "D1:E3"가 들어가 있는 것을 볼 수 있습니다. 해당 코드를 실행시키면 구글 시트 파일에는 아래 스크린샷과 같은 결과가 나옵니다. 

    example1 코드의 실행 결과

     

     

    row, column 타입의 매개변수, getRange(row, column)

    다음 타입의 매개변수는 행 번호와 열 번호를 매개변수로 받는 row, column 타입입니다. row, column 타입이라는 이름에서 알 수 있듯, 행 번호와 열 번호의 조합으로 원하는 셀을 지정하게 됩니다. 예를 들어 A1 셀은 각각 첫 번째 행과 첫번째 열이 교차하는 셀을 말하는 것이기에 1,1로 선택할 수 있습니다. 열 번호는 A가 1로 시작하며 다음으로 갈수록 1씩 더해지는 구조입니다. B의 열 번호는 2, C의 열 번호는 3이고 Z의 열 번호는 26, AA의 열 번호는 27이 됩니다. row, column 타입의 매개변수는 행 번호와 열 번호의 교차점을 목표지점으로 하기 때문에 한 개의 셀만 선택할 수 있다는 특징이 있습니다. row, column 타입의 매개변수를 활용해 A5 셀에 있는 정보를 D5에 입력하는 예제를 살펴보겠습니다. 

     

    예제에서 살펴볼 데이터와 범위 2

     

    function example2() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var range1 = sheet.getRange(5,1);
      var val = range1.getValue();
      var range2 = sheet.getRange(5,4);
    
      range2.setValue(val);
    }

     

    row, column 타입을 매개변수로 받는 getRange를 사용한 example2 코드는 위와 같습니다. 이때 주의해야 할 점이 두 가지 있습니다. 첫 번째로 행번호와 열번호는 문자열이 아닌 숫자로 입력이 되어야 하기 때문에 행번호와 열번호 앞뒤로 따옴표가 붙지 않습니다. 두 번째는  row, column 타입의 매개변수는 셀 하나만 선택할 수 있으므로 값을 가져오거나 값을 입력할 때 한 개의 정보만 가져오고 입력하는 getValue, setValue 메서드를 사용해야 한다는 점입니다. (여러 개의 정보를 가져오고 입력하는 getValues, setValues 메서드를 사용한다면 실행로그에 오류가 표시되게 되며 스크립트 실행이 중단되게 됩니다.) 해당 코드를 실행시키면 우리의 의도대로 A5에 있던 정보가 D5에 입력된 결과를 얻을 수 있습니다. 위의 코드에서 사용된 getRange(5,1)과 getRange(5,4)를 a1 Notation타입의 매개변수를 받는 getRange메서드로 바꿔보면 getRange("A5"), getRange("D5")가 됩니다. 

     

    example2 코드의 실행결과

     

     

    row, column, numRows 타입의 매개변수, getRange(row, column, numRows)

    다음 타입의 매개변수는 row, column, numRows 타입의 매개변수입니다. 이 타입의 매개변수는 바로 전에 알아보았던 row, column 타입에 numRows라는 매개변수가 하나 추가된 형태로 numRows 매개변수는 바로 선택할 열의 개수를 의미합니다. 다른 말로 풀어보면 지정된 행 번호와 열 번호가 교차하는 셀을 시작으로 해서 주어진 개수의 열만큼 범위를 지정하겠다는 말입니다. 이 타입의 매개변수로는 무조건 열이 하나인 범위만 지정할 수 있다는 특징이 있습니다. 한 개의 열을 선택하는 경우는 1, 열 개의 열을 선택하는 경우는 10, 50개의 열을 선택하는 경우는 50을 numRows자리에 넣어주면 됩니다. row, column, numRows 타입의 매개변수를 활용해 A7:A9 범위에 있는 정보를 가져와 D7:D9 범위에 입력해 보는 예제를 살펴보겠습니다. 

     

    예제에서 살펴볼 데이터와 범위 3

     

    function example3() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var range1 = sheet.getRange(7,1,3);
      var val = range1.getValues();
      var range2 = sheet.getRange(7,4,3);
    
      range2.setValues(val);
    }

     

    row, column, numRows 타입을 매개변수로 받는 getRange를 사용한 example3 코드는 위와 같습니다. row, column, numRows 타입의 매개변수는 numRows를 1로 지정하는 경우를 제외하고는 무조건 2개 이상의 셀을 선택하게 되므로 getValues와 setValues 메서드를 이용해 정보를 가져오고 넣어주어야 합니다. 위의 코드에서 getRange(7,1,3), getRange(7,4,3)을 가장 처음에 살펴보았던 a1 Notation 타입의 매개변수로 바꾸어보면 getRange("A7:A9")와 getRange("D7:D9")가 됩니다. 두 번째 예제에서 사용된 getRange(5,1)과 getRange(5,4)를 row, column, numRows 타입의 매개변수로 바꾸어보면 getRange(5,1,1)과 getRange(5,4,1)이 됩니다. 

     

    example3 코드의 실행결과

     

     

    row, column, numRows, numColumns 타입의 매개변수, getRange(row, column, numRows, numColumns)

    마지막 타입의 매개변수는 바로 위에서 살펴본 row, column, numRows 타입의 매개변수에 numColumns 매개변수가 더해진 형태입니다. numRows가 선택할 행의 개수였던 것처럼, numColumns는 선택할 열의 개수를 뜻합니다. a1 Notation타입의 매개변수를 제외하고 행과 열의 개수가 각각 2개 이상인 범위를 지정할 때 유일하게 사용할 수 있는 타입이 바로 이 row, column, numRows, numColumns 타입입니다. 만약 A1:B3 범위를 이 타입의 매개변수를 활용해 지정하려면 (1,1,2,3)으로, D2:E5 범위의 경우에는 (2,4,4,2)로 지정할 수 있습니다. row, column, numRows, numColumns 타입의 매개변수를 활용해 A11:B14범위에 있는 정보를 D11:E14범위에 넣어보는 예제를 살펴보겠습니다. 

     

    예제에서 살펴볼 데이터와 범위 4

     

    function example4() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var range1 = sheet.getRange(11,1,4,2);
      var val = range1.getValues();
      var range2 = sheet.getRange(11,4,4,2);
    
      range2.setValues(val)
    }

     

    row, column, numRows, numColumns 타입을 매개변수로 받는 getRange를 사용한 example4 코드는 위와 같습니다. 역시 여러 개의 셀에서 정보를 가져오고 입력하는 것이므로 getValues와 getValues 메서드를 사용하게 됩니다. example4 코드에서 사용된 getRange(11,1,3,2)와 getRange(11,4,4,2)를 a1 Notation타입으로 바꿔보면 getRange("A11:B14")와 getRange("D11, E14")가 되며 다른 타입의 매개변수로는 바꿀 수 없습니다. 

     

    example4 코드의 실행결과

     

     

    getRange는 왜 여러 가지 타입의 매개변수를 받을까?

    getRange가 다양한 종류의 매개변수를 받도록 설계된 이유를 추측하기 위해서는 구글 앱스 스크립트는 구글 시트와 같은 구글 워크스페이스의 앱들과 연동되어 사용될 목적으로 만들어졌다는 점을 고려해야 합니다. 구글 시트와 같은 스프레드시트 프로그램에서 우리와 같은 인간은 영역을 지정할 때는 A1이나 A1:B2와 같은 a1 notation 방식을 활용해 왔으며, 기본적으로 내장된 스프레드시트의 함수들을 이용하기 위해서도 이와 같은 a1 notation 방식을 활용해 왔습니다. 하지만 프로그래밍 영역에서 컴퓨터는 A나 B와 같은 문자열이 아닌 숫자들의 조합으로 동작되게 되며, 문자를 이용해 동작하게 만들 수는 있지만 문자를 활용하는 방식보다 숫자를 활용하는 방식을 이용할 때 훨씬 더 가볍고 빠르게 동작합니다. 이와 같이 인간이 프로그램을 이용하는 방식과 컴퓨터가 프로그램을 이용하는 방식의 차이로 인해 다양한 타입의 매개변수를 받을 수 있게 설계되지 않았을까 하고 저는 추측합니다. 그리고 이에 따라 구글 시트에서는 다른 notation방식인 R1C1 notation 방식도 지원하게 되었을겁니다. 이 R1C1 notation 타입에 대해서는 추후에 다른 글에서 다루어보도록 하겠습니다. 

    댓글

ⓒ 2018. Haedie's all rights reserved.