구글 스프레드시트와 설문지의 고급 기능을 활용하여 교육 데이터 수집 및 분석 전문가 되기
[강의개요]
구글 스프레드시트와 설문지, 어떤 기능까지 활용해 보셨나요?
편리한 설문 작성 도구인 구글 설문지의 문항별 '응답 확인 기능'을 제대로 알면, 응답자에게 집계자가 원하는 값을 입력하도록 할 수 있습니다.
무료이면서도 가장 널리 쓰이는 구글 스프레드시트의 여러 함수를 따라하기 식으로 쉽게 익혀 봅시다. 또한 데이터 기능을 활용해 나만의 기능을 만들어 활용할 수도 있습니다. 최신의 AI 서비스인 OpenAI의 GPT-4o-mini 및 Google의 Gemini-1.5-flash API를 가져와 내 스프레드시트에 적용해 보세요.
6시간만 따라오시면 여러분도 데이터 수집 및 분석 전문가가 될 수 있습니다.
[강의내용 및 실습자료]
실습을 위해 실습용(사본) 시트 및 완성본 시트를 참고하여 따라해 보세요.
1차시 효율적인 자료 수집을 위한 구글 스프레드시트 활용
[3~5쪽] 협업을 위한 공유 시트 설정 팁
2차시 자료 정리와 가공을 돕는 함수 익히기
3차시 복잡한 작업을 도와주는 데이터 기능 활용
[17쪽] Apps Script - Code.gs (추가)
[19쪽] Apps Script (=GEMINI)
function GEMINI(prompt) { initialPrompt = "다음 명령을 간결하고 정확하게 답변해 주기 바람 : "
const data = { "contents": [{ "parts": [{ "text": initialPrompt + prompt }] }], "generationConfig": { "temperature": 0.2, "topK": 1, "topP": 1, "maxOutputTokens": 2048, "stopSequences": [] } }; const options = { 'method': 'post', 'contentType': 'application/json', 'payload': JSON.stringify(data) }; let response = UrlFetchApp.fetch('https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=' + GEMINI_API_KEY , options);
const payload = JSON.parse(response.getContentText()); const text = payload.candidates[0].content.parts[0].text.trim(); return text;}
[19쪽] =FEEDBACK(GEMINI(...))
[19쪽] Apps Script (=GPT)
function GPT(prompt) { // Get the active spreadsheet and the cell that called this function var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var cell = sheet.getActiveCell(); // Process the prompt to replace cell references with their values prompt = processCellReferences(prompt, sheet, cell); if (!prompt) { return "Error: Please provide a prompt."; } const apiUrl = 'https://api.openai.com/v1/chat/completions'; const payload = { 'model': 'gpt-4o-mini', // or whichever model you're using 'messages': [ {'role': 'system', 'content': 'You are a helpful assistant.'}, {'role': 'user', 'content': prompt} ], 'max_tokens': 1000 }; const options = { 'method': 'post', 'contentType': 'application/json', 'headers': { 'Authorization': 'Bearer ' + OPENAI_API_KEY }, 'payload': JSON.stringify(payload) }; try { const response = UrlFetchApp.fetch(apiUrl, options); const json = JSON.parse(response.getContentText()); return json.choices[0].message.content.trim(); } catch (error) { return "Error: " + error.toString(); }}
function processCellReferences(prompt, sheet, cell) { // Regular expression to match cell references like A1, B2, etc. var cellRefRegex = /\b[A-Z]+\d+\b/g; return prompt.replace(cellRefRegex, function(match) { try { var value = sheet.getRange(match).getValue(); return value.toString(); } catch (e) { // If the cell reference is invalid, return the original match return match; } });}
[19쪽] =FEEDBACK(GPT(...))
4차시 효율적인 자료 수집을 위한 구글 설문지 제작
[23쪽] 휴대전화번호(정규표현식)
^\d{3}-\d{4}-\d{4}$
[23쪽] 2~4자 한글 이름(정규표현식)
^[가-힣]{2,4}$
[23쪽] 초등학교 이름(정규 표현식)
^.*대구.*초등학교$
5차시 설문지에 응답한 내용 확인을 위한 3가지 방법
[26쪽] Step3 수식
'설문지 응답 시트1'!B2:B,
REPLACE('설문지 응답 시트1'!C2:C, 2, LEN('설문지 응답 시트1'!C2:C) - 2, "*"),
'설문지 응답 시트1'!E2:E
}, "SELECT Col1, Col2, Col3 WHERE Col1 IS NOT NULL ORDER BY Col1, Col2 ASC", 0))
[28쪽] Step3 수식
'설문지 응답 시트1'!B2:B,
REPLACE('설문지 응답 시트1'!C2:C, 2, LEN('설문지 응답 시트1'!C2:C) - 2, "*"),
IF('설문지 응답 시트1'!E2:E="시작", "○", ""),
IF('설문지 응답 시트1'!E2:E="종료", "○", "")
}, "SELECT Col1, Col2, MIN(Col3), MAX(Col4) WHERE Col1 IS NOT NULL GROUP BY Col1, Col2 LABEL MIN(Col3) '', MAX(Col4) ''", 0))
[29쪽] Apps Script - Code.gs (기존코드 수정)
function doPost(e) { Logger.log(JSON.stringify(e));
var htmlOutput = HtmlService.createTemplateFromFile('FilterHeaders'); htmlOutput.n_id = e.parameter.n_id; htmlOutput.n_name = e.parameter.n_name; return htmlOutput.evaluate(); }
function getSheetData() { var ss= SpreadsheetApp.getActiveSpreadsheet(); var dataSheet = ss.getSheetByName('설문지 응답 시트1'); var dataRange = dataSheet.getDataRange(); var dataValues = dataRange.getValues(); return dataValues;}
function getUrl() { var url = ScriptApp.getService().getUrl(); return url;}
[29쪽] Apps Script - FilterHeaders.html (추가)
6차시 수집한 데이터의 시각화와 결과 공유를 위한 방법
[32쪽] 데이터2
A2
=FLATTEN({'데이터1'!A4:A13, '데이터1'!A4:A13, '데이터1'!A4:A13})
B2
=FLATTEN(SPLIT(REPT("1반,2반,3반,", COUNTA('데이터1'!A4:A13)), ","))
C2
=FLATTEN({'데이터1'!B4:B13, '데이터1'!C4:C13, '데이터1'!D4:D13})
(실습용 시트에는 값이 바로 입력되어 있음)
[32쪽] 요약 시트(추이)
B5
=AVERAGE(INDEX('데이터1'!$B$4:$D$13, MATCH(B$4, '데이터1'!$A$4:$A$13, 0), 0))
[32쪽] 요약 시트(최다/최소)
B9
=INDEX('데이터2'!$A$2:$A$31,MATCH(D9,'데이터2'!$C$2:$C$31,0),0)
C9
=INDEX('데이터2'!$B$2:$B$31,MATCH(D9,'데이터2'!$C$2:$C$31,0),0)
D9
=MAX('데이터2'!$C$2:$C$31)
D10
=MIN('데이터2'!$C$2:$C$31)
E9
=D9/L5
F9
=IF(E9>1,SPARKLINE(E9,{"charttype","bar";"max",2;"color1", "red"}),SPARKLINE(E9,{"charttype","bar";"max",2;"color1", "blue"}))
[35~36쪽] 확장 프로그램(Looker Studio) 활용