[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( )를


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





반응형
//

[Node.js] Google Spread Sheet 연동하기[Node.js] Google Spread Sheet 연동하기

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




참고 : https://www.npmjs.com/package/googl-spreadsheet

API : https://github.com/theoephraim/node-google-spreadsheet





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

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

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

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





■ Node.js에서 google-spreadsheet 모듈 설치하기





제일 먼저 노드에서 구글 스프레드 시트를 제어할 수 있게 해주는


google-spreadsheet 모듈을 설치한다.


 $ npm install google-spreadsheet@2.0.7








■ Google Spread Sheet API 생성하기



01. 먼저 https://console.developers.google.com/에 접속 하여 상단 메뉴의 프로젝트 명을 클릭한다.

※ 필자는 기존에 생성해둔 프로젝트가 있기때문에 위와 같은 화면부터 시작되었다.





02. 팝업창이 뜨맨 새 프로젝트 버튼을 클릭하여 새로운 프로젝트를 생성한다.






03. 프로젝트의 이름을 생성해 준다.

 ① 먼저 프로젝트의 이름은 자동으로 생성된다, 그렇지만 직접 입력하여 수정이 가능하다.

 ② 만들기 버튼을 클릭하여 프로젝트를 생성한다.





04. 정상적으로 프로젝트가 생성되었다면 아래와 같은 프로젝트 선택 팝업창을 확인 할 수 있다.





05. 좌측의 라이브 러리를 클릭하여 구글 시트 라이브 러리를 생성해 보자.





06. 검색창에 Google Sheets API를 입력하면 구글 시트 라이브 러리를 찾아온다.

    구글 시트의 API를 선택한다.






07. 사용 설정을 누르면 구글 시트 API의 사용이 가능해 진다.





08. 이제 좌측 메뉴에서 사용자 인증 정보 를 클릭한다.





09. 해당 작업을 진행하기 위한 인증 KEY는 서비스 계정 키 이다.

 ① 사용자 인증 정보 만들기를 클릭한다.

 ② API 키, OAuth 클라이언트 ID, 서비스 계정 키의 3가지 항목 중에서 서비스 계정 키를 선택한다.





10. 이제 서비스 계정 키를 생성해야 한다.

 ① 서비스 계정의 이름과 아이디를 생성한다.

     서비스 계정 ID는 구글 시트와 노드.js와의 연동에 필요할 수 있으니 카피해 두자.

 ② 키 유형은 JSON 파일을 선택한다.

 ③ 생성버튼을 클릭한다.





11. 서비스 계정의 JSON 파일이 자동으로 생성된다.

     다운을 받아두도록 하자.





12. 그럼 아래와 같이 사용자 계정 키가 정상적으로 생성 되었다.
















■ 구글 스프레드 시트 문 생성하고 읽기, 쓰기 권한 부여하





01. 자신의 구글 드라이브(https://drive.google.com/drive/my-drive) 페이지에 접속하여 새로운 스프레드 시트문서를 생성해 보자.





02. 문서가 생성되면 우측의 공유 버튼을 클릭한다.







03. 해당 구글 스프레드 시트를 외부에서 사용하기 위한 권한을 설정해야 한다.

① 링크 공유를 통해 모든 사용자 혹은 링크를 알고있는 사용자의 접속을 허용한다.

② 다른 방법으로는 위에서 생성한 서비스 키의 메일 주소에 읽기 및 쓰기 권한을 주는 것이다.

 








04. 설정이 완료되면 해당 스프레드 시트의 URL에서 ID에 해당하는 내용을 복사해 둔다.





그럼 이제 Node.js와 Google Sheets의 연동에 필요한 사전 준비는 마무리 되었다.


이제 정상적으로 작동하는지를 한번 확인해 보자.









■ Node.js와 Google Spreadsheet 연동하기




모든 밑작업이 완료 되었다면 이제 노드.js와 스프레드 시트를 연동해 보자.


위 작업들에서 따로 보관해 두어야 한다고 했던 서비스 계정 키.json 파일과


작업을 진행할 구글 스프레드 시트의 아이 값이 사용된다.



# 소스 코

 google_sheets.js

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


// Google APIs 페이지에서 생성한 서비스 계정 키의 JSON 파일을 배치한다.

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


// 작업을 수행할 Google Spreadsheet 문서의 ID값

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


doc.useServiceAccountAuth(creds, function(err) {

doc.getInfo(function(err, info) {

                // 해당 시트의 정보가 info에 담겨있다.

// console.log(info);

console.log("구글 시트의 제목  : " + info.title);

console.log("구글 시트의 URL  : " + info.id);

                console.log("마지막으로 업데이트된 날짜 및 시간  : " + info.updated);

console.log("스프레드시트의 생성자 아이디  : " + info.author.name);

console.log("스프레드시트의 생성자 메일주소  : " + info.author.email);

});

});




# 출력 결과




이로서 노드.js와 구글 스프레드 시트의 연동이 성공적으로 되는 모습을 확인 할 수 있다.










반응형
//

[Puppeteer] 페이지 클릭 및 입력 이벤트[Puppeteer] 페이지 클릭 및 입력 이벤트

Posted at 2019. 5. 10. 18:31 | Posted in Node.js/Puppeteer
반응형





■ 페이지의 특정 영역 클릭 이벤트




퍼펫티어에서 클릭 이벤트는 해당 앨리먼트를 셀렉터 값을 설정하고 click( ) 메서드로 실행시키기만 하면 된다.



# 소스 코드

 tommorrow_weather.js

const puppeteer = require( "puppeteer" );


puppeteer.launch({

headless : false

}).then(async browser => {


const page = await browser.newPage();

await page.goto( "https://weather.naver.com/", { waitUntil : "networkidle2" } );


page.waitForNavigation( ), // 해당 페이지의 탐색이 완료되면 클릭 이벤트를 실행

page.click( "div.weather_info > div.w_map > ul.tab > li:nth-child(4) > a" ); // 클릭이벤트를 실행

});




# 출력 결과

 $ node tomorrow_weather.js 









■ 페이지의 특정 영역에 값 입력 하기




#01. input 박스에 값 입력하기



위 예제에서는 click( 앨리먼트 ) 를 지정하여 손쉽게 클릭 이벤트를 진행 할 수 있었다.


입력도 이와 마찬기자로 type( ) 메서드에 앨리먼트의 셀렉터 주소와 입력 값을 지정해 주는것으로 손쉽게 진행할 수 있다.




# 소스 코드

 twitter_login.js

const puppeteer = require( "puppeteer" );


puppeteer.launch({

headless : false

}).then(async browser => {


const page = await browser.newPage();

await page.goto("https://twitter.com/login?lang=ko", { waitUntil : "networkidle2" } );

// 트위터 아이디 값 입력

await page.type( "div.clearfix:nth-child(2) > input", "트위터 아이디" );

// 트위터 패스워드 패스워드 값 입력

await page.type( "div.clearfix:nth-child(3)> input", "트위터 패스워드" );

// 트위터 로그인 버튼 클릭

await page.click( "button.submit" );

});




# 출력 결과

 $ node twitter_login.js







#02. 키보드로 직접 입력하는것과 같은 이벤트


이전에 page.type(엘리먼트, 입력값)과 같은 형태로 input 타입에 값을 입력 할 수 있었다.


그렇지만 직접 키보드를 입력해야 하는 것과 같은 자연스러운 입력이 필요한 경우가 존재하기에 추가적으로 작업을 더 해보려고 한다.



# 소스 코드

 facebook_login.js

const puppeteer = require( "puppeteer" );


puppeteer.launch({

headless : false

}).then(async browser => {


const page = await browser.newPage();

await page.goto( "https://www.facebook.com/", { waitUntil : "networkidle2" } );

// 페이지가 전부 로드된 이후 작업 실행

await page.waitForNavigation( );

// 페이스북 이메일 입력 부분 클릭

await page.click( "input#email" );

// 페이스북 아이디를 키보드로 입력한다.

await page.keyboard.type( "페이스북 이메일 주소" );

// TAB 버튼을 클릭하여 바로 옆에있는 패스워드 입력 영역으로 커서를 이동시킨다.

await page.keyboard.press( "Tab" );

// 페이스북 패스워드를 키보드로 입력한다.

// 이때 자연스러운 입력을 버튼을 하나씩 입력할때마다  DELAY를 통한 시간차가 있게끔 설정한다.

await page.keyboard.type( "페이스북 패스워드", { delay : 100 } ); // 시간은 밀리세컨드(ms) 단위로 계산된다.

// TAB 버튼을 클릭하여 좌측에 존재하는 로그인 버튼이 선택되게 한다.

await page.keyboard.press( "Tab" );

// ENTER 키를 클릭하여 로그인한다.

await page.keyboard.press( "Enter" );

});





# 출력 결과

 $ node facebook_login.js






위와같이 트위터와 페이스북에 손쉽게 로그인 할 수 있었다.


그렇지만 보안이 중요한 사이트의 경우 키보드의 물리 입력을 감지하거나 하는 형식으로


작업을 진행하는 경우가 존재하는데, 이 경우 위와같은 입력 및 클릭방법은 전혀 도움이 되지 못한다.


그러한 경우는 아래 글을 참고하자.








■ 키보드 보안을 우회하기 위한 방법




원문 : https://2cpu.co.kr/bbs/board.php?bo_table=QnA&wr_id=591362












반응형
//