[Node.js] googleapis 사용한 Googel Spread Sheet 연동[Node.js] googleapis 사용한 Googel Spread Sheet 연동

Posted at 2020. 8. 26. 14:41 | Posted in Node.js/Google Spread Sheet
반응형




API : https://developers.google.com/sheets/api/reference/rest

참고 : https://www.youtube.com/watch?v=MiPpQzW_ya0










 $ npm install googleapis@59.0.0      // 해당 포스팅은 59.0.0 버전을 사용함








■ 구글 시트 데이터 읽어오고, 출력하기





# 원본데이터 - 구글시트






# 소스코드

 google_sheet_select.js

const {google} = require( "googleapis" );

const keys = require( "./사용자_계정_KEY.json" );


const client = new google.auth.JWT(

      keys.client_email

    , null

    , keys.private_key

    , [ 'https://www.googleapis.com/auth/spreadsheets' ]  // 사용자 시트 및 해당 속성에 대한 읽기/쓰기 액세스 허용

);


client.authorize( function( err, tokens ) {


    if( err ) {

        console.log( err );

        return;

    } else {

        gsrunclient );

    }

});


async function gsrun( client ) {


    const sheetsgoogle.sheets( { version : "v4", auth : client } );


    const request = {

          spreadsheetId : "구글_시트_아이디"

        , range : "시트_이름!A2:D10"

        // , range : "twice"    // 범위를 지정하지 않으면 해당 Sheet의 모든 Shell 값을 가져온다.

    };


    const response = ( await sheets.spreadsheets.values.get( request ) ).data;

    console.log( response );

}






# 출력결과











■ 구글 시트 데이터 읽고, 데이터 가공하기





# 원본데이터 - 구글시트






# 소스코드 

 google_sheet_processing.js

const {google} = require( "googleapis" );

const keys = require( "./사용자_계정_KEY.json" );


const client = new google.auth.JWT(

      keys.client_email

    , null

    , keys.private_key

    , [ 'https://www.googleapis.com/auth/spreadsheets' ]  // 사용자 시트 및 해당 속성에 대한 읽기/쓰기 액세스 허용

);


client.authorize( function( err, tokens ) {


    if( err ) {

        console.log( err );

        return;

    } else {

        gsrunclient );

    }

});


async function gsrun( client ) {


    const sheets = google.sheets( { version : "v4", auth : client } );


    const request = {

          spreadsheetId : "구글_시트_아이디"

        , range : "시트_이름!A2:F7"

    };


    const response = ( await sheets.spreadsheets.values.get( request ) ).data;

    const responseArray = response.values;


    // console.log( responseArray );


    // @see LAST NAME과 FIRST NAME을 합친다

    let realNames = new Array();

    responseArray.map( function( val ) {

        realNames.push( val[2] + " " + val[3] );

        return realNames;

    });


    console.log( realNames );

}












■ 구글 시트 데이터 입력하기




# 소스코드

 google_sheet_appends.js

const {google} = require( "googleapis" );

const keys = require( "./사용자_계정_KEY.json" );


const client = new google.auth.JWT(

      keys.client_email

    , null

    , keys.private_key

    , [ 'https://www.googleapis.com/auth/spreadsheets' ]  // 사용자 시트 및 해당 속성에 대한 읽기/쓰기 액세스 허용

);


client.authorize( function( err, tokens ) {


    if( err ) {

        console.log( err );

        return;

    } else {

        gsrunclient );

    }

});


async function gsrun( client ) {


    const sheets = google.sheets( { version : "v4", auth : client } );


    let memberArray = new Array();

    memberArray[0] = new Array( "1", "윤채경", "1996-07-07", "서브보컬" );

    memberArray[1] = new Array( "2", "김채원", "1997-11-08", "메인보컬" );

    memberArray[2] = new Array( "3", "이나은", "1999-05-05", "센터, 서브보컬" );

    memberArray[3] = new Array( "4", "양예나", "2000-05-22", "메인댄서, 리드래퍼, 서브보컬" );

    memberArray[4] = new Array( "5", "레이첼", "2000-08-28", "메인댄서, 리드댄서, 서브보컬" );

    memberArray[5] = new Array( "6", "이진솔", "2001-12-04", "리드보컬, 막내" );


    const request = {

          spreadsheetId : "구글_시트_아이디"

        , range : "시트_이름"

        , valueInputOption : "USER_ENTERED"

        , insertDataOption : "OVERWRITE"    // OVERWRITE or INSERT_ROWS 선택

        , resource : { values : memberArray }

    };


    const response = await sheets.spreadsheets.values.append( request );

    console.log( response );

}




# valueINputOption 설정

설정값

설명

 INPUT_VALUE_OPTION_UNSPECIFIED

 · 기본 입력 값, 이 값은 사용해서는 안 된다.

 RAW

 · 사용자가 입력한 값은 구문 분석되지 않고 그대로 저장된다.

 USER_ENTERED

 · 사용자가 UI에 입력한 것처럼 값을 구문 분석한다.

 · 숫자는 숫자로 유지되지만 문자열은 구글 시트 UI를 통해 셀에 텍스트를 입력할 때

  적용되는 것과 동일한 규칙에 따라 숫자, 날짜 등으로 변환될 수 있다.




# insertDataOption 설정

설정값

설명

 OVERWRITE

 입력되는 데이터값은, 작성된 영역의 셀서식을 그대로 따른다.

 INSERT_ROWS

 입력되는 데이터값은, 입력이 시작될 행의 바로 위에 위치한 행의 셀서식을 그대로 따른다.





# 출력결과 - 구글시트

 $ node google_sheet_appends.js










■ 구글 시트 데이터 수정하기





# 소스코드

 google_sheet_update.js

const {google} = require( "googleapis" );

const keys = require( "./사용자_계정_KEY.json" );


const client = new google.auth.JWT(

      keys.client_email

    , null

    , keys.private_key

    , [ 'https://www.googleapis.com/auth/spreadsheets' ]  // 사용자 시트 및 해당 속성에 대한 읽기/쓰기 액세스 허용

);


client.authorize( function( err, tokens ) {


    if( err ) {

        console.log( err );

        return;

    } else {

        gsrunclient );

    }

});


async function gsrun( client ) {


    const sheets = google.sheets( { version : "v4", auth : client } );


    let memberArray = new Array();

    memberArray[0] = new Array( "1", "쥬리", "1997-10-06", "서브보컬" );

    memberArray[1] = new Array( "2", "연희", "2000-12-06", "리더, 리드보컬" );

    memberArray[2] = new Array( "3", "수윤", "2001-03-17", "메인보컬" );

    memberArray[3] = new Array( "4", "윤경", "2001-11-01", "메인댄서, 서브보컬" );

    memberArray[4] = new Array( "5", "소희", "2003-08-14", "서브보컬" );

    memberArray[5] = new Array( "6", "다현", "2005-04-29", "서브보컬" );


    const request = {

          spreadsheetId : "구글_시트_아이디"

        , range : "시트_이름!A2"  // 범위를 지정해 주지 않으면 A1 행부터 데이터를 덮어 씌운다.

        , valueInputOption : "USER_ENTERED"

        , resource : { values : memberArray }

    };


    const response = await sheets.spreadsheets.values.update( request );

    console.log( response );

}





# 출력결과 - 구글시트


 $ node google_sheet_update.js












■ 구글 시트 데이터 복사, 붙여넣기






# 소스코드

 google_sheet_copy.js

const {google} = require( "googleapis" );

const keys = require( "./사용자_계정_KEY.json" );


const client = new google.auth.JWT(

      keys.client_email

    , null

    , keys.private_key

    , [ 'https://www.googleapis.com/auth/spreadsheets' ]  // 사용자 시트 및 해당 속성에 대한 읽기/쓰기 액세스 허용

);


client.authorize( function( err, tokens ) {


    if( err ) {

        console.log( err );

        return;

    } else {

        gsrunclient );

    }

});


async function gsrun( client ) {


    const sheets = google.sheets( { version : "v4", auth : client } );


    const selectRequest = {

          spreadsheetId : "구글_시트_아이디"

        , range : "복사할_시트_이름!A2:A6"

    };


    const selectResponse = ( await sheets.spreadsheets.values.get( selectRequest ) ).data;

    const responseArray = selectResponse.values;


    const updateRequest = {

          spreadsheetId : "구글_시트_아이디"

        , range : "붙여넣기할_시트_이름!D2"

        , valueInputOption : "USER_ENTERED"

        , resource : { values : responseArray }

    };


    const response = await sheets.spreadsheets.values.append( updateRequest );

    console.log( response );

}





# 출력결과 - 구글시트


 $ node google_sheet_copy.js














반응형
//

[Node.js] Google Spread Sheet 수정 및 삭제하기[Node.js] Google Spread Sheet 수정 및 삭제하기

Posted at 2019. 6. 11. 19:27 | Posted in Node.js/Google Spread Sheet
반응형





※ 해당 포스팅 google-spreadsheet 2.0.7 버전을 기준으로 작성되었습니다.

    google-spreadsheet 3 버전 이후버전부터는 실행에 앞서 에러가 발생합니다.

    추후 수정 예정이오니 해당 포스팅을 참고하시는 분은 이점을 꼭 기억해 주시기 바랍니다.

    ( google-spreadsheet 2.0.7 버전의 경우 2020-05-15일 기준으로 사용에 문제는 없습니다. )





■ 구글 스프레드 시트의 데이터 수정하기




그동안의 데이터에서 내용을 읽어오거나, 입력하는것을 해보았다면


이제 마무리 단계로 수정을 진행해 보려고 한다.


아래와 같이 스프레드 시트를 만들고 그 데이터를 변경해 보자.




# 스프레드 시트





위 스프레드 시트에서는 D2, D4의 영역에 DASONI 라고 적힌 부분이 있다.


이 부분을 한글 DASONI로 변경하려 한다.



# 소스 코드

 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

doc.getCells(

  1

, {

  "max-row" : 6 // Cell의 최대 열(row)의 갯수( 필수 )

, "max-col" : 5      // Cell의 최대 행(column)의 갯수( 필수 )

, "return-empty" : true

}

, function(err, cells) {

                        // 해당 셀(Cell)을 지정한뒤, 변경사항을 수정하고 저장한다.

                        // 셀(Cell)을 수정하면 바로 저장을 해주어야 한다.


cells[8].value = "다소니";          // 해당 셀(Cell)의 값을 변경한다.

cells[8].save();                        // 해당 셀(Cell)의 변경사항을 저장한다.

cells[18].value = "다소니";         // 해당 셀(Cell)의 값을 변경한다.

cells[18].save();                       // 해당 셀(Cell)의 변경사항을 저장한다.

}

);

});




수정할 clees[8], clees[18]은 전체 셀(Cell)에서 몇번째 셀인지를 나타낸다.


꼭 값을 넣고 save( )를 해주어야 한다.



# 출력 결과




위와같이 영문명 DASONI에서 한글명 다소니로 변경된 것을 확인 할 수 있다.







■ 데이터 한번에 수정하기




이번에는 수정할 영역을 찾아서 검색하는 것을 만들려고 한다.




# 스프레드 시트





# 소스 코드

 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {


doc.getCells(

  1

, {

  "max-row" : 8

, "max-col" : 4

, "return-empty" : true


}

, function(err, cells) {

let black = new Array("김재경", "고우리", "오승아", "조현영");

for(var num = 0; cells.length > num; num++) {

if(black.indexOf(cells[num].value) >= 0) {

var unit = num + 3;      // 해당 셀에서 3칸 옆의 셀을 선택

cells[unit].value = "★";

cells[unit].save();

}

}

}

);

});




# 출력 결과









■ 구글 스프레드 시트의 데이터 삭제하기





# 스프레드 시




# 소스 코

 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {


doc.getCells(

  1

, {

  "min-row" : 2     // min-row를 2로 지정하여 필터 키값부분은 제외한 셀값을 가져온다.

, "max-row" : 11

, "max-col" : 1

, "return-empty" : true


}

, function(err, cells) {

let computer = new Array("APPLE", "LG", "HUAWEI", "HEWLETT PACKARD");

for(var num = 0; cells.length > num; num++) {

if(computer.indexOf(cells[num].value) >= 0) {

// console.log(cells[num].value);

cells[num].del();

}

}

}

);

});





# 출력 결과










※ 참고 - getRow( )를 이용하여 수정 및 삭제를 하려 한경우




필자는 아래 코드처럼 getCell이 아닌 getRow를 이용한 방법이 되지 않을까 싶어 테스트 해보았지만


결과는 에러만 날뿐이었다.


아무래도 getRow를 이용한 방법은 되지 않는것 같으니 참고 바란다.



 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

doc.getRows(

  1

, {

  "offset" : 1

, "limit" : 7

}

, function(err, rows) {

// console.log(rows);

let black = new Array("김재경", "고우리", "오승아", "조현영");

for(var num = 0; rows.length > num; num++) {

if(black.indexOf(rows[num].이름) >= 0) {

console.log(rows[num].이름);

rows[num].블랙 = "★";

rows[num].블랙.save();

}

}

}

);

});










반응형
//

[Node.js] Google Spread Sheet에 데이터 입력하기[Node.js] Google Spread Sheet에 데이터 입력하기

Posted at 2019. 6. 11. 17:51 | Posted in Node.js/Google Spread Sheet
반응형






※ 해당 포스팅 google-spreadsheet 2.0.7 버전을 기준으로 작성되었습니다.

    google-spreadsheet 3 버전 이후버전부터는 실행에 앞서 에러가 발생합니다.

    추후 수정 예정이오니 해당 포스팅을 참고하시는 분은 이점을 꼭 기억해 주시기 바랍니다.

    ( google-spreadsheet 2.0.7 버전의 경우 2020-05-15일 기준으로 사용에 문제는 없습니다. )





■ 구글 스프레드 시트에 데이터 입력하기





google-spreadsheet 모듈을 사용해 데이터를 입력할 경우에는 


단순히 마구잡이로 데이터를 넣는 것이 아니라.


양식에 맞게 설정을 잡아 주어야 데이터의 입력이 가능하다.


아래와 같이 스프레드 시트에 필터 or (Key)로 사용할 값을 1열에 작성하여 준다.




# 스프레드 시트






위와같이 스프레드 시트의 A1, B1열에 


필터로 쓰일 값을 생성해 두었다.


필자는 코드에 주석을 제외하고는 한글을 사용하는것을 별로 좋아하지는 않지만.


실제적으로 실무등에서는 한글로 된 키값이 많을 것이라 판단되고.


다행 google-spreadsheet 모듈을 한글을 키값으로 사용하는것에 아무런 문제가 있지는 않았다.


그럼 이제 아래 코드와 같이 작성하여 데이터를 입력해 보자.



# 소스 코드

 

const googleSpreadsheet =require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

let rowData = { 명칭 : "크루즈", 제조사 : "쉐보레" };

doc.addRow(

         1 // 첫번째 시트

rowData // 입력할 데이터

, function(err) { // 콜백 데이터

console.log(err);

}

);

});




필터의 키 명에 대응되는 값을 입력해 주고


실행해 보면 아래와 같이 필터 바로 아래 (Row)에


입력한 값이 들어가는 모습을 확인 할 수 있다.







위처럼 한 (Row)에 데이터를 삽입하는 것을 해보았다.


그렇지만 실제로 사용하게 된다면


반복문을 통해 한번에 많은 데이터를 입력하게 될것이고.


아래 그 내용을 간단히 정리해 두었다.









■ 한번에 여러개의 데이터 입력하기




# 소스 코드

 

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

let carDatas = new Array();

carDatas[0] = { 명칭 : "아반떼", 제조사 : "현대" }

carDatas[1] = { 명칭 : "K3", 제조사 : "기아" }

carDatas[2] = { 명칭 : "SM3", 제조사 : "르노삼성" }

carDatas[3] = { 명칭 : "골프", 제조사 : "폭스바겐" }

carDatas[4] = { 명칭 : "포커스", 제조사 : "포드" }

carDatas[5] = { 명칭 : "프리우스", 제조사 : "토요타" }

carDatas[6] = { 명칭 : "시빅", 제조사 : "혼다" }

for(let carType of carDatas) {


doc.addRow(

               1         // 첫번째 시트

carType // 입력할 데이터

, function(err) { // 콜백 데이터

console.log(err);

}

);

}

});





# 출력 결과




※ 소스 코드 배열의 차종과, 스프레드 시트의 차종 정렬이 다르다.

   이 부분은 어떻게 해야 하는지 확인 후 해당 포스팅 수정 예정이다.






반응형
//

[Node.js] Google Spread Sheet의 데이터 가져오기[Node.js] Google Spread Sheet의 데이터 가져오기

Posted at 2019. 6. 10. 18:07 | Posted in Node.js/Google Spread Sheet
반응형








※ 해당 포스팅 google-spreadsheet 2.0.7 버전을 기준으로 작성되었습니다.

    google-spreadsheet 3 버전 이후버전부터는 실행에 앞서 에러가 발생합니다.

    추후 수정 예정이오니 해당 포스팅을 참고하시는 분은 이점을 꼭 기억해 주시기 바랍니다.

    ( google-spreadsheet 2.0.7 버전의 경우 2020-05-15일 기준으로 사용에 문제는 없습니다. )





노드.js의 google-spreadsheet 모듈로 스프레드 시트의 데이터를 읽는 방법은.


크게 getRows( )와 getCells( ) 를 이용하는 방법이 존재한다.


개인적인 생각으로는 단순히 데이터를 읽어들이는것은 getRows( )가 편하지만


셀(Cell)을 수정하거나 삭제하는경우의 수는 getCells( )를 사용할 수 밖에 없기 때문에.


두 방법 모두 같이 사용하는 방법을 알아두는것이 좋다.










■ 열(Row)을 기준으로 구글 스프레드 시트의 데이터 읽어오기




# 스프레드 시트





# 소스 코드

 google_sheets_read_getrows.js

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

doc.getRows(

  1 // 시작할 시트의 인덱스(인덱스는 1부터 시작함)

, {

  "offset" : 1    // 시작할 행의 갯수

, "limit" : 5    // 한번에 읽을 최대 행의 갯수 ( 최상위 1번 열은 포함하지 않는다. )

               , "orderby" : "나이"          // 정렬 기준 최상위 1번 열(row)의 제목(Key값)을 기준으로 한다.

               , "reverse" : true             // true : 내림차순, false : 오름차순(기본값)


                          // 연산자를 통해 검색 기준을 생성한다.

         // 예) 제목(Key값) > 조건 and 제목(Key값) < 조건

               , "query" : "나이 >= 20 and 나이 < 30"

}

, function(err, rows) {

// console.log(rows);

for(var num = 0; rows.lengthnumnum++) {


console.log( rows[num].활동명 + " / " + rows[num].별명 );

}

}

);

});





# 출력 결과

 node google_sheets_read_getrows.js





위와같이 getRows( )를 통해서 데이터를 읽어오는 것을 해 보았다.


query 속성을 통해 검색 값에 제한을 줄 수 있다는 것이 매우 장점이지만.


아쉽게도 getRows( )를 통해서 가져온 (Cell)의 데이터를 수정할 수는 없다.


getRows( )는 조회용으로만 사용하는것을 추천한다.










■ 셀(Cell)을 기준으로 구글 스프레드 시트의 데이터 읽어오기





# 스프레드 시트






# 소스 코드

 google_sheets_read.js

const googleSpreadsheet = require("google-spreadsheet");

const creds = require("./서비스 계정 키.json");

const doc = new googleSpreadsheet("구글 스프레드 시트 ID");


doc.useServiceAccountAuth(creds, function(err) {

doc.getCells(

  1 // 시작할 시트의 인덱스(인덱스는 1부터 시작함)

, {

  // min-row와 min-col은 지정하지 않으면 기본값이 1로 지정되어

  // 첫번째(A1)셀부터 값을 읽어들인다. 

  "min-row" : 1 // Cell의 최소 가로 범위

, "min-col" : 1 // Cell의 최소 세로 범위

  // max-row와 max-col은 필수적으로 기입해 주는것이 좋다

  // return-empty 설정이 true인경우 무한루프에 빠질 수 있다.

, "max-row" : 3 // Cell의 최대 가로 범위(필수)

, "max-col" : 3      // Cell의 최대 세로 범위(필수)

  // return-empty이 false인 경우 빈 셀을 포함하지 않는다. 

  // true이면 빈 셀을 포함하기에 반드시 max-row, max-col을 설정해야 한다.

, "return-empty" : true

}

, function(err, cells) {


for(var num = 0; cells.lengthnumnum++) {


console.log( cells[num].value );

}

}

);

});





# 출력 결과

 node google_sheets_read.js




위와같이 getCells( )를 사용하는 방법을 알아보았다.


위에서 한번 설명했듯이 생성한 데이터의 수정을 위해서는 getCells( )를


사용할 수 밖에 없기 때문에, 사용방법을 꼭 숙지해 두는것이 좋다.





반응형
//