안녕하세요. IT세상 입니다.

이번 글에서는 매일 아침 AI 뉴스를 직접 검색하지 않아도 되도록, 최근 뉴스를 자동으로 모으고 AI가 핵심 내용을 요약해 구글 스프레드시트에 저장하는 자동화를 만들어 보겠습니다.
무료 방법으로도 충분히 만들 수 있습니다. 코드를 복사해 붙여 넣는 무료 방법과 화면에서 작업 블록을 연결하는 유료 방법을 각각 설명하겠습니다.
RSS는 사이트에 새 글이 올라왔을 때 제목, 짧은 설명, 링크를 전달하는 기능입니다. 이번 자동화는 기사 전체를 복사하지 않고 RSS가 제공하는 정보만 사용합니다.
API는 서로 다른 프로그램이 정보를 주고받을 수 있도록 연결해 주는 통로입니다.
API 키는 해당 연결 통로를 사용할 수 있다는 것을 확인하는 비밀번호와 비슷합니다.
ChatGPT Plus를 사용하고 있어도 OpenAI API 사용료가 포함되는 것은 아닙니다. OpenAI 개발자 플랫폼에서 API 결제 설정을 별도로 해야 합니다.
무료 방법에서는 구글 스프레드시트 안에 자동화 코드를 넣습니다.
Google Apps Script는 구글 스프레드시트에 자동 실행 기능을 추가할 수 있는 도구입니다.
화면 왼쪽 위에 ‘AI 뉴스 자동 요약’이라는 파일 이름이 표시됩니다.
신규 사용자는 Google AI Studio가 프로젝트와 API 키를 자동으로 만들어 주는 경우도 있습니다.
계정이나 화면 업데이트에 따라 메뉴 이름과 위치가 조금 다르게 보일 수 있습니다.
다른 사람이 API 키를 사용하면 무료 사용량이 소진되거나 유료 비용이 발생할 수 있습니다.
Google AI Studio의 API Keys 화면에 복사할 수 있는 API 키가 표시됩니다.
Apps Script 편집기에 비어 있는 코드 입력 화면이 표시됩니다.
아래 코드를 처음부터 끝까지 복사해서 Apps Script 편집기에 붙여 넣습니다.
const CONFIG = Object.freeze({
SHEET_NAME: '뉴스요약',
TIMEZONE: 'Asia/Seoul',
RUN_HOUR: 7,
MAX_ITEMS: 5,
MODEL: 'gemini-3.5-flash-lite',
RSS_URL:
'https://news.google.com/rss/search?q=(인공지능%20OR%20ChatGPT%20OR%20생성형AI)%20when:1d&hl=ko&gl=KR&ceid=KR:ko'
});
/**
* 처음 한 번만 실행합니다.
* 시트와 매일 실행 트리거를 만듭니다.
*/
function setupAutomation() {
const sheet = getOrCreateSheet_();
formatSheet_(sheet);
deleteExistingTrigger_();
ScriptApp.newTrigger('runDailyNewsSummary')
.timeBased()
.atHour(CONFIG.RUN_HOUR)
.everyDays(1)
.inTimezone(CONFIG.TIMEZONE)
.create();
SpreadsheetApp.getActiveSpreadsheet().toast(
'뉴스요약 시트와 자동 실행 트리거를 만들었습니다.',
'설정 완료',
5
);
}
/**
* RSS 뉴스 수집 → Gemini 요약 → 시트 저장
*/
function runDailyNewsSummary() {
const sheet = getOrCreateSheet_();
try {
const items = fetchRssItems_(
CONFIG.RSS_URL,
CONFIG.MAX_ITEMS
);
```
if (items.length === 0) {
sheet.appendRow([
new Date(),
'최근 RSS 항목을 찾지 못했습니다.',
'',
'수집 결과 없음'
]);
return;
}
const sourceText = items
.map(function(item, index) {
return (
(index + 1) +
'. 제목: ' +
item.title +
'\n설명: ' +
item.description +
'\n링크: ' +
item.link
);
})
.join('\n\n');
const originalList = items
.map(function(item, index) {
return (
(index + 1) +
'. ' +
item.title +
'\n' +
item.link
);
})
.join('\n\n');
const summary = summarizeWithGemini_(sourceText);
sheet.appendRow([
new Date(),
summary,
originalList,
'완료'
]);
formatLatestRow_(sheet);
```
} catch (error) {
sheet.appendRow([
new Date(),
'',
'',
'오류: ' + error.message
]);
```
throw error;
```
}
}
/**
* Google 뉴스 RSS에서 항목을 가져옵니다.
*/
function fetchRssItems_(url, maxItems) {
const response = UrlFetchApp.fetch(url, {
method: 'get',
muteHttpExceptions: true,
headers: {
'User-Agent': 'Mozilla/5.0'
}
});
const statusCode = response.getResponseCode();
if (statusCode !== 200) {
throw new Error(
'RSS 호출 실패. HTTP 상태 코드: ' +
statusCode
);
}
const xmlText = response.getContentText();
const document = XmlService.parse(xmlText);
const root = document.getRootElement();
const channel = root.getChild('channel');
if (!channel) {
throw new Error(
'RSS에서 channel 항목을 찾지 못했습니다.'
);
}
const rssItems = channel.getChildren('item');
const results = [];
const usedTitles = {};
for (let i = 0; i < rssItems.length; i++) {
const item = rssItems[i];
const title = getChildText_(item, 'title').trim();
```
if (!title || usedTitles[title]) {
continue;
}
usedTitles[title] = true;
results.push({
title: title,
link: getChildText_(item, 'link').trim(),
description: stripHtml_(
getChildText_(item, 'description')
)
});
if (results.length >= maxItems) {
break;
}
```
}
return results;
}
/**
* Gemini API로 뉴스 목록을 요약합니다.
*/
function summarizeWithGemini_(newsText) {
const apiKey = PropertiesService
.getScriptProperties()
.getProperty('GEMINI_API_KEY');
if (!apiKey) {
throw new Error(
'GEMINI_API_KEY가 없습니다. ' +
'스크립트 속성을 확인하세요.'
);
}
const prompt =
'너는 초보자를 위한 AI 뉴스 편집자다.\n' +
'아래 RSS 기사 정보만 사용해 한국어로 요약하라.\n\n' +
'[작성 규칙]\n' +
'1. 기사 정보에 없는 사실은 추측하지 않는다.\n' +
'2. 같은 사건을 다룬 기사는 하나로 묶는다.\n' +
'3. 어려운 전문용어는 쉬운 말로 설명한다.\n' +
'4. 광고성 표현과 과장된 표현을 사용하지 않는다.\n' +
'5. 제공되지 않은 링크를 새로 만들지 않는다.\n\n' +
'[출력 형식]\n' +
'오늘의 한눈 요약\n' +
'- 전체 흐름을 3문장으로 작성\n\n' +
'주요 뉴스\n' +
'1. 뉴스 제목\n' +
'- 핵심 내용 2문장\n' +
'- 왜 중요한지 1문장\n\n' +
'오늘의 관찰 포인트\n' +
'- 앞으로 확인할 내용 2개\n\n' +
'[RSS 기사 목록]\n' +
newsText;
const apiUrl =
'https://generativelanguage.googleapis.com/' +
'v1beta/models/' +
CONFIG.MODEL +
':generateContent';
const payload = {
contents: [
{
role: 'user',
parts: [
{
text: prompt
}
]
}
],
generationConfig: {
maxOutputTokens: 1200
}
};
const response = UrlFetchApp.fetch(apiUrl, {
method: 'post',
contentType: 'application/json',
headers: {
'x-goog-api-key': apiKey
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
const statusCode = response.getResponseCode();
const responseText = response.getContentText();
if (statusCode !== 200) {
throw new Error(
'Gemini API 오류 ' +
statusCode +
': ' +
responseText.substring(0, 500)
);
}
const data = JSON.parse(responseText);
if (
!data.candidates ||
!data.candidates[0] ||
!data.candidates[0].content ||
!data.candidates[0].content.parts
) {
throw new Error(
'Gemini 응답에서 요약 내용을 찾지 못했습니다.'
);
}
const summary = data.candidates[0]
.content
.parts
.map(function(part) {
return part.text || '';
})
.join('\n')
.trim();
if (!summary) {
throw new Error(
'Gemini가 빈 내용을 반환했습니다.'
);
}
return summary;
}
function getOrCreateSheet_() {
const spreadsheet =
SpreadsheetApp.getActiveSpreadsheet();
let sheet =
spreadsheet.getSheetByName(
CONFIG.SHEET_NAME
);
if (!sheet) {
sheet =
spreadsheet.insertSheet(
CONFIG.SHEET_NAME
);
}
if (sheet.getLastRow() === 0) {
sheet.appendRow([
'수집일시',
'AI 요약',
'원문 목록',
'상태'
]);
}
return sheet;
}
function formatSheet_(sheet) {
sheet.setFrozenRows(1);
sheet
.getRange(1, 1, 1, 4)
.setFontWeight('bold')
.setBackground('#dbeafe');
sheet.setColumnWidth(1, 150);
sheet.setColumnWidth(2, 500);
sheet.setColumnWidth(3, 420);
sheet.setColumnWidth(4, 180);
sheet
.getRange(
1,
1,
sheet.getMaxRows(),
4
)
.setVerticalAlignment('top')
.setWrap(true);
sheet
.getRange('A:A')
.setNumberFormat('yyyy-mm-dd hh:mm');
}
function formatLatestRow_(sheet) {
const lastRow = sheet.getLastRow();
sheet
.getRange(lastRow, 1, 1, 4)
.setVerticalAlignment('top')
.setWrap(true);
}
function getChildText_(element, childName) {
const child = element.getChild(childName);
return child ? child.getText() : '';
}
function stripHtml_(html) {
return String(html || '')
.replace(/<[^>]*>/g, ' ')
.replace(/ /g, ' ')
.replace(/&/g, '&')
.replace(/\s+/g, ' ')
.trim();
}
function deleteExistingTrigger_() {
const triggers =
ScriptApp.getProjectTriggers();
triggers.forEach(function(trigger) {
if (
trigger.getHandlerFunction() ===
'runDailyNewsSummary'
) {
ScriptApp.deleteTrigger(trigger);
}
});
}
코드를 붙여 넣은 뒤 위쪽의 디스크 모양 저장 버튼을 클릭합니다.
코드 편집기 위쪽에 빨간 오류 표시 없이 프로젝트가 저장됩니다.
스크립트 속성 목록에 ‘GEMINI_API_KEY’가 표시됩니다.
본인이 직접 만든 Apps Script 프로젝트는 첫 실행 때 확인되지 않은 앱과 관련된 안내가 나타날 수 있습니다.
코드 내용을 직접 확인하고 본인이 만든 프로젝트인 경우에만 계속 진행하세요.
구글 스프레드시트 아래쪽에 ‘뉴스요약’이라는 새 시트가 생깁니다.
두 번째 줄에 실행 시간, AI 뉴스 요약, 기사 목록, ‘완료’ 상태가 표시됩니다.
Apps Script 시간 기반 트리거는 서버 부하를 분산하기 위해 설정된 시간대 안에서 조금 늦게 실행될 수 있습니다.
트리거 목록에 runDailyNewsSummary가 한 개 표시됩니다. 이제 컴퓨터를 꺼도 구글 서버에서 자동화가 실행됩니다.
오전 7시로 설정해도 매일 정확히 오전 7시 정각에 실행된다고 보장할 수는 없습니다.
이 자동화는 RSS에 포함된 제목과 짧은 설명을 기준으로 요약합니다.
기사 전체를 읽는 방식보다 세부 내용이 부족할 수 있습니다.
Google 뉴스 RSS 구조나 검색 주소가 바뀌면 뉴스가 수집되지 않을 수 있습니다.
Gemini API 무료 티어의 요청 한도는 모델과 프로젝트 상태에 따라 달라질 수 있습니다.
하루 한 번 실행하는 이번 자동화는 사용량이 많지 않지만, Google AI Studio의 사용량 화면을 가끔 확인하는 것이 좋습니다.
Gemini 무료 티어로 전송한 데이터는 Google 제품 개선에 사용될 수 있습니다.
고객 정보, 회사 내부 자료, 주민등록번호, 전화번호 같은 민감한 정보는 입력하지 마세요.
서비스 한도와 정책은 변경될 수 있습니다.
코드를 직접 관리하기 어렵다면 Make를 이용하는 방법이 더 편할 수 있습니다.
Make에서는 자동화 과정에 들어가는 각각의 작업 블록을 모듈이라고 부릅니다.
Make 무료 요금제도 월 1,000크레딧을 제공하므로 이번 자동화 한 개는 무료로 시험해 볼 수 있습니다.
다만 유료 방법에서는 분 단위 일정 설정, 더 많은 활성 시나리오, 넉넉한 크레딧을 사용할 수 있는 Make Core를 기준으로 설명합니다.
수집일시 | AI 요약 | 원문 목록 | 상태
A1부터 D1까지 수집일시, AI 요약, 원문 목록, 상태가 표시됩니다.
시나리오는 자동화 작업 전체의 처리 순서를 의미합니다.
앱과 서비스를 검색할 수 있는 모듈 선택 창이 표시됩니다.
https://news.google.com/rss/search?q=(인공지능%20OR%20ChatGPT%20OR%20생성형AI)%20when:1d&hl=ko&gl=KR&ceid=KR:ko
첫 실행 때 시작 위치를 묻는 화면이 나오면 기존 뉴스 항목을 불러올 수 있는 옵션을 선택합니다.
시나리오 화면에 RSS 모듈 하나가 표시됩니다.
제목: {{RSS 모듈의 Title 값}}
설명: {{RSS 모듈의 Description 값}}
링크: {{RSS 모듈의 URL 또는 Link 값}}
중괄호 안의 값은 직접 입력하지 말고 Make 오른쪽에 표시되는 RSS 출력값을 클릭해서 넣습니다.
RSS 모듈 오른쪽에 Text Aggregator 모듈이 연결됩니다.
비밀 키의 전체 값은 다시 표시되지 않을 수 있습니다.
OpenAI 플랫폼에 새 API 키가 생성되고 API를 사용할 준비가 됩니다.
너는 초보자를 위한 AI 뉴스 편집자다.
아래 RSS 기사 정보만 사용해서 한국어로 요약하라.
작성 규칙:
1. 기사에 없는 사실은 추측하지 않는다.
2. 같은 사건을 다룬 기사는 하나로 묶는다.
3. 어려운 전문용어는 쉬운 말로 설명한다.
4. 과장하거나 투자 판단을 유도하지 않는다.
5. 제공되지 않은 링크를 새로 만들지 않는다.
출력 형식:
오늘의 한눈 요약
* 전체 흐름을 3문장으로 작성
주요 뉴스
1. 뉴스 제목
* 핵심 내용 2문장
* 왜 중요한지 1문장
오늘의 관찰 포인트
* 앞으로 확인할 내용 2개
RSS 기사 목록:
{{Text Aggregator의 합쳐진 텍스트}}
Text Aggregator 오른쪽에 OpenAI 모듈이 연결되고 모델과 프롬프트가 저장됩니다.
| 시트 열 | 연결할 값 |
|---|---|
| 수집일시 | Make의 현재 날짜와 시간 값 |
| AI 요약 | OpenAI 모듈의 응답 텍스트 |
| 원문 목록 | Text Aggregator의 합쳐진 텍스트 |
| 상태 | 완료 |
RSS, Text Aggregator, OpenAI, Google Sheets 모듈 네 개가 순서대로 연결됩니다.
구글 시트에 실행 시간, OpenAI 뉴스 요약, 기사 목록, 완료 상태가 한 줄로 저장됩니다.
시나리오가 활성화되고 다음 실행 예정 시간이 표시됩니다.
하루에 입력 5,000토큰, 출력 1,000토큰을 사용하고 한 달 동안 30회 실행한다고 가정하면 OpenAI API 비용은 약 0.02달러입니다.
실제 비용은 기사 길이, 출력 길이, 재실행 횟수, 선택 모델에 따라 달라집니다.
이번 자동화의 월 예상 비용은 Make Core 9달러와 소액의 OpenAI API 사용료입니다.
환율, 부가세, 결제 주기에 따라 최종 결제 금액이 달라질 수 있으므로 결제 화면에서 다시 확인하세요.
| 비교 항목 | 무료 방법 | 유료 방법 |
|---|---|---|
| 사용 도구 | Google Sheets, Apps Script, Gemini API | Make Core, OpenAI API, Google Sheets |
| 초기 비용 | 0원 | Make와 OpenAI 결제 설정 필요 |
| 월 예상 비용 | 무료 한도 안에서는 0원 | 약 9달러 이상 |
| 설정 난이도 | 중간, 코드 복사 필요 | 쉬움, 화면에서 모듈 연결 |
| 예상 설정 시간 | 약 30~50분 | 약 20~30분 |
| 자동 실행 범위 | 개인용 하루 1회 자동화 | 여러 시나리오와 업무 자동화로 확장 가능 |
| 사용량 제한 | Apps Script와 Gemini 무료 한도 | Make 크레딧과 OpenAI API 사용량 |
| 유지관리 | 코드와 실행 기록 확인 필요 | 모듈별 실행 결과를 화면에서 확인 |
| 팀 사용 | 개인 실습에 적합 | 여러 자동화를 운영할 때 유리 |
| 추천 대상 | 비용 없이 자동화를 배우고 싶은 사람 | 코드 없이 편리하게 운영하고 싶은 사람 |
원인: 스크립트 속성 이름이나 API 키 값이 잘못 입력된 경우입니다.
해결 방법:
원인: API 키가 잘못되었거나 사용할 수 없는 키일 수 있습니다.
해결 방법:
원인: 모델 이름이 변경되었거나 계정에서 사용할 수 없는 경우입니다.
해결 방법:
원인: RSS 주소가 변경되었거나 일시적인 접속 문제가 발생한 경우입니다.
해결 방법:
원인: 최근 24시간 뉴스 중 이전에 수집한 뉴스가 다시 포함될 수 있습니다.
해결 방법: 현재 자동화는 매일 전체 요약을 한 줄로 저장하는 방식이므로 일부 중복은 정상입니다.
원인: 시간 기반 트리거는 설정한 시간대 안에서 실행 시각이 달라질 수 있습니다.
해결 방법:
원인: OpenAI API 결제가 설정되지 않았거나 API 키가 잘못된 경우입니다.
해결 방법:
원인: RSS와 OpenAI 사이에 Text Aggregator가 없는 경우입니다.
해결 방법: RSS 다음에 Text Aggregator를 추가하고 뉴스 여러 개를 하나의 텍스트로 합친 뒤 OpenAI로 보내세요.
원인: Google Sheets 모듈에 OpenAI 응답값을 연결하지 않은 경우입니다.
해결 방법:
AI가 기사 제목이나 짧은 설명을 잘못 해석할 수 있습니다. 투자, 의료, 법률, 회사 업무와 관련된 뉴스는 반드시 원문을 다시 확인하세요.
Gemini API 무료 티어와 개인 구글 계정의 Apps Script 한도 안에서 사용하면 월 결제 없이 운영할 수 있습니다.
아닙니다. Apps Script와 Make 모두 클라우드 서버에서 실행됩니다.
가능합니다. RSS 주소의 검색어를 반도체, HBM, 삼성전자, SK하이닉스 등으로 변경하면 됩니다.
가능합니다. Apps Script에서는 트리거를 추가하고 Make에서는 실행 일정을 변경하면 됩니다.
가능합니다. 무료 방법은 Gmail 발송 코드를 추가할 수 있고, Make에서는 Gmail 모듈을 추가할 수 있습니다.
가능합니다. 영어 RSS를 사용하더라도 프롬프트에서 한국어로 작성하라고 지시하면 됩니다.
아닙니다. ChatGPT 구독과 OpenAI API 결제는 서로 별도입니다.
가능합니다. Make 무료 요금제는 월 1,000크레딧을 제공하므로 이번 자동화 한 개를 시험하기에는 충분할 수 있습니다.
자동화를 처음 배우는 단계라면 무료 방법부터 시작하는 것을 추천합니다. 코드가 어렵거나 여러 자동화를 운영할 계획이라면 유료 방법이 더 편합니다.
이번 글에서는 최근 AI 뉴스를 자동으로 수집하고, AI가 핵심 내용을 정리해 구글 스프레드시트에 저장하는 자동화를 만들었습니다.
처음에는 API 키, RSS, 트리거 같은 단어가 어렵게 느껴질 수 있습니다. 하지만 실제 작업은 키를 만들고, 코드를 붙여 넣고, 실행 버튼을 누르는 순서로 진행됩니다.
비용 없이 자동화를 경험하고 싶다면 Apps Script와 Gemini 방법부터 시작하세요.
코드를 직접 관리하는 것이 부담스럽거나 앞으로 이메일, Notion, Slack 같은 서비스까지 연결하고 싶다면 Make와 OpenAI API 방법이 더 편리합니다.
RSS로 뉴스를 모으고 AI로 요약한 뒤 구글 시트에 저장하면 매일 반복하던 뉴스 검색 시간을 줄일 수 있습니다.
| 회의록 AI 자동 요약 방법|구글 드라이브에 넣으면 할 일까지 정리 (0) | 2026.07.28 |
|---|---|
| 구글 캘린더 AI 자동화|문장만 입력하면 일정 자동 등록 (0) | 2026.07.27 |
| 구글 폼 AI 자동화 방법|설문 응답 요약하고 이메일로 받기 (0) | 2026.07.26 |
| Gmail 메일 AI 자동 분류 방법|중요·업무·광고 라벨 자동 정리 (0) | 2026.07.26 |