목적
구글 앱스 스크립트의 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
복사