상세 컨텐츠

본문 제목

구글 시트 상품 설명 AI 자동 생성, 상세페이지 문구 무료로 만들기 (2026 최신판)

AI 활용 사례 & 응용 🚀

by AI JB 2026. 7. 30. 18:00

본문

한 줄 요약

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

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

온라인 쇼핑몰에 상품을 등록하려면 생각보다 많은 문구가 필요합니다.

상품명만 입력하는 것으로 끝나지 않습니다. 검색에 노출될 제목, 짧은 소개, 상세페이지 설명, 핵심 장점, 검색 키워드와 SNS 홍보 문구까지 각각 작성해야 합니다.

상품이 한두 개라면 직접 작성할 수 있습니다. 하지만 비슷한 상품을 계속 등록해야 한다면 문구를 작성하는 데 많은 시간이 들어갑니다.

이번 글에서는 구글 시트 상품 설명 AI 자동 생성 기능을 만들어 보겠습니다. 상품 정보 한 줄을 입력하면 필요한 문구가 각각의 열에 자동으로 정리됩니다.

상품 설명 AI 자동화가 필요한 이유

상품 설명을 AI에게 단순히 “잘 써줘”라고 요청하면 문제가 생길 수 있습니다.

입력하지 않은 할인율이나 배송 조건을 임의로 넣거나, 확인되지 않은 인증과 성능을 사실처럼 표현할 수 있기 때문입니다.

특히 건강용품, 식품, 화장품과 전자제품은 과장된 효능이나 안전성 표현을 사용하면 안 됩니다.

이번 자동화는 상품 설명을 빠르게 만드는 것만 목표로 하지 않습니다.

상품 정보에 입력된 사실만 사용하고, 금지할 표현을 따로 지정하며, 생성된 결과는 반드시 사람이 검토하도록 구성했습니다.

AI 문구를 검토 없이 바로 게시하지 마세요.

AI는 실제 재고, 배송일, 인증서, 시험 성적서와 판매 정책을 확인하지 못합니다. 가격, 효과, 보증과 안전 관련 내용은 담당자가 원본 자료와 비교해야 합니다.

이 글에서 알 수 있는 내용

  • 상품 문구를 관리할 구글 시트 만드는 방법
  • 상품 특징을 SEO 제목으로 바꾸는 방법
  • 한 줄 요약과 상세페이지 설명을 자동 생성하는 방법
  • 핵심 장점과 검색 키워드를 구분해서 저장하는 방법
  • SNS 홍보 문구와 해시태그를 만드는 방법
  • 과장 표현과 금지 문구를 막는 방법
  • AI 결과를 승인하거나 수정 필요로 표시하는 방법
  • Make와 OpenAI를 이용하는 유료 자동화 방법

완성되는 자동화 결과

상품 정보 입력 AI 사실 범위 확인 SEO 제목 생성 상세 설명 작성 SNS 문구 정리

자동화가 완성되면 다음과 같이 작동합니다.

  1. 구글 시트에 상품명, 특징, 타깃 고객과 판매 조건을 입력합니다.
  2. 필수로 포함할 문구와 사용하면 안 되는 표현을 입력합니다.
  3. Apps Script가 15분마다 대기 상태의 상품을 확인합니다.
  4. AI가 55자 이내의 SEO 상품 제목을 작성합니다.
  5. 한 줄 요약과 상세페이지 설명을 작성합니다.
  6. 핵심 장점 4개와 검색 키워드 6~10개를 만듭니다.
  7. SNS 홍보 문구와 해시태그를 생성합니다.
  8. 확인이 필요한 판매 조건은 주의사항으로 따로 표시합니다.
  9. 처리상태는 완료, 검토상태는 검토 필요로 변경됩니다.

자동화 준비물

무료 방법

  • 개인 구글 계정
  • Google Sheets
  • Google Apps Script
  • Google AI Studio에서 만든 Gemini API 키
  • 실제 상품명과 상품 특징
  • 사용을 피해야 할 금지 문구

유료 방법

  • Google Sheets
  • Make 계정
  • OpenAI 개발자 계정과 API 결제 설정
  • 상품 정보를 확인할 담당자

상품문구 시트는 어떻게 구성될까?

항목 입력하거나 생성되는 내용
상품코드 상품을 구분하는 내부 코드
상품명 판매할 실제 상품 이름
카테고리 컴퓨터 주변기기, 생활용품 등의 분류
핵심특징 재질, 크기, 연결 방식, 구성 등 확인된 사실
타깃고객 이 상품이 필요한 주요 사용자
가격·판매조건 실제 판매가격과 확인된 판매 조건
필수포함문구 반드시 문구에 포함해야 할 특징
금지문구 최저가, 완벽한 등 사용하면 안 되는 표현
브랜드톤 친근함, 전문적, 차분함 등의 문장 분위기
SEO제목 검색용 상품 제목
상세설명 상세페이지에 활용할 3~5개 짧은 문단
검색키워드 상품과 직접 관련된 검색어
SNS문구 인스타그램이나 홍보 게시물용 문장
검토상태 검토 필요, 승인, 수정 필요

무료 방법: Apps Script와 Gemini 사용하기

1단계. 새 구글 스프레드시트 만들기

  1. 구글 드라이브에 접속합니다.
  2. 왼쪽 위의 새로 만들기를 클릭합니다.
  3. Google 스프레드시트를 선택합니다.
  4. 파일 이름을 AI 상품 설명 자동 생성으로 변경합니다.
여기까지 완료했다면

스프레드시트 왼쪽 위에 ‘AI 상품 설명 자동 생성’이라는 이름이 표시됩니다.

2단계. Apps Script 편집기 열기

  1. 스프레드시트 위쪽의 확장 프로그램을 클릭합니다.
  2. Apps Script를 선택합니다.
  3. 기본으로 들어 있는 코드를 모두 지웁니다.
  4. 프로젝트 이름을 AI 상품 문구 자동화로 변경합니다.

3단계. 전체 자동화 코드 붙여 넣기

아래 코드를 처음부터 끝까지 복사해 Apps Script 편집기에 붙여 넣습니다.

상품 설명 AI 자동 생성 전체 코드
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();
}

코드를 붙여 넣은 뒤 위쪽의 디스크 모양 저장 버튼을 클릭합니다.

4단계. Gemini API 키 만들기

  1. Google AI Studio에 로그인합니다.
  2. API Keys 또는 Get API key 메뉴를 엽니다.
  3. Create API key를 클릭합니다.
  4. 생성된 API 키를 복사합니다.
API 키를 공개하면 안 됩니다.

API 키를 블로그 본문이나 캡처 화면에 노출하면 다른 사람이 사용할 수 있습니다. 반드시 Apps Script의 스크립트 속성에 저장하세요.

5단계. API 키를 스크립트 속성에 저장하기

  1. Apps Script 왼쪽의 프로젝트 설정을 클릭합니다.
  2. 스크립트 속성을 찾습니다.
  3. 스크립트 속성 추가를 클릭합니다.
  4. 속성 이름에 GEMINI_API_KEY를 입력합니다.
  5. 값에는 복사한 API 키를 붙여 넣습니다.
  6. 스크립트 속성 저장을 클릭합니다.

6단계. 초기 설정 실행하기

  1. 함수 선택 메뉴에서 setupProductCopyAutomation을 선택합니다.
  2. 실행 버튼을 클릭합니다.
  3. 권한 요청 화면에서 권한 검토를 클릭합니다.
  4. 사용할 구글 계정을 선택합니다.
  5. 스프레드시트 수정과 외부 서비스 연결 권한을 확인합니다.
  6. 허용을 클릭합니다.
여기까지 완료했다면

상품문구 시트와 시험용 상품 2개가 만들어집니다. 트리거에는 generateProductCopyRows 함수가 15분 간격으로 등록됩니다.

자동화가 정상 작동하는지 확인하기

1. 시험용 상품 확인하기

초기 설정을 실행하면 다음 두 가지 예시 상품이 입력됩니다.

상품 핵심 특징 금지 문구
무선 저소음 키보드 저소음 키, 블루투스, 3대 기기 전환 완벽한, 업계 1위, 무조건, 최저가
스테인리스 보온 텀블러 500mL, 이중벽, 밀폐형 뚜껑 절대 새지 않음, 24시간 보온 보장, 의료 효과

2. 수동으로 문구 생성하기

  1. Apps Script 함수 목록에서 testProductCopyAutomation을 선택합니다.
  2. 실행을 클릭합니다.
  3. 작업이 끝나면 구글 스프레드시트로 돌아갑니다.
  4. SEO제목부터 주의사항까지 생성됐는지 확인합니다.
정상 작동 결과

SEO제목, 한줄요약, 상세설명, 핵심장점, 검색키워드, SNS문구와 해시태그가 입력되고 처리상태가 완료로 변경됩니다.

3. 생성된 문구 검토하기

AI 결과가 생성되면 검토상태는 자동으로 검토 필요가 됩니다.

다음 항목을 확인한 뒤 문제가 없을 때만 승인으로 변경하세요.

  • 입력하지 않은 기능이 추가되지 않았는지 확인
  • 실제 판매가격과 일치하는지 확인
  • 배송비와 배송일을 임의로 약속하지 않았는지 확인
  • 인증이나 수상 이력을 만들지 않았는지 확인
  • 금지문구가 포함되지 않았는지 확인
  • 검색 키워드가 상품과 직접 관련 있는지 확인
  • 해시태그에 다른 브랜드 이름이 들어가지 않았는지 확인
TIP. 핵심특징을 구체적으로 입력하세요.

“좋은 키보드”처럼 추상적으로 적기보다 “저소음 키, 블루투스 연결, 최대 3대 기기 전환”처럼 사실을 구체적으로 입력해야 더 정확한 문구가 나옵니다.

4. 새로운 상품 추가하기

  1. 상품문구 시트의 빈 행을 선택합니다.
  2. 등록시간, 상품코드와 상품명을 입력합니다.
  3. 카테고리와 핵심특징을 입력합니다.
  4. 타깃고객과 실제 판매조건을 입력합니다.
  5. 필수포함문구와 금지문구를 입력합니다.
  6. 브랜드톤을 선택합니다.
  7. 처리상태를 대기로 설정합니다.
  8. 15분 이내 자동 생성되거나 메뉴에서 지금 생성하기를 실행합니다.

Apps Script 코드를 관리하기 어렵다면 Make에서 Google Sheets와 OpenAI를 연결할 수 있습니다.

Google Sheets 새 행 OpenAI 상품 문구 생성 JSON 결과 분리 Google Sheets 행 수정

1단계. Google Sheets 트리거 추가하기

  1. Make에 로그인합니다.
  2. Scenarios를 클릭합니다.
  3. Create a new scenario를 선택합니다.
  4. Google Sheets의 Watch New Rows를 추가합니다.
  5. 상품 정보가 입력되는 스프레드시트와 시트를 선택합니다.

2단계. OpenAI 문구 생성 모듈 추가하기

  1. Google Sheets 오른쪽에 OpenAI 모듈을 추가합니다.
  2. Generate a Response를 선택합니다.
  3. OpenAI API 키를 이용해 연결합니다.
  4. 모델은 gpt-5.4-mini를 선택합니다.
  5. 상품 정보를 프롬프트에 연결합니다.
Make용 상품 설명 프롬프트
입력된 상품 정보에 있는 사실만 사용해 판매용 문구를 작성하세요.

가격, 할인율, 배송, 인증, 수상, 원산지, 보증기간과 효과를 임의로 만들지 마세요.
금지문구는 사용하지 마세요.
확인되지 않는 내용은 출력하지 마세요.

JSON으로만 출력하세요.

필요한 항목:
seo_title
short_summary
detail_description
key_benefits
keywords
social_caption
hashtags
caution_text

상품명:
{{상품명}}

카테고리:
{{카테고리}}

핵심특징:
{{핵심특징}}

타깃고객:
{{타깃고객}}

가격·판매조건:
{{가격·판매조건}}

필수포함문구:
{{필수포함문구}}

금지문구:
{{금지문구}}

브랜드톤:
{{브랜드톤}}

3단계. JSON 결과 분리하기

  1. OpenAI 뒤에 JSON의 Parse JSON 모듈을 추가합니다.
  2. 아래 예시 JSON을 이용해 데이터 구조를 생성합니다.
JSON 구조 예시
{
  "seo_title": "무선 저소음 키보드, 3대 기기 전환 지원",
  "short_summary": "조용한 타건과 편리한 멀티 기기 전환을 지원하는 무선 키보드입니다.",
  "detail_description": "상세 설명 문장",
  "key_benefits": [
    "저소음 키",
    "블루투스 연결",
    "최대 3대 기기 전환",
    "충전식 배터리"
  ],
  "keywords": [
    "저소음 키보드",
    "무선 키보드"
  ],
  "social_caption": "SNS용 홍보 문구",
  "hashtags": [
    "#저소음키보드",
    "#무선키보드"
  ],
  "caution_text": [
    "배송비 조건은 판매 페이지에서 확인이 필요합니다."
  ]
}

4단계. Google Sheets 행 업데이트하기

  1. Parse JSON 뒤에 Google Sheets의 Update a Row를 추가합니다.
  2. Watch New Rows에서 받은 Row number를 연결합니다.
  3. SEO제목, 상세설명, 키워드와 SNS문구를 각각 연결합니다.
  4. 처리상태에는 완료를 입력합니다.
  5. 검토상태에는 검토 필요를 입력합니다.
  6. Run once로 시험한 뒤 시나리오를 활성화합니다.
ChatGPT 구독과 OpenAI API는 별도입니다.

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 마케팅 담당자

상세페이지에 사용한 상품 정보를 바탕으로 SNS 문구와 해시태그를 만들 수 있습니다.

하나의 상품 정보를 여러 홍보 채널에 맞춰 재활용하기 좋습니다.

소규모 제조사

제품 사양과 사용 대상을 구글 시트에 관리하면서 영업용 소개 문구를 일정한 형식으로 만들 수 있습니다.

인증과 시험 수치는 반드시 실제 증빙자료와 비교해야 합니다.

장점과 단점

장점
  • 상품 하나마다 반복해서 문구를 작성하는 시간을 줄일 수 있습니다.
  • SEO 제목과 상세 설명을 서로 다른 열에 정리할 수 있습니다.
  • 금지문구를 상품별로 지정할 수 있습니다.
  • 검색 키워드와 SNS 문구까지 한 번에 생성됩니다.
  • 모든 결과를 승인 전 검토 필요 상태로 표시합니다.
  • 상품별 브랜드톤을 다르게 설정할 수 있습니다.
단점
  • 입력 정보가 부족하면 평범한 문구가 생성될 수 있습니다.
  • AI가 금지문구와 비슷한 표현을 사용할 가능성이 있습니다.
  • 상품의 실제 인증과 성능을 자동으로 확인하지 못합니다.
  • 각 쇼핑몰의 제목 길이와 금지 표현이 다를 수 있습니다.
  • 무료 API와 Apps Script에는 사용량 제한이 있습니다.
  • 대량 상품 등록 전에는 반드시 일부 상품으로 시험해야 합니다.

자주 묻는 질문

Q1. 상품명만 입력해도 설명이 만들어지나요?

핵심특징도 함께 입력해야 합니다. 상품명만으로 생성하면 AI가 확인되지 않은 특징을 추측하거나 너무 일반적인 문장을 만들 수 있습니다.

Q2. 생성된 SEO 제목을 그대로 사용해도 되나요?

쇼핑몰별 제목 길이, 금지어와 중복 상품명을 확인한 뒤 사용해야 합니다. 코드에서는 55자 이내로 제한했지만 각 판매처 기준은 다를 수 있습니다.

Q3. 가격을 자동으로 만들어 주나요?

아닙니다. 가격·판매조건에 직접 입력한 내용만 활용하도록 설정했습니다. 가격이 비어 있으면 임의로 생성하지 않습니다.

Q4. 건강식품이나 화장품에도 사용할 수 있나요?

문구 초안 작성은 가능하지만 효능과 기능성 표현은 관련 법규와 실제 증빙자료를 별도로 확인해야 합니다. AI 문구를 바로 게시하면 안 됩니다.

Q5. 이미 완료된 상품을 다시 생성하려면 어떻게 하나요?

해당 행의 처리상태를 대기로 변경하고 기존 결과를 지운 뒤 지금 생성하기를 실행하세요.

Q6. 같은 상품으로 다른 분위기의 문구를 만들 수 있나요?

브랜드톤을 친근한 설명, 전문적인 설명, 간결한 설명 등으로 변경한 뒤 다시 생성하면 됩니다.

마무리

구글 시트 상품 설명 AI 자동 생성 기능을 이용하면 상품마다 반복해서 작성하던 제목과 상세 설명 작업을 줄일 수 있습니다.

상품 특징 한 번으로 SEO 제목, 핵심 장점, 검색 키워드와 SNS 홍보 문구까지 정리할 수 있다는 점이 가장 큰 장점입니다.

하지만 AI가 작성한 문구가 곧바로 사실이 되는 것은 아닙니다.

실제 가격, 인증, 배송, 보증과 성능을 확인하고 금지문구가 포함되지 않았는지 검토한 뒤 게시해야 합니다.

처음에는 시험용 상품 2~3개로 결과를 확인하세요. 문장 구조와 브랜드톤이 마음에 들면 실제 상품 정보를 하나씩 추가하는 방식이 안전합니다.

핵심 한 줄 정리

구글 시트에 정확한 상품 정보만 입력하면 AI가 상세페이지와 마케팅에 필요한 문구를 한 번에 준비할 수 있지만, 최종 사실 검토는 반드시 사람이 해야 합니다.

관련글 더보기