실습 설정 안내 및 요구사항
계정과 진행 상황을 보호하세요. 이 실습을 실행하려면 항상 시크릿 브라우저 창과 실습 사용자 인증 정보를 사용하세요.

슬라이드 프레젠테이션에 대한 빅데이터 분석

실습 10분 universal_currency_alt 무료 show_chart 중급
info 이 실습에는 학습을 지원하는 AI 도구가 통합되어 있을 수 있습니다.
이 콘텐츠는 아직 휴대기기에 최적화되지 않음
최상의 경험을 위해 데스크톱 컴퓨터에서 이메일로 전송된 링크를 사용하여 방문하세요.

GSP240

Google Cloud 사용자 주도형 실습 로고

개요

데이터 과학자는 다양한 도구를 이용해 빅데이터를 분석할 수 있습니다. 하지만 경영진과 이해관계자에게 분석 내용을 설명하고 근거를 제시하는 데 도움이 되는 도구는 무엇일까요? 이 작업은 종이나 데이터베이스에 기록된 원시 데이터로는 수행하기 어렵습니다. 이 Google Apps Script 실습에서는 WorkspaceGoogle Cloud라는 두 가지 Google 개발자 플랫폼을 활용하여 마지막 단계를 완료할 수 있습니다.

Google Cloud 개발자 도구를 사용하면 데이터를 수집하고 처리한 다음 슬라이드와 스프레드시트 프레젠테이션을 생성하여 경영진과 이해관계자에게 놀라운 분석과 유용한 결론을 제시할 수 있습니다.

이 실습에서는 Google Cloud의 BigQuery API(Apps Script 고급 서비스)와 Google SheetsGoogle Slides기본 제공 Apps Script 서비스를 다룹니다.

또한 이 실습에서는 실제 상황과 매우 유사한 시나리오를 설정합니다. 실습에서 사용하는 앱은 Google Cloud 전반의 기능과 API를 보여줍니다. 이 실습의 목표는 Google Cloud와 Workspace를 모두 활용하여 조직 또는 고객의 어려운 문제를 해결하는 방법을 보여주는 것입니다.

학습할 내용

  • 여러 Google 서비스에서 Google Apps Script를 사용하는 방법
  • BigQuery를 사용하여 빅데이터 분석을 수행하는 방법
  • Google 시트를 만들고 데이터를 채우는 방법과 스프레드시트 데이터로 차트를 만드는 방법
  • 스프레드시트 차트와 데이터를 Google Slides 프레젠테이션의 별도 슬라이드로 전송하는 방법

설정

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지를 표시합니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드(권장) 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학습자 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간(실습을 시작하고 나면 일시중지할 수 없음)
참고: 이 실습에는 학습자 계정만 사용하세요. 다른 Google Cloud 계정을 사용하는 경우 해당 계정에 비용이 청구될 수 있습니다.

소개

Google Apps Script 및 BigQuery

Google Apps Script는 Google REST API를 사용할 때보다 더 높은 수준에서 작동하는 Workspace 개발 플랫폼입니다. 기술 수준과 상관없이 다양한 개발자가 액세스할 수 있는 서버리스 개발 및 애플리케이션 호스팅 환경입니다. 한 문장으로 표현하면 다음과 같습니다. 'Apps Script는 Workspace 자동화, 확장, 통합을 위한 서버리스 JavaScript 런타임입니다.'

Google Apps Script는 Node.js와 유사한 서버 측 JavaScript지만, 빠른 비동기 이벤트 기반 애플리케이션 호스팅보다는 Workspace 및 기타 Google 서비스와의 긴밀한 통합을 더 중시합니다. 또한 여러분이 평소 사용하던 것과는 완전히 다른 개발 환경을 사용합니다. Apps Script를 사용하면 다음 작업을 할 수 있습니다.

  • 브라우저 기반 코드 편집기에서 개발하되, Apps Script의 명령줄 배포 도구인 clasp를 사용하는 경우 로컬에서 개발 가능
  • (Apps Script URLfetch 또는 Jdbc 서비스를 통해) Workspace 및 기타 Google 또는 외부 서비스에 액세스하도록 맞춤설정된 특수 버전 JavaScript로 코드 작성
  • Apps Script에서 대신 처리하므로 승인 코드 작성 불필요
  • 앱 호스팅 불필요 - 앱은 클라우드의 Google 서버에서 실행됨
참고: Apps Script에 대한 자세한 내용은 공식 문서를 참고하세요. 빠른 시작이 포함된 개요, 튜토리얼, 동영상도 확인할 수 있습니다.

Apps Script는 다음과 같은 두 가지 방법으로 다른 Google 기술과 상호 작용합니다.

  • 기본 제공 서비스
  • 고급 서비스

기본 제공 서비스는 Workspace 또는 Google 제품 데이터에 액세스하거나 기타 유용한 유틸리티 메서드에 액세스하는 데 사용할 수 있는 상위 수준 메서드를 제공합니다. 고급 서비스는 Workspace 또는 Google REST API를 래핑하는 씬 래퍼일 뿐입니다. 고급 서비스는 REST API를 완전히 지원하며 대부분의 경우 기본 제공 서비스보다 더 많은 작업을 할 수 있지만 코드가 더 복잡합니다(그래도 REST API 자체만 사용할 때보다는 더 쉽게 사용할 수 있습니다).

고급 서비스를 사용하려면 먼저 스크립트 프로젝트에 고급 서비스를 사용 설정해야 합니다. 가능하면 기본 제공 서비스를 사용하는 것이 좋습니다. 기본 제공 서비스는 고급 서비스보다 사용하기 쉽고 더 많은 작업을 처리할 수 있기 때문입니다. 하지만 일부 Google API에는 기본 제공 서비스가 없으므로 고급 서비스를 선택할 수밖에 없습니다. 대표적인 예가 BigQuery입니다. 기본 제공 서비스를 사용할 수는 없지만 BigQuery 고급 서비스는 사용할 수 있습니다. (서비스가 아예 없는 것보다는 낫겠죠?)

참고: BigQuery가 처음인 분을 위해 설명해 드리자면, BigQuery는 Google Cloud 서비스로, 수 테라바이트에 달하는 매우 큰 데이터 코퍼스를 대상으로 간단한 (또는 복잡한) 쿼리를 실행하여 몇 시간이나 며칠이 아닌 몇 초 만에 결과를 제공하는

Apps Script에서 Google Sheets 및 Slides에 액세스

BigQuery는 Apps Script 고급 서비스로만 사용할 수 있습니다. 하지만 Google Sheets와 Slides는 기본 제공 Apps Script 서비스와 고급 서비스를 모두 제공합니다. 대표적인 예는 API에서만 제공되며 기본적으로 제공되지 않는 기능에 액세스하는 서비스입니다. 가능한 경우 고급 서비스 대신 기본 제공 서비스를 선택하세요. 기본 제공 서비스는 상위 수준 구성과 편리한 호출 기능을 제공하기 때문에 개발이 단순합니다.

참고: 코드를 작성하기 전에 먼저 Sheets 서비스Slides 서비스를 검토하세요.

작업 1. BigQuery를 쿼리하고 결과를 시트에 기록

이 첫 번째 작업을 수행하면 이 실습의 상당 부분을 완료하게 됩니다. 이 섹션을 마치면 전체 실습의 절반 정도를 완료하게 됩니다.

이 섹션에서는 다음 작업을 수행합니다.

  • 새 Google Apps Script 프로젝트 시작
  • BigQuery 고급 서비스에 대한 액세스 사용 설정
  • 개발 편집기로 이동하여 애플리케이션 소스 코드 입력
  • 앱 승인 프로세스(OAuth2) 진행
  • BigQuery에 요청을 전송하는 애플리케이션 실행
  • BigQuery의 결과를 이용해 생성된 새로운 Google Sheets 보기

새 Apps Script 프로젝트 만들기

  1. script.google.com으로 이동하여 새 Apps Script 프로젝트를 만듭니다. 이 실습에서는 Apps Script 만들기 링크를 클릭합니다.

Apps Script 만들기 링크

  1. Apps Script 코드 편집기가 열립니다.

Apps Script 코드 편집기

  1. 상단의 프로젝트 이름(위 그림의 '제목 없는 프로젝트')을 클릭하여 프로젝트 이름을 지정합니다.

  2. 프로젝트 이름 바꾸기 대화상자에서 원하는 프로젝트 이름(예: 'BigQuery', 'Sheets', 'Slides 데모' 등)을 지정한 다음 이름 바꾸기를 클릭합니다.

BigQuery 고급 서비스 사용 설정

새 프로젝트에 BigQuery 고급 서비스를 사용 설정하고 BigQuery API를 사용 설정합니다.

  1. 서비스 옆에 있는 서비스 추가 아이콘을 클릭합니다.

아이콘 추가

  1. 서비스 추가 대화상자에서 해당 서비스와 API를 선택합니다.

AdSense Management API, Admin SDK API 등의 옵션이 포함된 '서비스 추가' 대화상자

  1. Cloud 콘솔로 이동하여 탐색 메뉴 > API 및 서비스 > 라이브러리를 선택합니다.

대시보드, 라이브러리, 사용자 인증 정보 등의 옵션이 포함된 API 및 서비스 메뉴

  1. 검색창에 BigQuery API를 입력하거나 붙여넣은 다음 BigQuery API를 선택합니다.

검색창에 입력된 BigQuery API

  1. 필요한 경우 사용 설정을 클릭하여 BigQuery API를 사용 설정합니다.

API 라이브러리 페이지에서 강조 표시된 사용 설정 버튼

  1. 프로젝트로 돌아가면 서비스 추가 대화상자가 계속 열려 있습니다.

  2. BigQuery API를 선택하고 추가를 클릭하여 닫습니다.

BigQuery API 옵션이 강조 표시되고 '추가' 버튼이 있는 '서비스 추가' 대화상자

애플리케이션 코드 입력 및 실행

이제 애플리케이션 코드를 입력하고 승인 절차를 거쳐 이 애플리케이션의 첫 번째 버전을 작동할 수 있습니다.

  1. 아래 상자의 코드를 복사하여 코드 편집기의 모든 항목에 붙여넣습니다.
/** * 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. */ // Filename for data results var QUERY_NAME = "Most common words in all of Shakespeare's works"; // Replace this value with your Google Cloud API project ID var PROJECT_ID = '<YOUR_PROJECT_ID>'; if (!PROJECT_ID) throw Error('Project ID is required in setup'); /** * Runs a BigQuery query; puts results into Sheet. You must enable * the BigQuery advanced service before you can run this code. * @see http://developers.google.com/apps-script/advanced/bigquery#run_query * @see http://github.com/gsuitedevs/apps-script-samples/blob/master/advanced/bigquery.gs * * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results * @see http://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 BQ 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 new 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()); }
  1. 메뉴 바에서 프로젝트 저장 아이콘을 클릭하거나 Ctrl + S를 눌러 방금 만든 파일을 저장합니다.

  2. 파일 이름 옆에 있는 점 3개 메뉴를 클릭하고 이름 바꾸기를 클릭하여 파일 이름을 변경합니다.

강조 표시된 &#39;이름 바꾸기&#39; 옵션

  1. 파일 이름을 bq-sheets-slides.gs로 변경하고 Enter 키를 누릅니다.

그렇다면 이 코드는 어떤 역할을 할까요? BigQuery를 쿼리하고 결과를 새 Google 시트에 작성한다는 것은 알지만, 이 쿼리는 정확히 무엇일까요?

  1. 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가 얼마나 유용한지 잘 알 수 있습니다.

거의 완료되었습니다. bq-sheets-slides.gs 상단에 PROJECT_ID 변수를 설정하려면 유효한 프로젝트 ID가 필요합니다.

  1. <YOUR_PROJECT_ID>를 왼쪽 패널에 있는 프로젝트 ID로 바꿉니다.

다음은 프로젝트 ID 예시가 포함된 코드의 예입니다. 실제 PROJECT_ID 값은 다를 수 있습니다.

예시 코드:

// Filename for data results var QUERY_NAME = "Most common words in all of Shakespeare's works"; // Replace this value with your Google Cloud API project ID var PROJECT_ID = '<YOUR_PROJECT_ID>'; if (!PROJECT_ID) throw Error('Project ID is required in setup'); 참고: 이 코드 스니펫에서 if 문은 프로젝트 ID가 없는 경우 애플리케이션이 더 이상 진행되지 않도록 하기 위해 삽입되었습니다. 참고: 메뉴 선택기가 멈추고 작동하지 않는 경우 페이지를 새로고침하세요.
  1. 파일을 저장하고 메뉴 바에서 실행 옵션을 클릭하여 코드를 실행합니다.

  2. 그런 다음 권한 검토를 클릭합니다.

참고: Exception: Service BigQuery API has not been enabled for your Apps.. 오류가 표시되는 경우 BigQuery API 서비스를 삭제하고 다시 추가하세요.
  1. qwiklabs.net의 '계정 선택' 대화상자에서 사용자 이름을 클릭한 다음 허용을 클릭합니다.
참고: 앱을 승인한 후에는 실행할 때마다 이 프로세스를 반복하지 않아도 됩니다. Google Slides 프레젠테이션을 만들고 관리할 사용자 권한을 묻는 이 대화상자 화면은 이 실습 후반부의 '결과 데이터를 슬라이드 자료에 넣기' 섹션 전까지는 다시 표시되지 않습니다.
  1. 함수가 실행되면 상단에 작은 메시지 상자가 열립니다.

메시지: runQuery 함수 실행 중...

함수가 완료되면 메시지 상자가 사라집니다. 따라서 메시지 상자가 표시되지 않는다면 함수 실행이 완료되었을 것입니다.

  1. Google Drive로 이동하여 셰익스피어의 모든 작품에서 가장 자주 등장하는 단어라는 새 Google 시트 또는 QUERY_NAME 변수에 할당한 이름을 찾습니다.

내 드라이브 창

  1. 스프레드시트를 열면 단어와 단어의 총 개수가 내림차순으로 정렬된 행 10개가 표시됩니다.

&#39;셰익스피어의 모든 작품에서 가장 자주 등장하는 단어&#39; 스프레드시트

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다. BigQuery를 쿼리하고 결과를 시트에 로그

요약

방금 무슨 일이 일어났을까요? 셰익스피어의 모든 작품을 쿼리하는 코드를 실행했습니다. 데이터양이 '엄청나게' 많지는 않지만, 각 희곡의 모든 단어를 살펴보고 이러한 단어의 수를 관리한 다음 등장 횟수를 내림차순으로 정렬하기에는 쉽지 않은 양입니다. 여러분은 BigQuery에 이를 대신 수행하도록 요청했고, 나아가 Google Sheets용 Apps Script의 기본 제공 서비스를 사용하여 데이터를 정리했습니다. 따라서 이제 데이터를 쉽게 사용할 수 있습니다.

쿼리를 Apps Script에서 실행하기 전에 언제든지 BigQuery 콘솔에서 테스트할 수 있습니다. 개발자는 BigQuery의 사용자 인터페이스를 사용할 수 있습니다.

BigQuery 콘솔 열기

  1. Google Cloud 콘솔에서 탐색 메뉴 > BigQuery를 선택합니다.

Cloud 콘솔의 BigQuery에 오신 것을 환영합니다라는 메시지 상자가 열립니다. 이 메시지 상자에서는 빠른 시작 가이드 및 출시 노트로 연결되는 링크가 제공됩니다.

  1. 완료를 클릭합니다.

BigQuery 콘솔이 열립니다.

  1. 쿼리 편집기에 코드를 입력한 후 실행을 클릭합니다.
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

&#39;실행&#39; 버튼이 강조 표시된 쿼리 편집기

작업 2. Google Sheets에서 차트 만들기

스크립트 편집기에서 뒤로 이동합니다. 지금까지 셰익스피어 작품을 쿼리하고 정렬한 다음 결과를 Sheets에 표시하는 앱을 코딩했습니다. 코드에서 runQuery() 함수는 BigQuery와 통신하고 결과를 시트로 전송합니다. 이제 데이터를 차트로 표시하는 코드를 추가합니다. 이 섹션에서는 시트의 newChart() 메서드를 호출하여 데이터를 차트로 표시하는 createColumnChart()라는 새 함수를 만듭니다.

createColumnChart() 함수는 데이터가 있는 시트를 가져와 모든 데이터가 포함된 열 차트를 요청합니다. 첫 번째 행에는 데이터가 아닌 열 헤더가 포함되어 있으므로 데이터 범위는 A2 셀에서 시작됩니다.

  1. 차트 만들기: createColumnChart() 함수를 runQuery() 바로 뒤에 있는 bq-sheets-slides.gs에 추가합니다{after the last line of code}.
/** * Uses spreadsheet data to create columnar chart. * @param {Spreadsheet} Spreadsheet containing results data * @returns {EmbeddedChart} visualizing the results * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart */ function createColumnChart(spreadsheet) { // Retrieve the populated (first and only) 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 params. 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); }
  1. 스프레드시트 반환: 위의 코드에서 createColumnChart()에는 스프레드시트 객체가 필요하므로, createColumnChart()에 전달할 수 있도록 spreadsheet 객체를 반환하도록 앱을 조정합니다. Google 시트가 성공적으로 생성되었다는 메시지가 로깅되면 runQuery() 끝에서 객체가 반환됩니다.

  2. Logger.log로 시작하는 마지막 줄을 다음으로 바꿉니다.

Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); // Return the spreadsheet object for later use. return spreadsheet; }
  1. createBigQueryPresentation() 함수 실행: BigQuery와 차트 생성 기능을 논리적으로 분리하는 것이 좋습니다. createBigQueryPresentation() 함수를 만들어 앱을 실행하여 두 항목과 createColumnChart()를 모두 호출합니다. 추가하는 코드는 다음과 같아야 합니다.
/** * Runs a BigQuery query, adds data and a chart in a Sheet. */ function createBigQueryPresentation() { var spreadsheet = runQuery(); createColumnChart(spreadsheet); }
  1. 이 코드 블록 바로 뒤에 createBigQueryPresentation() 함수를 배치합니다.
// Filename for data results var QUERY_NAME = "Most common words in all of Shakespeare's works"; // Replace this value with your Google Cloud API project ID var PROJECT_ID = '<YOUR_PROJECT_ID>'; if (!PROJECT_ID) throw Error('Project ID is required in setup');
  1. 코드 재사용성 높이기: 지금까지 스프레드시트 객체를 반환하고 실행 함수를 만드는 두 가지 중요한 단계를 수행했습니다. 동료가 runQuery()를 재사용하고 URL이 로깅되지 않기를 원한다면 어떻게 해야 할까요?

runQuery()를 더 쉽게 이해해 일반적인 용도로 사용할 수 있도록 로그 줄을 이동합니다. 가장 적절한 위치는 어디일까요? createBigQueryPresentation()이라고 추측하셨다면, 정답입니다.

로그 줄을 이동하면 다음과 같이 표시됩니다.

/** * Runs a BigQuery query, adds data and a chart in a Sheet. */ function createBigQueryPresentation() { var spreadsheet = runQuery(); Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); createColumnChart(spreadsheet); }

위의 변경사항이 적용되어 bq-sheets-slides.js는 이제 다음과 같이 표시됩니다(PROJECT_ID는 예외).

/** * 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. */ // Filename for data results var QUERY_NAME = "Most common words in all of Shakespeare's works"; // Replace this value with your Google Cloud API project ID var PROJECT_ID = '<YOUR_PROJECT_ID>'; if (!PROJECT_ID) throw Error('Project ID is required in setup'); /** * Runs a BigQuery query, adds data and a chart in a Sheet. */ function createBigQueryPresentation() { var spreadsheet = runQuery(); Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); createColumnChart(spreadsheet); } /** * Runs a BigQuery query; puts results into Sheet. You must enable * the BigQuery advanced service before you can run this code. * @see http://developers.google.com/apps-script/advanced/bigquery#run_query * @see http://github.com/gsuitedevs/apps-script-samples/blob/master/advanced/bigquery.gs * * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results * @see http://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 BQ 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 new 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()); // Return the spreadsheet object for later use. return spreadsheet; } /** * Uses spreadsheet data to create columnar chart. * @param {Spreadsheet} Spreadsheet containing results data * @returns {EmbeddedChart} visualizing the results * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart */ function createColumnChart(spreadsheet) { // Retrieve the populated (first and only) 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 params. 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); }
  1. 파일을 저장합니다.

  2. 그런 다음 메뉴 바에서 runQuery를 클릭하고 드롭다운에서 createBigQueryPresentation을 선택합니다.

  3. 그런 다음 실행을 클릭합니다.

실행하면 Google Drive에 다른 Google 시트가 표시되지만 이번에는 시트의 데이터 옆에 차트가 표시됩니다.

&#39;셰익스피어의 모든 작품에서 가장 자주 등장하는 단어&#39; 스프레드시트(막대 그래프 포함)

작업 3. 결과 데이터를 슬라이드 자료에 넣기

실습의 마지막 부분에서는 새 Google Slides 프레젠테이션을 만들고, 제목 슬라이드에 제목과 부제목을 입력한 다음 새로운 슬라이드 2개를 추가합니다. 하나는 각 데이터 셀용이고 다른 하나는 차트용입니다.

  1. 슬라이드 자료 만들기: 먼저 새 슬라이드 자료를 만든 다음 모든 새 프레젠테이션에 포함된 기본 제목 슬라이드에 제목과 부제목을 추가합니다. 슬라이드 자료에 관한 모든 작업은 createSlidePresentation() 함수에서 수행되며, 이 함수는 createColumnChart() 함수 코드 바로 뒤에 있는 bq-sheets-slides.gs에 추가해야 합니다.
/** * Create presentation with spreadsheet data & chart * @param {Spreadsheet} Spreadsheet with results data * @param {EmbeddedChart} Sheets chart to embed on slide * @returns {Presentation} Slide deck with results */ function createSlidePresentation(spreadsheet, chart) { // Create the new 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('via GCP and G Suite APIs:\n' + 'Google Apps Script, BigQuery, Sheets, Slides');
  1. 데이터 테이블 추가: createSlidePresentation()의 다음 단계는 Google 시트의 셀 데이터를 새 슬라이드 자료로 가져오는 것입니다. 이 코드 스니펫을 createSlidePresentation() 함수에 추가합니다.
// 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 of // the dimensions of the data range; fails if Sheet 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])); } }
  1. 차트 가져오기: 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; }
  1. 차트 반환: 최종 함수가 완료되었으므로 함수의 서명을 다시 살펴보세요. 맞습니다. createSlidePresentation()에는 스프레드시트와 차트 객체가 모두 필요합니다. Spreadsheet 객체를 반환하도록 runQuery()를 이미 조정했습니다. 이제 createColumnChart()도 비슷한 방식으로 변경하여 차트(EmbeddedChart) 객체를 반환해야 합니다. 이를 위해 애플리케이션으로 돌아가 createColumnChart() 끝에 다음 줄을 추가합니다.
// Return chart object for later use return chart; }
  1. createBigQueryPresentation() 업데이트: createColumnChart()는 차트를 반환하므로 차트를 변수에 저장한 다음 스프레드시트와 차트 모두createSlidePresentation()에 전달해야 합니다. 새로 생성된 스프레드시트의 URL을 로깅하므로 새 슬라이드 프레젠테이션의 URL도 로깅할 수 있습니다. 다음 코드 블록을
/** * Runs a BigQuery query, adds data and a chart in a Sheet. */ function createBigQueryPresentation() { var spreadsheet = runQuery(); Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); createColumnChart(spreadsheet); }

이 코드 블록으로 바꿉니다.

/** * Runs a BigQuery query, adds data and a chart in a Sheet, * 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()); }

모든 업데이트가 완료되면 bq-sheets-slides.gs가 다음과 같이 표시됩니다(PROJECT_ID는 예외).

bq-sheets-slides.gs - final version

// Filename for data results var QUERY_NAME = "Most common words in all of Shakespeare's works"; // Replace this value with your Google Cloud API project ID var PROJECT_ID = '<YOUR_PROJECT_ID>'; if (!PROJECT_ID) throw Error('Project ID is required in setup'); /** * Runs a BigQuery query; puts results into Sheet. You must enable * the BigQuery advanced service before you can run this code. * @see http://developers.google.com/apps-script/advanced/bigquery#run_query * @see http://github.com/gsuitedevs/apps-script-samples/blob/master/advanced/bigquery.gs * * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results * @see http://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 BQ 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 new 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 columnar chart. * @param {Spreadsheet} Spreadsheet containing results data * @returns {EmbeddedChart} visualizing the results * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart */ function createColumnChart(spreadsheet) { // Retrieve the populated (first and only) 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 params. 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 & chart * @param {Spreadsheet} Spreadsheet with results data * @param {EmbeddedChart} Sheets chart to embed on slide * @returns {Presentation} Returns a slide deck with results * @see http://developers.google.com/apps-script/reference/slides/presentation */ function createSlidePresentation(spreadsheet, chart) { // Create the new 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('via GCP and G Suite 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 of // the dimensions of the data range; fails if Sheet 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 in a Sheet, * 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()); }
  1. createBigQueryPresentation()을 저장하고 다시 실행합니다. 실행하기 전에 Google Slides 프레젠테이션을 보고 관리할 수 있는 권한을 한 번 더 요청하는 메시지가 표시됩니다.
  2. '내 드라이브'로 이동하면 방금 생성된 시트 외에도, 아래와 같은 슬라이드 3개(제목, 데이터 테이블, 데이터 차트)가 포함된 새 Slides 프레젠테이션이 함께 표시됩니다.

셰익스피어의 모든 작품에서 가장 자주 등장하는 단어 - 제목 슬라이드

셰익스피어의 모든 작품에서 가장 자주 등장하는 단어 - 데이터 테이블 슬라이드

셰익스피어의 모든 작품에서 가장 자주 등장하는 단어 - 데이터 차트 세 번째 슬라이드

수고하셨습니다

공개 데이터 세트 중 하나를 쿼리하는 BigQuery 요청을 실행하고, 결과를 저장할 새 Google 시트를 만들고, 검색된 데이터를 기반으로 차트를 추가하고, 마지막으로 스프레드시트의 결과와 차트를 포함하는 Google Slides 프레젠테이션을 만들어 Google Cloud의 양쪽을 모두 활용하는 애플리케이션을 만들었습니다.

기술적인 관점에서 여러분이 한 일입니다. 간단히 말하면, 빅데이터 분석에서 이해관계자 대상 발표 주제에 이르는 모든 요소를 작업했습니다. 모든 작업은 코드를 이용해 자동으로 수행했습니다. 이제 이 실습을 여러분의 프로젝트에 맞게 맞춤설정할 수 있습니다.

다음 단계/더 학습하기

이 실습에 나온 코드는 GitHub에서도 확인할 수 있습니다. 이 실습에서는 저장소와 동기화된 상태를 유지합니다. 다음은 이 실습에서 다룬 자료를 자세히 살펴보고 Google 개발자 도구에 프로그래매틱 방식으로 액세스하는 다른 방법을 알아볼 수 있는 추가 리소스입니다.

문서

관련 동영상 및 일반 동영상

관련 및 일반 뉴스와 업데이트

설명서 최종 업데이트: 2025년 7월 28일

실습 최종 테스트: 2025년 7월 28일

Copyright 2026 Google LLC. All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.

시작하기 전에

  1. 실습에서는 정해진 기간 동안 Google Cloud 프로젝트와 리소스를 만듭니다.
  2. 실습에는 시간 제한이 있으며 일시중지 기능이 없습니다. 실습을 종료하면 처음부터 다시 시작해야 합니다.
  3. 화면 왼쪽 상단에서 실습 시작을 클릭하여 시작합니다.

시크릿 브라우징 사용

  1. 실습에 입력한 사용자 이름비밀번호를 복사합니다.
  2. 비공개 모드에서 콘솔 열기를 클릭합니다.

콘솔에 로그인

    실습 사용자 인증 정보를 사용하여
  1. 로그인합니다. 다른 사용자 인증 정보를 사용하면 오류가 발생하거나 요금이 부과될 수 있습니다.
  2. 약관에 동의하고 리소스 복구 페이지를 건너뜁니다.
  3. 실습을 완료했거나 다시 시작하려고 하는 경우가 아니면 실습 종료를 클릭하지 마세요. 이 버튼을 클릭하면 작업 내용이 지워지고 프로젝트가 삭제됩니다.

현재 이 콘텐츠를 이용할 수 없습니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

감사합니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

한 번에 실습 1개만 가능

모든 기존 실습을 종료하고 이 실습을 시작할지 확인하세요.

시크릿 브라우징을 사용하여 실습 실행하기

Using an Incognito or private browser window is the best way to run this lab. This prevents any conflicts between your personal account and the Student account, which may cause extra charges incurred to your personal account.