서비스
home

[GAS] 빅쿼리 API 로 테이블에 구글 시트 데이터 추가하기

목적

구글 앱스 스크립트의 BigQuery Service 를 사용해서 빅쿼리 테이블에 데이터를 추가하는 방법을 이해합니다.

BigQuery Service 추가하기

구글 앱스 스크립트에서 BigQuery Service 를 사용해 BigQuery API 를 사용하기 위해서는 먼저 편집기의 왼쪽 서비스 메뉴에서 BigQuery API 를 추가해주어야 합니다.

데이터 추가 파라미터 준비하기

빅쿼리 API 중 데이터 추가는 BigQuery.Jobs.insert 메서드를 사용합니다.
이때 projectId, datasetId, tableId가 필요한데, BigQuery 콘솔에서 확인할 수 있습니다.
SQL 작업공간으로 들어가서, 테이블을 클릭하면 테이블 정보가 표시됩니다.
테이블 ID 라고 표시된 부분이 있는데, 이 경우에는 ambient-catcher-284708.test.newTbl2022 입니다.
projectId는 온점의 앞 부분인 ambient-catcher-284708 이고, datasetId 는 중간 부분인 test 이고, tableId는 newTbl2022입니다.
BigQuery.Jobs.insert(job, projectId, blob) 형식으로 데이터를 추가할 수 있는데, 앞의 job, projectId를 다음과 같이 정의합니다.
const projectId = 'ambient-catcher-284708' // 프로젝트마다 다릅니다. const datasetId = 'test' // 데이터세트 명입니다. const tableId = 'newTbl2022' //테이블 명입니다. const job = { configuration: { load: { destinationTable: { projectId: projectId, datasetId: datasetId, tableId: tableId }, skipLeadingRows: 0 } } }
JavaScript
복사

구글 시트의 데이터로 blob 정의하기

insert 메서드의 3번째 파라미터인 blob 을 정의해야하는데, 어떻게 다음과 같은 구글 시트의 데이터를 blob 으로 만들 수 있을까요?
먼저, 데이터를 getRange()와 getValues() 로 불러오는 과정은 동일합니다.
이제 중요한 포인트인데, 데이터를 CSV 형식으로 만들고 Utilities.newBlob() 메서드로 blob을 생성합니다. blob의 형식을 'application/octet-stream' 으로 설정합니다. 이 것으로 blob 준비도 끝입니다!
let data = SpreadsheetApp.getActiveSheet().getRange('A2:D10').getValues() let dataCSV = data.join('\n') let blob = Utilities.newBlob(dataCSV, 'application/octet-stream')
JavaScript
복사

데이터 추가하기

모든 준비가 완료되었습니다. 이제 다음의 코드로 데이터를 추가해봅시다.
try { BigQuery.Jobs.insert(job, projectId, blob) Logger.log('데이터를 테이블에 추가합니다. 진행 상황은 콘솔에서 확인할 수 있습니다.') } catch (err) { Logger.log(err) }
JavaScript
복사
데이터가 적어서 금방 추가되었습니다.
만약 스키마에 맞지 않게 Job 을 실행시키면 다음과 같이 오류를 내면서 중단됩니다.
완성된 코드는 다음과 같습니다.
function insertData() { let data = SpreadsheetApp.getActiveSheet().getRange('A2:D10').getValues() let dataCSV = data.join('\n') Logger.log(dataCSV) let blob = Utilities.newBlob(dataCSV, 'application/octet-stream') Logger.log(blob) const projectId = 'ambient-catcher-284708' const datasetId = 'test' const tableId = 'newTbl2022' const job = { configuration: { load: { destinationTable: { projectId: projectId, datasetId: datasetId, tableId: tableId }, skipLeadingRows: 0 } } } try { BigQuery.Jobs.insert(job, projectId, blob) Logger.log('데이터를 테이블에 추가합니다. 진행 상황은 콘솔에서 확인할 수 있습니다.') } catch (err) { Logger.log(err) } }
JavaScript
복사

관련 포스팅