1. 빅데이터 분석부터 슬라이드 프레젠테이션까지
데이터 과학자가 빅데이터 분석을 수행하는 데 사용할 수 있는 도구는 많이 있지만, 최종 분석가는 여전히 결과를 경영진에게 정당화해야 합니다. 종이나 데이터베이스에 수많은 숫자는 주요 이해 관계자에게 제시하기 어렵습니다. 이 중급 Google Apps Script Codelab에서는 두 가지 Google 개발자 플랫폼 (Google Workspace 및 Google Cloud 콘솔)을 사용하여 마지막 단계를 자동화할 수 있습니다.
Google Cloud의 개발자 도구를 사용하면 심층적인 데이터 분석을 수행할 수 있습니다. 그런 다음 결과를 가져와서 스프레드시트에 삽입하고 데이터가 포함된 슬라이드 프레젠테이션을 생성할 수 있습니다. 이는 관리에 데이터를 전달하는 데 더 적합한 방법을 제공합니다. 이 Codelab에서는 Cloud 콘솔의 BigQuery API (Apps Script 고급 서비스)와 Google Sheets 및 Google Slides의 기본 제공 Apps Script 서비스를 다룹니다.
동기
이 Codelab의 샘플 앱은 다음과 같은 다른 코드 샘플에서 영감을 받았습니다.
- GitHub에서 오픈소스로 제공되는 Google Apps Script BigQuery 서비스 샘플 앱
- 스프레드시트 데이터에서 슬라이드 생성 개발자 동영상에 소개되었으며 이 블로그 게시물에 게시된 샘플 앱입니다.
- Google Slides API Codelab에서 소개하는 샘플 앱입니다.
Slides API Codelab 샘플 앱에도 BigQuery와 Slides가 포함되어 있지만 이 Codelab의 샘플 앱과 몇 가지 차이점이 있습니다.
- Node.js 앱과 Apps Script 앱 비교
- Apps Script 서비스를 사용하는 동안 REST API를 사용합니다.
- Google Drive는 사용하지만 Google Sheets는 사용하지 않는 반면, 이 앱에서는 Sheets만 사용하지만 Drive는 사용하지 않습니다.
이 Codelab에서는 실제 사용 사례와 유사한 방식으로 Google Cloud 전반의 기능과 API를 보여주면서 여러 기술을 단일 앱으로 통합하고자 했습니다. 이 프로그램의 목표는 여러분이 상상력을 발휘하고, Cloud Console과 Google Workspace를 모두 사용하여 조직과 고객이 직면한 어려운 문제를 해결할 수 있도록 영감을 주는 것입니다.
학습할 내용
- 여러 Google 서비스에서 Google Apps Script를 사용하는 방법
- Google BigQuery를 사용하여 빅데이터를 분석하는 방법
- Google 시트를 만들고 데이터를 삽입하는 방법
- Sheets에서 차트를 만드는 방법
- Sheets에서 Google Slides 프레젠테이션으로 데이터 및 차트를 전송하는 방법
필요한 항목
- 인터넷에 액세스할 수 있는 웹브라우저
- Google 계정 (Google Workspace 계정에 관리자의 승인이 필요할 수 있음)
- Google Sheets의 기본 지식
- Sheets A1 표기법 읽기 기능
- 기본 JavaScript 기술
- Apps Script 개발에 관한 지식은 유용하지만 필수는 아님
2. 설문조사
이 Codelab/튜토리얼을 어떻게 사용할 계획인가요?
<ph type="x-smartling-placeholder">Google Workspace 개발자 도구 및 서비스 이용 경험을 평가해 주세요. API는 어떨까요?
귀하의 Apps Script 사용 경험을 구체적으로 평가해 주세요.
Cloud 콘솔 개발자 도구 및 API는 어떨까요?
<ph type="x-smartling-placeholder">3. 개요
이제 이 Codelab의 내용을 알았으니 다음 작업을 수행해 보겠습니다.
- 기존 Apps Script-BigQuery 샘플을 사용하여 작동시킵니다.
- 샘플에서 BigQuery로 쿼리를 보내고 결과를 얻는 방법을 알아봅니다.
- Google 시트를 만들고 BigQuery의 결과를 여기에 삽입합니다.
- 코드를 수정하여 시트에 반환되어 삽입된 데이터를 약간 변경합니다.
- Apps Script의 스프레드시트 서비스를 사용하여 BigQuery 데이터에 대한 차트를 만듭니다.
- Slides 서비스를 사용하여 Google Slides 프레젠테이션을 만듭니다.
- 기본 제목 슬라이드에 제목과 부제목을 추가합니다.
- 데이터 테이블이 있는 슬라이드를 만들고 시트의 데이터 셀을 내보냅니다.
- 다른 슬라이드를 만들고 스프레드시트 차트를 삽입합니다.
먼저 Apps Script, BigQuery, Sheets, Slides에 관한 배경 정보를 알아보겠습니다.
Google Apps Script 및 BigQuery
Google Apps Script는 Google REST API보다 높은 수준에서 작동하는 Google Workspace 개발 플랫폼입니다. 이는 모든 개발자 기술 수준에 액세스할 수 있는 서버리스 개발 및 애플리케이션 호스팅 환경입니다. 기본적으로 Apps Script는 Google Workspace 자동화, 확장, 통합을 위한 서버리스 JavaScript 런타임입니다.
Node.js와 유사하게 서버 측 JavaScript를 사용하지만, 빠른 비동기 이벤트 기반 애플리케이션 호스팅보다는 Google Workspace 및 기타 Google 서비스와의 긴밀한 통합에 중점을 둡니다. 또한 평소 사용하던 것과 다른 개발 환경을 제공합니다. Apps Script를 사용하면 다음을 수행할 수 있습니다.
- 브라우저 기반 코드 편집기를 사용하여 스크립트를 개발하지만 Apps Script용 명령줄 배포 도구인
clasp
을 사용하는 경우 로컬에서 개발할 수도 있습니다. - Apps Script의
URL Fetch
또는JDBC
서비스를 사용하여 Google Workspace 및 기타 Google 또는 외부 서비스에 액세스하도록 맞춤설정된 특수 버전의 JavaScript로 코드를 작성합니다. - 승인 코드는 Apps Script에서 처리되므로 별도로 작성할 수 없습니다.
- 앱을 호스팅할 필요 없이 클라우드의 Google 서버에서 실행되기 때문입니다.
Apps Script는 다음 두 가지 방법으로 다른 Google 기술과 연동합니다.
- 기본 제공 서비스
- 고급 서비스 사용
기본 제공 서비스에는 사용자 데이터, 다른 Google 시스템, 외부 시스템과 상호작용하는 상위 수준 메서드가 있습니다. 고급 서비스는 기본적으로 Google Workspace API 또는 Google REST API를 둘러싼 얇은 래퍼입니다. 고급 서비스는 REST API의 전체 범위를 제공하고 기본 제공 서비스보다 더 많은 작업을 할 수 있지만, 전체 REST API보다 사용하기 쉬우면서도 더 많은 코드 복잡성이 필요합니다. 또한 고급 서비스를 사용하기 전에 스크립트 프로젝트에 대해 사용 설정해야 합니다.
가능하면 개발자는 내장된 서비스를 사용해야 합니다. 기본 제공 서비스는 사용이 더 쉽고 고급 서비스보다 더 많은 기능을 제공하기 때문입니다. 그러나 일부 Google API에는 기본 제공 서비스가 없으므로 고급 서비스가 유일한 옵션일 수 있습니다. 예를 들어 Google BigQuery에는 기본 제공 서비스가 없지만 BigQuery 서비스는 존재합니다. BigQuery 서비스는 Google BigQuery API를 사용하여 대규모 데이터 코퍼스 (예: 수 테라바이트)에 대한 쿼리를 수행할 수 있는 Cloud 콘솔 서비스이지만 그래도 몇 초 만에 결과를 제공할 수 있습니다.
Sheets 및 액세스 Apps Script의 슬라이드
BigQuery와 달리 Sheets와 Slides 모두 서비스가 기본 제공됩니다. 또한 API에만 있는 기능에 액세스할 수 있는 고급 서비스도 제공합니다. 코드를 시작하기 전에 기본 제공되는 Sheets 및 Slides 서비스 관련 문서를 모두 확인하세요. Sheets와 Slides의 고급 서비스에 관한 문서도 있습니다.
4. 작업 1: BigQuery 실행 및 Sheets에 결과 로깅
소개
이 첫 번째 작업에서는 이 Codelab의 상당 부분을 진행하겠습니다. 실제로 이 과정을 마치면 전체 Codelab의 절반 정도를 완료했습니다. 다음과 같은 여러 하위 섹션으로 구분됩니다.
- Google Apps Script 및 Cloud 콘솔 프로젝트를 모두 만듭니다.
- BigQuery 고급 서비스에 대한 액세스를 사용 설정합니다.
- 스크립트 편집기를 열고 애플리케이션 소스 코드를 입력합니다.
- 앱 승인 프로세스 (OAuth2)를 살펴봅니다.
- BigQuery에 요청을 보내는 애플리케이션을 실행합니다.
- BigQuery 결과를 사용하여 만든 새 Google 시트를 검토합니다.
설정
- Apps Script 프로젝트를 만들려면
script.google.com
로 이동하여 새 프로젝트를 클릭합니다. - Apps Script 프로젝트의 이름을 바꾸려면 제목 없는 프로젝트를 클릭하고 프로젝트 제목을 입력한 다음 이름 바꾸기를 클릭합니다.
그런 다음 BigQuery에서 데이터를 쿼리할 Cloud 콘솔 프로젝트를 만들어야 합니다.
- Cloud 콘솔 프로젝트를 만들려면 이 바로가기 링크를 사용하여 프로젝트를 만들고 프로젝트 이름을 지정한 다음 만들기를 클릭합니다.
- 프로젝트 생성이 완료되면 페이지에 알림이 표시됩니다. 페이지 상단의 프로젝트 목록에서 새 프로젝트가 선택되었는지 확인합니다.
- 메뉴 를 클릭하고 API 및 서비스 > OAuth 동의 화면 (직접 링크)
- 내부 > 만들기를 클릭하여 조직 내 Google Workspace 사용자를 위한 앱을 빌드하세요.
- App name 필드에 'Big Data Codelab'을 입력합니다.
- 사용자 지원 및 개발자 연락처 정보 입력란에 연락처 이메일을 입력합니다.
- 저장하고 계속하기 > 저장하고 계속하기를 선택합니다.
- 탐색 메뉴에서 더보기 를 클릭하고 프로젝트 설정 (직접 링크)을 선택합니다.
- 프로젝트 번호 아래에 나열된 값을 복사합니다. 별도의 프로젝트 ID 필드는 나중에 Codelab에서 사용됩니다.
이제 Apps Script 프로젝트를 Cloud 콘솔 프로젝트에 연결합니다.
- App Script 편집기로 전환하고 프로젝트 설정 을 클릭합니다.
- Google Cloud Platform (GCP) 프로젝트에서 프로젝트 변경을 클릭합니다.
- 프로젝트 번호를 입력하고 프로젝트 설정을 클릭합니다.
- 그런 다음 편집기 를 클릭하여 BigQuery 고급 서비스를 추가합니다.
- 서비스 옆에 있는 서비스 추가 를 클릭합니다.
- 서비스 추가 대화상자에서 BigQuery API를 선택하고 추가를 클릭합니다.
마지막 단계는 Cloud 콘솔에서 BigQuery API를 사용 설정하는 것입니다.
- 이렇게 하려면 Cloud 콘솔로 전환하고 API 및 서비스 > 대시보드를 클릭합니다. 3단계에서 만든 동일한 프로젝트에 있는지 확인합니다.
- API 및 서비스 사용 설정을 클릭합니다.
- 'big query'를 검색하고 BigQuery API (BigQuery Data Transfer API 아님)를 선택한 다음 사용 설정을 클릭하여 사용 설정합니다.
이제 애플리케이션 코드를 입력하고 승인 프로세스를 진행하여 이 애플리케이션의 첫 번째 반복 작업을 실행할 준비가 되었습니다.
애플리케이션 업로드 및 실행
- 스크립트 편집기에서 기본
myFunction()
코드 블록을 다음 코드로 바꿉니다.
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into a Sheet. You must turn on
* the BigQuery advanced service before you can run this code.
* @see https://developers.google.com/apps-script/advanced/bigquery#run_query
* @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
*/
function runQuery() {
// Replace sample with your own BigQuery query.
var request = {
query:
'SELECT ' +
'LOWER(word) AS word, ' +
'SUM(word_count) AS count ' +
'FROM [bigquery-public-data:samples.shakespeare] ' +
'GROUP BY word ' +
'ORDER BY count ' +
'DESC LIMIT 10'
};
var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
var jobId = queryResults.jobReference.jobId;
// Wait for BigQuery job completion (with exponential backoff).
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
}
// Get all results from BigQuery.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
// Return null if no data returned.
if (!rows) {
return Logger.log('No rows returned.');
}
// Create the results spreadsheet.
var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
var sheet = spreadsheet.getActiveSheet();
// Add headers to Sheet.
var headers = queryResults.schema.fields.map(function(field) {
return field.name.toUpperCase();
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
}
}
// Start storing data in row 2, col 1
var START_ROW = 2; // skip header row
var START_COL = 1;
sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
}
- 저장 를 클릭합니다.
Code.gs
옆에 있는 더보기 >를 클릭합니다. 이름 바꾸기. 제목을Code.gs
에서bq-sheets-slides.js
로 변경합니다.- 다음으로 BigQuery를 쿼리하고 결과를 Google 시트에 쓰는 코드를 검토해 보겠습니다.
runQuery()
상단에서 확인할 수 있습니다.
SELECT
LOWER(word) AS word,
SUM(word_count) AS count
FROM [bigquery-public-data:samples.shakespeare]
GROUP BY word
ORDER BY count
DESC LIMIT 10
이 쿼리는 BigQuery의 공개 데이터 세트에 포함된 셰익스피어의 작품을 살펴보고 그의 모든 작품에서 가장 자주 등장하는 단어 10개를 만들어 인기도의 내림차순으로 정렬합니다. 이 컴파일을 직접 수행하면 얼마나 많은 작업이 필요할지 상상할 때 BigQuery가 얼마나 유용한지 상상할 수 있습니다.
이 함수는 유효한 Cloud Console 프로젝트 ID가 필요한 PROJECT_ID
변수도 선언합니다. 변수 아래의 if
문은 프로젝트 ID가 없으면 애플리케이션이 진행되지 않도록 합니다.
- Cloud 콘솔 프로젝트로 전환하고 탐색 메뉴에서 더보기 를 클릭한 다음 프로젝트 설정을 선택합니다.
- 프로젝트 ID 아래에 나열된 값을 복사합니다.
- App Script 편집기로 다시 전환한 후
bq-sheets-slides.js
에서PROJECT_ID
변수를 찾아 값을 추가합니다. - 저장 을 클릭합니다. > Run으로 이동합니다.
- 계속하려면 권한 검토를 클릭합니다.
- 스크립트 실행이 시작되면 기본 제공 실행 로그가 열리고 스크립트 작업이 실시간으로 기록됩니다.
- 실행 로그에 '실행 완료'라고 표시되면 Google Drive (
drive.google.com
)로 이동하여 '모든 셰익스피어 작품에서 가장 일반적인 단어'라는 이름의 Google 시트를 찾습니다. (또는QUERY_NAME
변수에 할당한 이름(업데이트한 경우): - 스프레드시트를 열어 가장 일반적인 10개 단어와 총 개수를 내림차순으로 정렬하여 확인합니다.
작업 1 요약
검토를 위해 셰익스피어 작품 전체를 쿼리하는 코드를 실행하여 모든 희곡의 모든 단어를 살펴보았습니다. 단어의 수를 세어 등장인물의 내림차순으로 정렬했습니다. 또한 Google Sheets의 Apps Script 기본 제공 서비스를 사용하여 이 데이터를 표시했습니다.
bq-sheets-slides.js
에 사용한 코드는 이 Codelab GitHub 저장소의 step1
폴더(github.com/googlecodelabs/bigquery-sheets-slides)에서도 확인할 수 있습니다. 이 코드는 BigQuery 고급 서비스 페이지에 있는 원본 예시에서 영감을 얻었습니다. 이 예에서는 셰익스피어에 사용된 문자가 10자 이상인 가장 인기 있는 단어를 검색하는 약간 다른 쿼리를 실행했습니다. GitHub 저장소에서 예시를 확인할 수도 있습니다.
셰익스피어 작품이나 기타 공개 데이터 테이블로 빌드할 수 있는 다른 쿼리에 관심이 있다면 BigQuery 샘플 테이블 쿼리 방법 및 이 GitHub 저장소를 방문하세요.
Apps Script에서 쿼리를 실행하기 전에 Cloud 콘솔에서 BigQuery 페이지를 사용하여 쿼리를 실행할 수도 있습니다. 확인하려면 메뉴 를 클릭하고 BigQuery UI > SQL 작업공간 (직접 링크) 예를 들어 BigQuery 그래픽 인터페이스에서는 다음과 같이 쿼리가 표시됩니다.
5. 작업 2: Google Sheets에서 차트 만들기
runQuery()
의 목적은 BigQuery를 사용하고 데이터 결과를 Google 시트로 전송하는 것입니다. 다음으로 데이터를 사용하여 차트를 만들어야 합니다. Sheets'를 호출하는 createColumnChart()
라는 새 함수를 만들어 보겠습니다. newChart()
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다.
- Apps Script 편집기에서
runQuery()
뒤의bq-sheets-slides.js
에createColumnChart()
함수를 추가합니다. 이 코드는 시트를 가져오고 모든 데이터가 포함된 열 형식 차트를 요청합니다. 첫 번째 행에 열 헤더가 포함되어 있으므로 데이터 범위는 A2 셀에서 시작합니다.
/**
* Uses spreadsheet data to create a column chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} Visualizes the results
* @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first) Sheet.
var sheet = spreadsheet.getSheets()[0];
// Data range in Sheet is from cell A2 to B11.
var START_CELL = 'A2'; // skip header row
var END_CELL = 'B11';
// Place chart on Sheet starting on cell E5.
var START_ROW = 5; // row 5
var START_COL = 5; // col E
var OFFSET = 0;
// Create & place chart on the Sheet using above values.
var chart = sheet.newChart()
.setChartType(Charts.ChartType.COLUMN)
.addRange(sheet.getRange(START_CELL + ':' + END_CELL))
.setPosition(START_ROW, START_COL, OFFSET, OFFSET)
.build();
sheet.insertChart(chart);
}
createColumnChart()
함수에는 스프레드시트 객체 매개변수가 필요하므로createColumnChart()
에 전달할 수 있는spreadsheet
객체를 반환하도록runQuery()
를 업데이트해야 합니다.runQuery()
의 끝에서 시트 생성을 성공적으로 로깅한 후spreadsheet
객체를 반환합니다.
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
// NEW: Return the spreadsheet object for later use.
return spreadsheet;
}
runQuery()
와createColumnChart()
를 모두 호출하는createBigQueryPresentation()
함수를 만듭니다. BigQuery와 차트 생성 기능을 논리적으로 분리하는 것이 좋습니다.
/**
* Runs the query, adds data and a chart to a spreadsheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
createColumnChart(spreadsheet);
}
- 위에서 스프레드시트 객체 반환과 입력 함수 만들기라는 두 가지 중요한 단계를 수행했습니다.
runQuery()
를 더 유용하게 만들려면 로그 줄을runQuery()
에서createBigQueryPresentation()
로 이동해야 합니다. 이제 메서드가 다음과 같이 표시됩니다.
/**
* Runs a BigQuery query, adds data and a chart to a spreadsheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); // MOVED HERE
createColumnChart(spreadsheet);
}
위 변경사항 (PROJECT_ID
제외)에 따라 bq-sheets-slides.js
가 이제 다음과 같이 표시됩니다. 이 코드는 GitHub 저장소의 step2
에도 있습니다.
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into a sheet. You must turn on
* the BigQuery advanced service before you can run this code.
* @see https://developers.google.com/apps-script/advanced/bigquery#run_query
* @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
*/
function runQuery() {
// Replace sample with your own BigQuery query.
var request = {
query:
'SELECT ' +
'LOWER(word) AS word, ' +
'SUM(word_count) AS count ' +
'FROM [bigquery-public-data:samples.shakespeare] ' +
'GROUP BY word ' +
'ORDER BY count ' +
'DESC LIMIT 10'
};
var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
var jobId = queryResults.jobReference.jobId;
// Wait for BigQuery job completion (with exponential backoff).
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
}
// Get all results from BigQuery.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
// Return null if no data returned.
if (!rows) {
return Logger.log('No rows returned.');
}
// Create the results spreadsheet.
var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
var sheet = spreadsheet.getActiveSheet();
// Add headers to sheet.
var headers = queryResults.schema.fields.map(function(field) {
return field.name.toUpperCase();
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
}
}
// Start storing data in row 2, col 1
var START_ROW = 2; // skip header row
var START_COL = 1;
sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);
// Return the spreadsheet object for later use.
return spreadsheet;
}
/**
* Uses spreadsheet data to create a columnar chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} Visualizes the results
* @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first) sheet.
var sheet = spreadsheet.getSheets()[0];
// Data range in sheet is from cell A2 to B11.
var START_CELL = 'A2'; // skip header row
var END_CELL = 'B11';
// Place chart on Sheet starting on cell E5.
var START_ROW = 5; // row 5
var START_COL = 5; // col E
var OFFSET = 0;
// Create & place chart on the sheet using above values.
var chart = sheet.newChart()
.setChartType(Charts.ChartType.COLUMN)
.addRange(sheet.getRange(START_CELL + ':' + END_CELL))
.setPosition(START_ROW, START_COL, OFFSET, OFFSET)
.build();
sheet.insertChart(chart);
}
/**
* Runs a BigQuery query, adds data and a chart to a spreadsheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
createColumnChart(spreadsheet);
}
스크립트 편집기에서 스크립트 프로젝트를 저장합니다. 그런 다음 함수 목록에서 createBigQueryPresentation
를 선택하고 실행을 클릭합니다. 완료되면 Google Drive에 다른 스프레드시트가 생성되지만 이번에는 차트가 데이터 옆의 시트에 포함됩니다.
6. 작업 3: 결과 데이터를 슬라이드 자료에 넣기
Codelab의 마지막 부분에서는 Google Slides 프레젠테이션을 만들고, 제목 슬라이드에 제목과 부제목을 추가한 다음, 데이터 셀과 차트를 위한 슬라이드를 빌드합니다.
- Apps Script 편집기에서
createColumnChart()
뒤의bq-sheets-slides.js
에createSlidePresentation()
함수를 추가합니다. 슬라이드 자료의 모든 작업은 이 기능 내에서 이루어집니다. 슬라이드 자료를 만든 다음 기본 제목 슬라이드에 제목과 부제목을 추가해 보겠습니다.
/**
* Create presentation with spreadsheet data and a chart
* @param {Spreadsheet} Spreadsheet containing results data
* @param {EmbeddedChart} Sheets chart to embed on a slide
* @returns {Presentation} Slide deck with the results
* @see https://developers.google.com/apps-script/reference/slides/presentation
*/
function createSlidePresentation(spreadsheet, chart) {
// Create the presentation.
var deck = SlidesApp.create(QUERY_NAME);
// Populate the title slide.
var [title, subtitle] = deck.getSlides()[0].getPageElements();
title.asShape().getText().setText(QUERY_NAME);
subtitle.asShape().getText().setText('using Google Cloud Console and Google Workspace APIs:\n' +
'Google Apps Script, BigQuery, Sheets, Slides');
createSlidePresentation()
의 다음 단계는 Google 시트에서 새 슬라이드 자료로 셀 데이터를 가져오는 것입니다. 다음 코드 스니펫을 함수에 추가합니다.
// Data range to copy is from cell A1 to B11
var START_CELL = 'A1'; // include header row
var END_CELL = 'B11';
// Add the table slide and insert an empty table on it with
// the dimensions of the data range; fails if the sheet is empty.
var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
var sheetValues = spreadsheet.getSheets()[0].getRange(
START_CELL + ':' + END_CELL).getValues();
var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);
// Populate the table with spreadsheet data.
for (var i = 0; i < sheetValues.length; i++) {
for (var j = 0; j < sheetValues[0].length; j++) {
table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
}
}
createSlidePresentation()
의 마지막 단계는 슬라이드를 하나 더 추가하고 스프레드시트에서 차트를 가져온 다음Presentation
객체를 반환하는 것입니다. 다음 코드 스니펫을 함수에 추가합니다.
// Add a chart slide and insert the chart on it.
var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
chartSlide.insertSheetsChart(chart);
// Return the presentation object for later use.
return deck;
}
- 이제 함수가 완료되었으므로 서명을 다시 살펴보겠습니다.
createSlidePresentation()
에는 스프레드시트 및 차트 객체 매개변수가 모두 필요합니다.Spreadsheet
객체를 반환하도록 이미runQuery()
를 조정했지만 차트 객체 (EmbeddedChart
)를 반환하도록createColumnChart()
도 비슷하게 변경해야 합니다.createColumnChart()
로 돌아가서 다음 코드 스니펫을 함수 끝에 추가합니다.
// NEW: Return the chart object for later use.
return chart;
}
- 이제
createColumnChart()
가 차트 객체를 반환하므로 차트를 변수에 저장해야 합니다. 그런 다음 스프레드시트와 차트 변수 모두를createSlidePresentation()
에 전달합니다. 또한 새로 만든 스프레드시트의 URL을 기록하므로 새 슬라이드 프레젠테이션의 URL도 기록해 보겠습니다. 다음과 같이createBigQueryPresentation()
를 업데이트합니다.
/**
* Runs a BigQuery query, adds data and a chart to a spreadsheet,
* and adds the data and chart to a new slide presentation.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
var chart = createColumnChart(spreadsheet); // UPDATED
var deck = createSlidePresentation(spreadsheet, chart); // NEW
Logger.log('Results slide deck created: %s', deck.getUrl()); // NEW
}
- 저장하고
createBigQueryPresentation()
를 다시 실행합니다. 앱을 실행하려면 앱에서 Google Slides 프레젠테이션을 보고 관리하기 위한 사용자의 권한 집합이 하나 더 필요합니다. 이러한 권한을 검토하고 허용하면 전과 동일하게 실행됩니다. - 이제 만든 스프레드시트 외에도 아래와 같이 슬라이드 3개 (제목, 데이터 표, 데이터 차트)가 있는 새 프레젠테이션도 생성됩니다.
7. 결론
수고하셨습니다. Google Cloud의 양측을 사용하는 애플리케이션을 만들었습니다. Google BigQuery 요청을 수행하여 공개 데이터 세트 중 하나를 쿼리하고, 결과를 저장할 Google Sheets 스프레드시트를 만들고, 데이터를 기반으로 차트를 추가하고, 마지막으로 스프레드시트의 데이터와 차트 결과를 포함하는 Google Slides 프레젠테이션을 만듭니다.
이 단계는 기술적으로 수행한 작업입니다. 간단히 말해 빅데이터 분석에서 이해관계자에게 제시할 수 있는 결과를 도출했으며, 이 모든 것이 코드를 사용하여 자동화되었습니다. 이 샘플이 자신의 프로젝트에 맞게 맞춤설정하는 데 도움이 되기를 바랍니다. 이 Codelab을 마칠 때 이 샘플 앱을 더욱 개선하는 방법에 관한 몇 가지 제안사항을 제공합니다.
최종 작업의 변경사항 (PROJECT_ID
제외)을 적용하면 이제 bq-sheets-slides.js
가 다음과 같이 표시됩니다.
/**
* Copyright 2018 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into a spreadsheet. You must turn on
* the BigQuery advanced service before you can run this code.
* @see https://developers.google.com/apps-script/advanced/bigquery#run_query
* @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
*/
function runQuery() {
// Replace sample with your own BigQuery query.
var request = {
query:
'SELECT ' +
'LOWER(word) AS word, ' +
'SUM(word_count) AS count ' +
'FROM [bigquery-public-data:samples.shakespeare] ' +
'GROUP BY word ' +
'ORDER BY count ' +
'DESC LIMIT 10'
};
var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
var jobId = queryResults.jobReference.jobId;
// Wait for BigQuery job completion (with exponential backoff).
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
}
// Get all results from BigQuery.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
// Return null if no data returned.
if (!rows) {
return Logger.log('No rows returned.');
}
// Create the results spreadsheet.
var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
var sheet = spreadsheet.getActiveSheet();
// Add headers to sheet.
var headers = queryResults.schema.fields.map(function(field) {
return field.name.toUpperCase();
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
}
}
// Start storing data in row 2, col 1
var START_ROW = 2; // skip header row
var START_COL = 1;
sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);
// Return the spreadsheet object for later use.
return spreadsheet;
}
/**
* Uses spreadsheet data to create a column chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} Visualizes the results
* @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first) sheet.
var sheet = spreadsheet.getSheets()[0];
// Data range in sheet is from cell A2 to B11.
var START_CELL = 'A2'; // skip header row
var END_CELL = 'B11';
// Place chart on sheet starting on cell E5.
var START_ROW = 5; // row 5
var START_COL = 5; // col E
var OFFSET = 0;
// Create & place chart on the sheet using above values.
var chart = sheet.newChart()
.setChartType(Charts.ChartType.COLUMN)
.addRange(sheet.getRange(START_CELL + ':' + END_CELL))
.setPosition(START_ROW, START_COL, OFFSET, OFFSET)
.build();
sheet.insertChart(chart);
// Return the chart object for later use.
return chart;
}
/**
* Create presentation with spreadsheet data and a chart
* @param {Spreadsheet} Spreadsheet containing results data
* @param {EmbeddedChart} Sheets chart to embed on a slide
* @returns {Presentation} Slide deck with the results
* @see https://developers.google.com/apps-script/reference/slides/presentation
*/
function createSlidePresentation(spreadsheet, chart) {
// Create the presentation.
var deck = SlidesApp.create(QUERY_NAME);
// Populate the title slide.
var [title, subtitle] = deck.getSlides()[0].getPageElements();
title.asShape().getText().setText(QUERY_NAME);
subtitle.asShape().getText().setText('using Google Cloud Console and Google Workspace APIs:\n' +
'Google Apps Script, BigQuery, Sheets, Slides');
// Data range to copy is from cell A1 to B11
var START_CELL = 'A1'; // include header row
var END_CELL = 'B11';
// Add the table slide and insert an empty table on it with
// the dimensions of the data range; fails if the sheet is empty.
var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
var sheetValues = spreadsheet.getSheets()[0].getRange(
START_CELL + ':' + END_CELL).getValues();
var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);
// Populate the table with spreadsheet data.
for (var i = 0; i < sheetValues.length; i++) {
for (var j = 0; j < sheetValues[0].length; j++) {
table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
}
}
// Add a chart slide and insert the chart on it.
var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
chartSlide.insertSheetsChart(chart);
// Return the presentation object for later use.
return deck;
}
/**
* Runs a BigQuery query, adds data and a chart to a spreadsheet,
* and adds the data and chart to a new slide presentation.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
var chart = createColumnChart(spreadsheet);
var deck = createSlidePresentation(spreadsheet, chart);
Logger.log('Results slide deck created: %s', deck.getUrl());
}
이 코드 샘플은 GitHub 저장소의 final
폴더에서도 찾을 수 있습니다.
8. 추가 리소스
다음은 이 Codelab에서 다룬 자료를 자세히 살펴보고 Google 개발자 도구에 프로그래매틱 방식으로 액세스하는 다른 방법을 탐색하는 데 도움이 되는 추가 리소스입니다.
이 애플리케이션의 리소스
문서
- Google Apps Script 도움말 사이트
- Apps Script: 스프레드시트 서비스
- Apps Script: Slides 서비스
- Apps Script: BigQuery 고급 서비스
동영상
뉴스 및 업데이트
- Google Cloud Platform 블로그
- Google Cloud 데이터 분석 블로그
- Google Developers 블로그
- Twitter: Google Developers (@↩)
- Google Workspace 개발자 블로그
- 트위터: Google Workspace 개발자 (@workspacedevs)
기타 Codelab
초급
- [Google Sheets] Google Sheets를 사용한 Apps Script의 기본사항
- [REST API] Google Workspace 및 Google API를 사용하여 파일 및 폴더 만들기
중급
- [Apps Script] CLASP Apps Script 명령줄 도구
- [Apps Script] Gmail용 Google Workspace 부가기능
- [Apps Script] 행아웃 채팅용 맞춤 봇
- [REST API] Google Sheets를 애플리케이션의 보고 도구로 사용
- [REST API] BigQuery API를 사용하여 Google Slides 프레젠테이션 생성
9. 다음 단계: 코드 문제
아래에는 이 Codelab에서 빌드한 샘플을 향상하거나 보강할 수 있는 다양한 방법이 나와 있습니다. 이 목록은 일부 예시일 뿐 모든 내용을 포함하지는 않지만 다음 단계로 나아갈 수 있도록 영감을 주는 아이디어를 제공합니다.
- 애플리케이션: 자바스크립트 사용이나 Apps Script에서 요구하는 제한사항에 제약을 받고 싶지 않은 경우 Google BigQuery, Sheets, Slides용 REST API를 사용하는 선호하는 프로그래밍 언어로 이 애플리케이션을 포팅합니다.
- BigQuery: 관심 있는 Shakespeare 데이터 세트에 대해 다른 쿼리를 실험합니다. 또 다른 샘플 쿼리는 원본 Apps Script BigQuery 샘플 앱에서 찾을 수 있습니다.
- BigQuery: BigQuery의 다른 공개 데이터 세트 중 일부를 실험하여 보다 의미 있는 데이터 세트를 찾습니다.
- BigQuery—앞서 셰익스피어 작품이나 기타 공개 데이터 테이블로 빌드할 수 있는 다른 쿼리를 언급했습니다. 이 웹페이지와 이 GitHub 저장소에서 확인할 수 있습니다.
- 스프레드시트: 차트 갤러리에서 다른 차트 유형을 사용해 보세요.
- 시트 및 BigQuery: 자체 대규모 스프레드시트 데이터 세트를 사용합니다. 2016년에 BigQuery팀은 개발자가 시트를 데이터 소스로 사용할 수 있는 기능을 도입했습니다. 자세한 내용은 Google BigQuery와 Google Drive 통합을 참고하세요.
- Slides: 생성된 프레젠테이션에 빅데이터 분석에 연결된 이미지 또는 기타 애셋 등 다른 슬라이드를 추가합니다. 다음은 Slides 기본 제공 서비스의 참조 문서입니다.
- Google Workspace: Apps Script에서 다른 Google Workspace 또는 Google 기본 제공 서비스를 사용합니다. 예: Gmail, Calendar, Docs, Drive, 지도, 애널리틱스, YouTube 등 및 기타 고급 서비스 자세한 내용은 기본 제공 및 고급 서비스의 참조 개요에서 확인하세요.