
구글 시트에 상품명, 특징과 타깃 고객을 입력하면 AI가 SEO 제목, 한 줄 요약, 상세 설명, 핵심 장점, 검색 키워드와 SNS 홍보 문구를 자동으로 생성합니다.

안녕하세요.
IT세상입니다. 😊
온라인 쇼핑몰에 상품을 등록하려면 생각보다 많은 문구가 필요합니다.
상품명만 입력하는 것으로 끝나지 않습니다. 검색에 노출될 제목, 짧은 소개, 상세페이지 설명, 핵심 장점, 검색 키워드와 SNS 홍보 문구까지 각각 작성해야 합니다.
상품이 한두 개라면 직접 작성할 수 있습니다. 하지만 비슷한 상품을 계속 등록해야 한다면 문구를 작성하는 데 많은 시간이 들어갑니다.
이번 글에서는 구글 시트 상품 설명 AI 자동 생성 기능을 만들어 보겠습니다. 상품 정보 한 줄을 입력하면 필요한 문구가 각각의 열에 자동으로 정리됩니다.
상품 설명을 AI에게 단순히 “잘 써줘”라고 요청하면 문제가 생길 수 있습니다.
입력하지 않은 할인율이나 배송 조건을 임의로 넣거나, 확인되지 않은 인증과 성능을 사실처럼 표현할 수 있기 때문입니다.
특히 건강용품, 식품, 화장품과 전자제품은 과장된 효능이나 안전성 표현을 사용하면 안 됩니다.
이번 자동화는 상품 설명을 빠르게 만드는 것만 목표로 하지 않습니다.
상품 정보에 입력된 사실만 사용하고, 금지할 표현을 따로 지정하며, 생성된 결과는 반드시 사람이 검토하도록 구성했습니다.
AI는 실제 재고, 배송일, 인증서, 시험 성적서와 판매 정책을 확인하지 못합니다. 가격, 효과, 보증과 안전 관련 내용은 담당자가 원본 자료와 비교해야 합니다.
자동화가 완성되면 다음과 같이 작동합니다.
| 항목 | 입력하거나 생성되는 내용 |
|---|---|
| 상품코드 | 상품을 구분하는 내부 코드 |
| 상품명 | 판매할 실제 상품 이름 |
| 카테고리 | 컴퓨터 주변기기, 생활용품 등의 분류 |
| 핵심특징 | 재질, 크기, 연결 방식, 구성 등 확인된 사실 |
| 타깃고객 | 이 상품이 필요한 주요 사용자 |
| 가격·판매조건 | 실제 판매가격과 확인된 판매 조건 |
| 필수포함문구 | 반드시 문구에 포함해야 할 특징 |
| 금지문구 | 최저가, 완벽한 등 사용하면 안 되는 표현 |
| 브랜드톤 | 친근함, 전문적, 차분함 등의 문장 분위기 |
| SEO제목 | 검색용 상품 제목 |
| 상세설명 | 상세페이지에 활용할 3~5개 짧은 문단 |
| 검색키워드 | 상품과 직접 관련된 검색어 |
| SNS문구 | 인스타그램이나 홍보 게시물용 문장 |
| 검토상태 | 검토 필요, 승인, 수정 필요 |
스프레드시트 왼쪽 위에 ‘AI 상품 설명 자동 생성’이라는 이름이 표시됩니다.
아래 코드를 처음부터 끝까지 복사해 Apps Script 편집기에 붙여 넣습니다.
const CONFIG = Object.freeze({
MODEL: 'gemini-3.5-flash-lite',
SHEET_NAME: '상품문구',
SPREADSHEET_ID_KEY: 'PRODUCT_COPY_SPREADSHEET_ID',
API_KEY: 'GEMINI_API_KEY',
MAX_ROWS_PER_RUN: 10,
TRIGGER_MINUTES: 15,
COLUMNS: Object.freeze({
createdAt: 1,
productCode: 2,
productName: 3,
category: 4,
features: 5,
target: 6,
priceCondition: 7,
requiredText: 8,
prohibitedText: 9,
brandTone: 10,
seoTitle: 11,
shortSummary: 12,
detailDescription: 13,
keyBenefits: 14,
keywords: 15,
socialCaption: 16,
hashtags: 17,
cautionText: 18,
processStatus: 19,
reviewStatus: 20,
generatedAt: 21,
errorMessage: 22
})
});
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('상품 문구 자동화')
.addItem('초기 설정', 'setupProductCopyAutomation')
.addItem('지금 생성하기', 'generateProductCopyRows')
.addToUi();
}
function setupProductCopyAutomation() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const properties = PropertiesService.getScriptProperties();
properties.setProperty(
CONFIG.SPREADSHEET_ID_KEY,
spreadsheet.getId()
);
let sheet = spreadsheet.getSheetByName(CONFIG.SHEET_NAME);
if (!sheet) {
sheet = spreadsheet.insertSheet(CONFIG.SHEET_NAME);
}
const headers = [
'등록시간',
'상품코드',
'상품명',
'카테고리',
'핵심특징',
'타깃고객',
'가격·판매조건',
'필수포함문구',
'금지문구',
'브랜드톤',
'SEO제목',
'한줄요약',
'상세설명',
'핵심장점',
'검색키워드',
'SNS문구',
'해시태그',
'주의사항',
'처리상태',
'검토상태',
'생성시간',
'오류내용'
];
sheet
.getRange(1, 1, 1, headers.length)
.setValues([headers])
.setFontWeight('bold')
.setBackground('#dbeafe');
sheet.setFrozenRows(1);
sheet.getRange('A:A').setNumberFormat('yyyy-mm-dd hh:mm');
sheet.getRange('U:U').setNumberFormat('yyyy-mm-dd hh:mm');
const widths = [
145, 110, 190, 120, 360, 220, 180, 260, 240, 120,
280, 320, 520, 360, 300, 420, 300, 320, 100, 110, 145, 320
];
widths.forEach(function(width, index) {
sheet.setColumnWidth(index + 1, width);
});
const processValidation = SpreadsheetApp
.newDataValidation()
.requireValueInList(['대기', '완료', '오류'], true)
.setAllowInvalid(false)
.build();
const reviewValidation = SpreadsheetApp
.newDataValidation()
.requireValueInList(['검토 필요', '승인', '수정 필요'], true)
.setAllowInvalid(false)
.build();
sheet
.getRange(
2,
CONFIG.COLUMNS.processStatus,
Math.max(sheet.getMaxRows() - 1, 1),
1
)
.setDataValidation(processValidation);
sheet
.getRange(
2,
CONFIG.COLUMNS.reviewStatus,
Math.max(sheet.getMaxRows() - 1, 1),
1
)
.setDataValidation(reviewValidation);
if (sheet.getLastRow() === 1) {
sheet
.getRange(2, 1, 2, headers.length)
.setValues([
[
new Date(),
'P-001',
'무선 저소음 키보드',
'컴퓨터 주변기기',
'저소음 키, 블루투스 연결, 최대 3대 기기 전환, 충전식 배터리',
'사무실과 집에서 조용한 키보드를 원하는 직장인과 학생',
'판매가 49,000원, 배송비 조건은 판매 페이지에서 별도 확인',
'3대 기기 전환 기능을 반드시 언급',
'완벽한, 업계 1위, 무조건, 최저가',
'친근하고 전문적인 설명',
'', '', '', '', '', '', '', '',
'대기',
'검토 필요',
'',
''
],
[
new Date(),
'P-002',
'스테인리스 보온 텀블러',
'생활용품',
'500mL, 이중벽 구조, 밀폐형 뚜껑, 손세척 권장',
'출퇴근과 야외 활동에서 음료를 휴대하는 사용자',
'판매가 28,000원',
'용량 500mL와 손세척 권장을 포함',
'절대 새지 않음, 24시간 보온 보장, 의료 효과',
'깔끔하고 신뢰감 있는 설명',
'', '', '', '', '', '', '', '',
'대기',
'검토 필요',
'',
''
]
]);
}
sheet
.getRange(1, 1, sheet.getMaxRows(), headers.length)
.setVerticalAlignment('top')
.setWrap(true);
applyConditionalFormatting_(sheet);
deleteExistingTrigger_();
ScriptApp
.newTrigger('generateProductCopyRows')
.timeBased()
.everyMinutes(CONFIG.TRIGGER_MINUTES)
.create();
spreadsheet.toast(
'상품문구 시트와 15분 자동 실행 설정을 만들었습니다.',
'설정 완료',
6
);
}
function generateProductCopyRows() {
const lock = LockService.getScriptLock();
if (!lock.tryLock(10000)) {
return;
}
try {
const sheet = getProductCopySheet_();
const lastRow = sheet.getLastRow();
if (lastRow < 2) {
return;
}
const rowCount = lastRow - 1;
const data = sheet
.getRange(2, 1, rowCount, 22)
.getValues();
let processed = 0;
for (let index = 0; index < data.length; index += 1) {
if (processed >= CONFIG.MAX_ROWS_PER_RUN) {
break;
}
const row = data[index];
const rowNumber = index + 2;
const productName = String(row[2] || '').trim();
const features = String(row[4] || '').trim();
const status = String(row[18] || '').trim();
if (!productName || !features || status === '완료') {
continue;
}
processed += 1;
try {
const product = {
productCode: String(row[1] || '').trim(),
productName: productName,
category: String(row[3] || '확인 필요').trim(),
features: features,
target: String(row[5] || '확인 필요').trim(),
priceCondition: String(row[6] || '').trim(),
requiredText: String(row[7] || '').trim(),
prohibitedText: String(row[8] || '').trim(),
brandTone: String(
row[9] || '자연스럽고 신뢰감 있는 설명'
).trim()
};
const result = generateCopyWithGemini_(product);
sheet
.getRange(rowNumber, 11, 1, 12)
.setValues([
[
result.seoTitle,
result.shortSummary,
result.detailDescription,
result.keyBenefits.join('\n'),
result.keywords.join(', '),
result.socialCaption,
result.hashtags.join(' '),
result.cautionText.join('\n'),
'완료',
'검토 필요',
new Date(),
''
]
]);
} catch (error) {
sheet
.getRange(rowNumber, 19, 1, 4)
.setValues([
[
'오류',
'수정 필요',
new Date(),
String(error.message || error).substring(0, 1200)
]
]);
}
}
} finally {
lock.releaseLock();
}
}
function generateCopyWithGemini_(product) {
const apiKey = PropertiesService
.getScriptProperties()
.getProperty(CONFIG.API_KEY);
if (!apiKey) {
throw new Error(
'GEMINI_API_KEY가 없습니다. 프로젝트 설정의 스크립트 속성을 확인하세요.'
);
}
const prompt = [
'너는 온라인 판매용 상품 문구를 작성하는 콘텐츠 담당자다.',
'',
'[가장 중요한 규칙]',
'입력된 상품 정보에 있는 사실만 사용한다.',
'가격, 할인율, 배송, 재고, 인증, 수상, 원산지, 보증기간, 성능, 효과를 임의로 만들지 않는다.',
'의료·건강 효과와 안전성을 단정하지 않는다.',
'비교 대상이나 근거가 없으면 최고, 1위, 유일, 완벽, 무조건 같은 표현을 사용하지 않는다.',
'금지문구에 포함된 표현은 출력하지 않는다.',
'확인되지 않는 내용은 빼고, 필요한 경우 주의사항에 담당자 확인이 필요하다고 적는다.',
'',
'[작성 규칙]',
'1. SEO제목은 상품명과 핵심 특징을 앞부분에 넣고 55자 이내로 작성한다.',
'2. 한줄요약은 80자 이내로 작성한다.',
'3. 상세설명은 짧은 문단 3~5개로 작성하고 줄바꿈을 사용한다.',
'4. 핵심장점은 입력 정보에서 확인되는 내용으로 4개 작성한다.',
'5. 검색키워드는 과도하게 반복하지 말고 6~10개 작성한다.',
'6. SNS문구는 과장 없이 250자 이내로 작성한다.',
'7. 해시태그는 # 기호를 포함해 6~10개 작성한다.',
'8. 주의사항에는 사용자가 확인해야 할 판매 조건이나 누락 정보를 작성한다.',
'9. 필수포함문구가 있으면 사실 범위 안에서 자연스럽게 반영한다.',
'10. 브랜드톤을 문장 분위기에 반영한다.',
'',
'[상품 정보]',
JSON.stringify(product)
].join('\n');
const responseSchema = {
type: 'object',
additionalProperties: false,
properties: {
seo_title: {
type: 'string',
description: '55자 이내의 검색용 상품 제목'
},
short_summary: {
type: 'string',
description: '80자 이내의 한 줄 상품 요약'
},
detail_description: {
type: 'string',
description: '줄바꿈이 포함된 3~5개 짧은 문단의 상세 설명'
},
key_benefits: {
type: 'array',
minItems: 4,
maxItems: 4,
items: {
type: 'string'
}
},
keywords: {
type: 'array',
minItems: 6,
maxItems: 10,
items: {
type: 'string'
}
},
social_caption: {
type: 'string',
description: '250자 이내의 SNS 홍보 문구'
},
hashtags: {
type: 'array',
minItems: 6,
maxItems: 10,
items: {
type: 'string'
}
},
caution_text: {
type: 'array',
minItems: 1,
maxItems: 5,
items: {
type: 'string'
}
}
},
required: [
'seo_title',
'short_summary',
'detail_description',
'key_benefits',
'keywords',
'social_caption',
'hashtags',
'caution_text'
]
};
const url =
'https://generativelanguage.googleapis.com/' +
'v1beta/models/' +
CONFIG.MODEL +
':generateContent';
const payload = {
contents: [
{
role: 'user',
parts: [
{
text: prompt
}
]
}
],
generationConfig: {
maxOutputTokens: 1600,
responseFormat: {
text: {
mimeType: 'application/json',
schema: responseSchema
}
}
}
};
const response = UrlFetchApp.fetch(url, {
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, 700)
);
}
const data = JSON.parse(responseText);
const parts =
data.candidates &&
data.candidates[0] &&
data.candidates[0].content &&
data.candidates[0].content.parts;
if (!parts || parts.length === 0) {
throw new Error(
'Gemini 응답에서 상품 문구를 찾지 못했습니다.'
);
}
const rawResult = parts
.map(function(part) {
return part.text || '';
})
.join('')
.trim();
const parsed = JSON.parse(removeCodeFence_(rawResult));
return {
seoTitle: limitText_(parsed.seo_title, 55),
shortSummary: limitText_(parsed.short_summary, 80),
detailDescription:
String(parsed.detail_description || '').trim(),
keyBenefits:
normalizeArray_(parsed.key_benefits, 4),
keywords:
normalizeArray_(parsed.keywords, 10),
socialCaption:
limitText_(parsed.social_caption, 250),
hashtags:
normalizeHashtags_(parsed.hashtags, 10),
cautionText:
normalizeArray_(parsed.caution_text, 5)
};
}
function applyConditionalFormatting_(sheet) {
const dataRange = sheet.getRange('K2:V');
const rules = [
SpreadsheetApp
.newConditionalFormatRule()
.whenFormulaSatisfied('=$S2="완료"')
.setBackground('#f0fdf4')
.setRanges([dataRange])
.build(),
SpreadsheetApp
.newConditionalFormatRule()
.whenFormulaSatisfied('=$S2="오류"')
.setBackground('#fef2f2')
.setRanges([dataRange])
.build(),
SpreadsheetApp
.newConditionalFormatRule()
.whenFormulaSatisfied('=$T2="승인"')
.setBackground('#dcfce7')
.setRanges([dataRange])
.build()
];
sheet.setConditionalFormatRules(rules);
}
function getProductCopySheet_() {
const spreadsheetId = PropertiesService
.getScriptProperties()
.getProperty(CONFIG.SPREADSHEET_ID_KEY);
if (!spreadsheetId) {
throw new Error(
'setupProductCopyAutomation을 먼저 실행하세요.'
);
}
const spreadsheet =
SpreadsheetApp.openById(spreadsheetId);
const sheet =
spreadsheet.getSheetByName(CONFIG.SHEET_NAME);
if (!sheet) {
throw new Error('상품문구 시트를 찾지 못했습니다.');
}
return sheet;
}
function normalizeArray_(value, maxItems) {
if (!Array.isArray(value)) {
return [];
}
return value
.map(function(item) {
return String(item || '').trim();
})
.filter(function(item) {
return item !== '';
})
.slice(0, maxItems);
}
function normalizeHashtags_(value, maxItems) {
return normalizeArray_(value, maxItems)
.map(function(item) {
const cleaned = item
.replace(/^#+/, '')
.replace(/\s+/g, '');
return cleaned
? '#' + cleaned
: '';
})
.filter(function(item) {
return item !== '';
});
}
function limitText_(value, maxLength) {
const text = String(value || '').trim();
return text.length > maxLength
? text.substring(0, maxLength).trim()
: text;
}
function removeCodeFence_(text) {
return String(text || '')
.replace(/^```json/i, '')
.replace(/^```/i, '')
.replace(/```$/i, '')
.trim();
}
function deleteExistingTrigger_() {
ScriptApp
.getProjectTriggers()
.forEach(function(trigger) {
if (
trigger.getHandlerFunction() ===
'generateProductCopyRows'
) {
ScriptApp.deleteTrigger(trigger);
}
});
}
function testProductCopyAutomation() {
generateProductCopyRows();
}
코드를 붙여 넣은 뒤 위쪽의 디스크 모양 저장 버튼을 클릭합니다.
API 키를 블로그 본문이나 캡처 화면에 노출하면 다른 사람이 사용할 수 있습니다. 반드시 Apps Script의 스크립트 속성에 저장하세요.
상품문구 시트와 시험용 상품 2개가 만들어집니다. 트리거에는 generateProductCopyRows 함수가 15분 간격으로 등록됩니다.
초기 설정을 실행하면 다음 두 가지 예시 상품이 입력됩니다.
| 상품 | 핵심 특징 | 금지 문구 |
|---|---|---|
| 무선 저소음 키보드 | 저소음 키, 블루투스, 3대 기기 전환 | 완벽한, 업계 1위, 무조건, 최저가 |
| 스테인리스 보온 텀블러 | 500mL, 이중벽, 밀폐형 뚜껑 | 절대 새지 않음, 24시간 보온 보장, 의료 효과 |
SEO제목, 한줄요약, 상세설명, 핵심장점, 검색키워드, SNS문구와 해시태그가 입력되고 처리상태가 완료로 변경됩니다.
AI 결과가 생성되면 검토상태는 자동으로 검토 필요가 됩니다.
다음 항목을 확인한 뒤 문제가 없을 때만 승인으로 변경하세요.
“좋은 키보드”처럼 추상적으로 적기보다 “저소음 키, 블루투스 연결, 최대 3대 기기 전환”처럼 사실을 구체적으로 입력해야 더 정확한 문구가 나옵니다.
Apps Script 코드를 관리하기 어렵다면 Make에서 Google Sheets와 OpenAI를 연결할 수 있습니다.
입력된 상품 정보에 있는 사실만 사용해 판매용 문구를 작성하세요.
가격, 할인율, 배송, 인증, 수상, 원산지, 보증기간과 효과를 임의로 만들지 마세요.
금지문구는 사용하지 마세요.
확인되지 않는 내용은 출력하지 마세요.
JSON으로만 출력하세요.
필요한 항목:
seo_title
short_summary
detail_description
key_benefits
keywords
social_caption
hashtags
caution_text
상품명:
{{상품명}}
카테고리:
{{카테고리}}
핵심특징:
{{핵심특징}}
타깃고객:
{{타깃고객}}
가격·판매조건:
{{가격·판매조건}}
필수포함문구:
{{필수포함문구}}
금지문구:
{{금지문구}}
브랜드톤:
{{브랜드톤}}
{
"seo_title": "무선 저소음 키보드, 3대 기기 전환 지원",
"short_summary": "조용한 타건과 편리한 멀티 기기 전환을 지원하는 무선 키보드입니다.",
"detail_description": "상세 설명 문장",
"key_benefits": [
"저소음 키",
"블루투스 연결",
"최대 3대 기기 전환",
"충전식 배터리"
],
"keywords": [
"저소음 키보드",
"무선 키보드"
],
"social_caption": "SNS용 홍보 문구",
"hashtags": [
"#저소음키보드",
"#무선키보드"
],
"caution_text": [
"배송비 조건은 판매 페이지에서 확인이 필요합니다."
]
}
ChatGPT Plus를 이용하고 있어도 Make에서 사용하는 OpenAI API 비용이 포함되는 것은 아닙니다.
| 비교 항목 | Apps Script·Gemini | Make·OpenAI |
|---|---|---|
| 기본 비용 | Gemini 무료 티어 범위에서 시작 가능 | Make 무료 플랜 시험 가능, OpenAI API 비용 별도 |
| 코드 | 전체 코드 붙여 넣기 필요 | 대부분 화면에서 설정 |
| 자동 확인 | 15분마다 최대 10개 | 요금제의 실행 간격에 따라 처리 |
| AI 모델 | Gemini 3.5 Flash-Lite | GPT-5.4 mini |
| 구조화 결과 | JSON Schema 사용 | OpenAI와 Parse JSON 사용 |
| 오류 확인 | 시트 오류내용과 Apps Script 실행 기록 | Make 모듈별 실행 기록 |
| 추천 대상 | 비용 없이 시작할 개인과 소규모 사업자 | 다른 쇼핑몰·업무 도구와 연결할 팀 |
신상품을 등록할 때 상품명, 상세 설명과 검색 키워드를 한 번에 준비할 수 있습니다.
상품마다 같은 형식의 문구가 필요할 때 특히 편리합니다.
공급처에서 받은 짧은 상품 정보를 정리해 검색용 제목과 설명 초안을 만들 수 있습니다.
다만 다른 판매자의 설명을 그대로 복사하지 말고 실제 상품 자료를 기준으로 입력해야 합니다.
상세페이지에 사용한 상품 정보를 바탕으로 SNS 문구와 해시태그를 만들 수 있습니다.
하나의 상품 정보를 여러 홍보 채널에 맞춰 재활용하기 좋습니다.
제품 사양과 사용 대상을 구글 시트에 관리하면서 영업용 소개 문구를 일정한 형식으로 만들 수 있습니다.
인증과 시험 수치는 반드시 실제 증빙자료와 비교해야 합니다.
핵심특징도 함께 입력해야 합니다. 상품명만으로 생성하면 AI가 확인되지 않은 특징을 추측하거나 너무 일반적인 문장을 만들 수 있습니다.
쇼핑몰별 제목 길이, 금지어와 중복 상품명을 확인한 뒤 사용해야 합니다. 코드에서는 55자 이내로 제한했지만 각 판매처 기준은 다를 수 있습니다.
아닙니다. 가격·판매조건에 직접 입력한 내용만 활용하도록 설정했습니다. 가격이 비어 있으면 임의로 생성하지 않습니다.
문구 초안 작성은 가능하지만 효능과 기능성 표현은 관련 법규와 실제 증빙자료를 별도로 확인해야 합니다. AI 문구를 바로 게시하면 안 됩니다.
해당 행의 처리상태를 대기로 변경하고 기존 결과를 지운 뒤 지금 생성하기를 실행하세요.
브랜드톤을 친근한 설명, 전문적인 설명, 간결한 설명 등으로 변경한 뒤 다시 생성하면 됩니다.
구글 시트 상품 설명 AI 자동 생성 기능을 이용하면 상품마다 반복해서 작성하던 제목과 상세 설명 작업을 줄일 수 있습니다.
상품 특징 한 번으로 SEO 제목, 핵심 장점, 검색 키워드와 SNS 홍보 문구까지 정리할 수 있다는 점이 가장 큰 장점입니다.
하지만 AI가 작성한 문구가 곧바로 사실이 되는 것은 아닙니다.
실제 가격, 인증, 배송, 보증과 성능을 확인하고 금지문구가 포함되지 않았는지 검토한 뒤 게시해야 합니다.
처음에는 시험용 상품 2~3개로 결과를 확인하세요. 문장 구조와 브랜드톤이 마음에 들면 실제 상품 정보를 하나씩 추가하는 방식이 안전합니다.
구글 시트에 정확한 상품 정보만 입력하면 AI가 상세페이지와 마케팅에 필요한 문구를 한 번에 준비할 수 있지만, 최종 사실 검토는 반드시 사람이 해야 합니다.
| 구글 시트 업무 마감일 알림 자동화, 지연 업무 AI 보고서 만들기 (2026 최신판) (0) | 2026.08.01 |
|---|---|
| Make Gmail 자동화|새 메일을 구글 시트에 자동 저장하는 방법 (2026 최신판) (0) | 2026.07.31 |
| 구글 시트 고객 리뷰 AI 감정 분석 자동화, 불만 유형과 답변 초안까지 (2026 최신판) (1) | 2026.07.30 |
| 구글 시트 재고 부족 알림 자동화, 소규모 사업자도 무료로 만들기 (2026 최신판) (0) | 2026.07.30 |
| Make란? 코딩 없이 무료로 시작하는 초보자 업무 자동화 도구 (2026 최신판) (0) | 2026.07.29 |