노는게 제일 좋습니다.

구글시트 내용을 가져와 웹에서 보여주는 방법 본문

구글시트 내용을 가져와 웹에서 보여주는 방법

노는게 제일 좋습니다. 2020. 8. 23. 03:15

링크 모음

예제 시트 뷰어

웹페이지 게시된 예제시트

예제시트 JSON페이지

실제로 구성한 웹페이지

깃허브 레포

 

배경


DBMS를 사용할 줄 모르지만, 어딘가에 축적된 데이터를 가져와서 웹 화면에 뿌려주고 싶을 때가 있다. 본인은 정말로 HTML조차 모른채로 '이시국 보건증'을 구성하면서 DB의 필요성을 느꼈지만, 길고 긴 고난의 삽질을 할 시간이 없었다. 당시에는 코로나가 여름즈음 되면 종식될 줄 알았기에, 하루빨리 내 데이터를 보여주는 일이 가장 중요했기 때문이다.

쉽고 빠른 길을 찾던 중 구글 스프레드시트를 구글API와 앱스를 통해 사용할 수 있다는 사실을 우연히 접했다. 그 날부터 익숙한 도구인 구글시트에 대해 파고들기 시작했다. 여러가지 초보자의 삽질을 하며 알아낸, 가장 최근에 사용하는 확실+간단한 방법을 공유하고자 한다.

이 많은걸 대체 어떻게 모았을까

 

 

개요


1) 구글시트에서 해야하는 작업

내용 작성하기 → 웹으로 배포하고 열람권한 설정하기

2) 웹프로그램에서 해야하는 작업

웹으로 배포된 내용을 json으로 파싱해 가져오기 → 이용하기 편리한 형태로 저장 → 보여주기 

 

 

구글시트 작업하기


먼저 구글시트에 위와 같이 데이터를 입력한다. 프로그램에서 이용하기 쉬우려면 1행은 일종의 '대표하는 이름'이 되어야 한다.

예를들어, A열을 보면 1행은 '지역'으로서 2~5행의 내용들을 '대표하는 이름'이라고 할 수 있다. 이걸 뭐라고 부르는지는 잘 모르겠고, 비슷한 모양새를 가진 Dataframe에서는 Column(열) 이라고 부르는걸 봤다. 그래서 나도 저걸 column 이라고 부를 것이다.

 

내용을 모두 작성했다면 [파일] - [웹에 게시]를 누른다. 그러면 팝업창이 뜨게되는데, 사용하고자 하는 [시트]를 선택하고 [웹페이지]로 게시한다. 마지막으로 [게시] - [확인] 버튼을 누르면 최종적으로 게시가 된다.

 

게시된 링크로 들어가보면 구글시트에 작성한 내용이 잘 나오는 것을 확인할 수 있다. 하지만 우린 저 링크를 사용하지 않는다. 

 

구글시트 편집창의 주소를 보면 빨간색박스와 같이 유난히 긴 조합의 글자가 있다. 이 시트를 가리키는 일종의 KEY이다.

 

https://spreadsheets.google.com/feeds/list/여기에 KEY를 넣어주세요/1/public/full?alt=json

저 KEY를 위 URL중간에 넣고 접속해보자. 그러면 우리가 작성한 내용이 JSON이라는 무시무시한 형태로 나타나게 된다.

혹시 본인이 게시한 시트가 기본으로 만들어져있는 1번시트가 아니면, KEY값 뒤에 있는 1의 값을 잘 바꿔주면 된다.

https://spreadsheets.google.com/feeds/list/1R5i8g6SfcDbvuEQ8v_zkAQFfCAVZjmr8ajTlDJB_mmQ/1/public/full?alt=json

지금 본인이 작성하고 있는 시트에 대한 JSON을 보여주는 URL은 위와 같다. 여기로 접속할 수 있다. 이 URL을 잘 적어두자. 프로그램에서 사용할 것이다. json내용이 너무 어지러워서 정렬해 보고싶다면, JSON lint에서 할 수 있다.

 

 

프로그램 작성하기


 

실제 돌아가는 웹페이지 깃허브 저장소를 먼저 공개한다.

 

<body>
  <article>
    <hr>

    <h1 class="name">이름이 표시될 곳</h1>
    <p class="region">지역이 표시될 곳</p>
    <p class="phone">전화번호가 표시될 곳</p>

    <hr>

    <h1 class="name">이름이 표시될 곳</h1>
    <p class="region">지역이 표시될 곳</p>
    <p class="phone">전화번호가 표시될 곳</p>

    <hr>

    <h1 class="name">이름이 표시될 곳</h1>
    <p class="region">지역이 표시될 곳</p>
    <p class="phone">전화번호가 표시될 곳</p>

    <hr>

    <h1 class="name">이름이 표시될 곳</h1>
    <p class="region">지역이 표시될 곳</p>
    <p class="phone">전화번호가 표시될 곳</p>

    <hr>
  </article>
</body>

먼저 HTML문서는 간단하게 작성하였다. 각 row의 이름, 지역, 전화번호를 표시한다.

 

window.addEventListener('DOMContentLoaded', main);

async function main(){
	const TARGET={
		name : document.getElementsByClassName('name'),
		region : document.getElementsByClassName('region'),
		phone : document.getElementsByClassName('phone')
	};
	const SOURCE = 'https://spreadsheets.google.com/feeds/list/1R5i8g6SfcDbvuEQ8v_zkAQFfCAVZjmr8ajTlDJB_mmQ/1/public/full?alt=json';
	const COLUMNS = ['이름', '지역', '전화번호'];
	
	const DATA = await separateRowFromJson(SOURCE, COLUMNS);

	for(let i=0; i<DATA.length; i++){
		TARGET['name'][i].textContent = DATA[i]['이름'];
		TARGET['region'][i].textContent = DATA[i]['지역'];
		TARGET['phone'][i].textContent = DATA[i]['전화번호'];
	}
}

async function separateRowFromJson(SOURCE, COLUMNS){
	const FETCHED_SOURCE = await fetch(SOURCE);
  	let temp = await FETCHED_SOURCE.json();
 	temp = temp['feed']['entry'];

	let _DATA = [];
	for(var i=0; i<Object.keys(temp).length; i++){
		_DATA[i]={};
		for(var k=0; k<Object.keys(COLUMNS).length; k++){;
			_DATA[i][COLUMNS[k]] = temp[i]['gsx$'+COLUMNS[k]]['$t'];
		}
	}
	
	return _DATA;
}

코드도 상당히 간단하다. json형태의 내용을 불러와서 객체의 배열로 저장하고, 이걸 화면에 띄워주는게 전부이다.

 

main함수의 상수 SOURCE는 json내용이 있는 url, COLUMNS는 우리가 작성한 시트의 1행 내용들이다. 이 두 가지를 separateRowFromJson이라는 함수를 통해서 위와 같이 가공한다.

 

대충 구글시트가 뱉는 json 생김새

_DATA[i][COLUMNS[k]] = temp[i]['gsx$'+COLUMNS[k]]['$t'];

separateRowFromJson내용중 위 부분이 대체 뭔지 궁금할 수 있는데, 그냥 구글시트가 뱉는 json에서 우리가 필요한 정보가 저 부분에 저런 형태로 있다. 그에 맞춰 저렇게 써놓은 것이다.

 

 


기본적으로 구글시트가 웹에 게시되어 있기 때문에, 외부에 노출하면 큰일나는 정보는 다른 방법으로 처리해야 한다. 또, 한가지 용도로 사용하는게 아니라 여러곳에서 복잡하게 내용을 참조하여 사용하는 경우, 구글 시트로 처리하면 매우 고통받을 수 있다. 여러가지 뷰를 함수를 사용해서 시트로 미리 만들어놓아야 할텐데, 잠깐 해보니 사람 할 일이 아닌 것 같았다. 

Comments