꼭 봐야하는 데이터를 구글 시트에 입력하여 대시보드를 만드는 경우는 정말 많습니다. 하지만 데이터 대시보드의 경우엔 수치들이 한눈에 잘 들어오지 않는 경우가 대부분이죠. 기업의 경우, 루커나 태블로를 활용하여 시각화 된 대시보드를 만들지만, 개인의 경우엔 그러한 기술을 배우거나 도입하는데에 부담이 많을 수 있습니다.
그러한 상황에 매번 구글 시트를 접속해서 수치를 파악하는데 불편함도 있고, 데이터를 해석하는 데에도 어려움이 있다면, 이 과정을 전부 AI로 자동화 시켜서 슬랙에 리포트 전송하는 프로세스를 만들면 됩니다. 처음에 만드는게 조금 시간이 걸리겠지만, 한 번 만들어두면 모든 과정이 자동화되니 장기적으로 목표 관리도 쉽게 할 수 있고, 시간도 효율적으로 사용하실 수 있을 것입니다.
지금부터 이 프로세스를 세팅하는 방법을 알려드리겠습니다. 이 프로세스는 모두 무료로 세팅이 가능합니다. 총 5단계로 진행되며, 4단계에서 코딩이 조금 들어가기 때문에 가장 어렵지만 제가 만들어 놓은 코드를 공유드릴 예정입니다. 그리고 이 또한 GPT의 도움을 받으면 코드도 모두 작성을 해주기 때문에 테스트를 반복해보면서 진행하면 되겠습니다.
목차
1. 구글 시트에 데이터 입력
2. 슬랙 Webhook URL 만들기
3. Gemini API 발급받기
4. 앱스크립트 작업
5. 슬랙에서 분석 리포트 받기
1. 구글 시트에 데이터 입력
예를 들어, 아래와 같이 소비 금액을 관리하기 위한 데이터를 입력했다면, 이 데이터를 AI에 학습시켜서 분석 리포트를 만들 수 있습니다. 민감한 정보가 담겨있다면 학습이 되지 않도록 데이터를 제거하고 입력해줍니다. 참고로 구글 시트의 데이터만 자동화를 시킬 수 있는 것은 아닙니다. 구글 문서도 가능고, 구글 프레젠테이션도 가능합니다. 반대로 구글 시트, 구글 문서, 구글 프레젠테이션에 데이터를 입력하는 과정을 자동화하는 것도 가능합니다. 이 방법에 대해서도 추후 작성해보겠습니다.
2. 슬랙 Webhook URL 만들기
슬랙 Webhook URL을 만들기 전에 먼저, 메시지를 전송할 슬랙 채널이 있어야합니다.
채널을 정했다면, 아래와 같이 진행해주시면 됩니다.
- https://api.slack.com/apps 에 접속
- [Create New app > From scratch] 클릭
- App Name을 설정하고, Pick a workspace to develop your app in: 에서 연결할 슬랙 공간 선택
- Display Information에서 슬랫봇을 원하는 디자인으로 꾸미기
- Incoming Webhooks에서 Activate Incoming Webhooks을 On으로 켜기
- 아래 Webhook URLs for Your Workspace에서 Add New Webhook을 클릭
- 연결이 되지 않는다면, App Home에서 Your App’s Presence in Slack의 App Display Name의 Edit을 클릭,
- Display Name (Bot Name)과 Default username 모두 설정한 후, Save
- 연결할 채널을 선택한 후, 허용 클릭
- 만들어진 Webhook URL을 Copy
여기까지 진행했다면, 슬랙에 메세지를 보낼 준비는 완료되었습니다. 복사한 Webhook URL은 메모장에 따로 붙여넣어주세요. 다음 단계에서도 복사를 해야합니다.
3. Gemini API 키 발급
GPT API가 아닌 Gemini API를 사용하는 이유는 무료이기 때문이며, 긴 문서의 학습에도 용이하기 때문입니다.
- https://cloud.google.com/?hl=ko 에 접속
- 우측 상단 콘솔 클릭
- 새 프로젝트 클릭
- 프로젝트 이름 입력 후, 만들기 클릭
- Google Cloud 로고 바로 옆 오른쪽 프로젝트 클릭
- https://aistudio.google.com/prompts/new_chat 에 접속
- Get API Key 클릭
- + API 키 만들기 클릭
- 복사 클릭
여기까지 진행했으면, 데이터를 학습시켜서 분석 리포트를 만들어 줄 AI도 준비가 완료되었습니다.
4. 앱스크립트 작업
앱스크립트를 통해 구글 시트 데이터 -> Gemini API를 통해 학습 후, 프롬프트대로 분석 리포트 생성 -> 슬랙에 전송.
이 과정을 전부 자동화 할 수 있습니다. 원하는 날짜, 원하는 시간에 매일 자동으로 발송되게 하는 것도 가능합니다. 그러면 앱스크립트를 작성해보겠습니다. 커스텀을 하기 위해 수정해야할 부분은 아래에 Sheet Name, A1:B2, Gemini API KEY, Slack Webhook URL 부분입니다. Sheet Name에는 시트 이름을, A1:B2에는 학습시킬 범위의 데이터를, Gemini API KEY와 Slack Webhook URL는 위에서 복사해 두었던걸 입력해주면 됩니다.
function sendGeminiConsumPlanToSlack() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet Name");
const rawData = sheet.getRange("A1:B2").getDisplayValues();
Logger.log("📋 rawData: " + JSON.stringify(rawData));
const tableData = convertSheetToStructuredJSON(rawData);
if (!tableData || tableData.length === 0) {
Logger.log("❌ 테이블 데이터가 없음");
return;
}
Logger.log("📊 첫 번째 row 키 목록:", Object.keys(tableData[0]));
const Data = {};
tableData.forEach(row => {
const key = row["구분"];
const value = row["지표"];
if (key && value) Data[key.trim()] = value.trim();
});
Logger.log("🧾 최종 전송용 데이터:", JSON.stringify(assetData, null, 2));
const summary = generateConsumGeminiAnalysis(tableData);
if (!summary || summary.includes("⚠️")) {
Logger.log("❗ Gemini 분석 실패 또는 응답 없음");
return;
}
postToConsumSlackViaWebhook(summary);
}
function generateConsumGeminiAnalysis(Data) {
const apiKey = "Gemini API KEY"; // 👉 여기에 Gemini API 키 입력
const prompt = `
다음은 개인의 소비 계획 현황입니다.
수치를 고려하여 5~6줄 이내로 가독성이 좋게 핵심만 추려서 재무 요약 리포트를 작성해주세요.
아래 기준을 반드시 지켜 요약해 주세요:
1. 수치는 그대로 인용 (예: 99%는 99%라고 명시)
2. '달성' 또는 '초과'라는 표현은 반드시 수치가 100% 이상일 때만 사용
3. 오차나 부족, 미달 여부는 수치를 기준으로 구체적으로 언급
데이터:
${JSON.stringify(Data, null, 2)}
`;
const payload = {
contents: [
{
role: "user",
parts: [{ text: prompt }]
}
]
};
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`;
const response = UrlFetchApp.fetch(url, {
method: "post",
contentType: "application/json",
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
const raw = response.getContentText();
Logger.log("📩 Gemini 응답 원문: " + raw);
try {
const json = JSON.parse(raw);
return json.candidates[0].content.parts[0].text;
} catch (e) {
Logger.log("❌ JSON 파싱 실패: " + raw);
return "⚠️ Gemini 응답 처리에 실패했습니다.";
}
}
function postToConsumSlackViaWebhook(summary) {
const webhookUrl = "Slack Webhook URL"; // 👉 여기에 Webhook URL 입력
const formatted = convertMarkdownToSlack(summary);
const payload = {
text: "*📊 Gemini 분석 리포트*\n\n" + formatted
};
UrlFetchApp.fetch(webhookUrl, {
method: "post",
contentType: "application/json",
payload: JSON.stringify(payload)
});
}
function convertMarkdownToSlack(text) {
return text
.replace(/^## (.*)$/gm, '*$1*') // ## 제목 → *제목*
.replace(/\*\*(.*?)\*\*/g, '*$1*') // **굵게** → *굵게*
.replace(/^(\d+)\. \*\*가설:\*\* (.*)/gm, `• *가설 $1:* $2`) // 번호 가설
.replace(/^(\d+)\. +/gm, `• `); // 일반 번호 리스트 → •
}
function convertSheetToStructuredJSON(data) {
const headers = data[0];
const rows = data.slice(1);
return rows
.filter(row => row.some(cell => cell)) // 빈 행 제외
.map(row => {
const obj = {};
headers.forEach((key, i) => {
if (key && row[i] !== undefined && row[i] !== "") {
obj[key.trim()] = row[i].toString().trim();
}
});
return obj;
});
}
코드 입력이 완료 되었다면, 실행을 시켜줍니다. '트리거' 탭에서 원하는 주기마다 리포트를 받을 수 있게 함수 실행 시간을 설정할 수 있습니다.
5. 슬랙에서 분석 리포트 받기
아래와 같이 분석 리포트가 전송된 걸 확인 됐다면, 자동화 세팅이 모두 끝났습니다!
'기타' 카테고리의 다른 글
구글 시트로 jira 형태의 계획, 목표 관리 시스템 만들기(+구글 캘린더 연동) (0) | 2025.05.22 |
---|---|
엑셀로 살펴보는 n년 후 자산 100억 달성 시뮬레이션 (2) | 2025.05.03 |
Git에서 실수없이 작업하려면?(git status, git diff, git checkout) (0) | 2025.04.05 |
GitHub 리포지토리 생성 시 선택하는 라이선스란? (1) | 2025.01.26 |
.gitignore 이란? (0) | 2025.01.26 |
댓글