Sign In
๋ฉ€ํ‹ฐํด๋ž˜์Šค ๊ด€๋ฆฌ
๊ทธ๋ผ์šด๋“œ ์š”๊ธˆ์ œ ๋ฐ ๋ฌธ์˜
๊ทธ๋ผ์šด๋“œ ์†Œ์‚ฌ์ด์–ดํ‹ฐ ๊ฒฝ์ œ ์ •์ฑ… ์„ค๊ณ„ ๊ฐ€์ด๋“œ
Subscribe

๐Ÿ’ ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ร— ๊ทธ๋ผ์šด๋“œ API ์—ฐ๋™ ๊ฐ€์ด๋“œ

๐Ÿฅญ ์ƒ˜ํ”Œ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ ๐Ÿ‘‰๐Ÿป ๋‹ค์šด๋กœ๋“œ

๐Ÿ“‹ ๋ชฉ์ฐจ

๊ฐœ์š”

๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์˜ Apps Script๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ผ์šด๋“œ API์™€ ์—ฐ๋™ํ•˜๋ฉด:
โ€ข
โœ… ํ•™์ƒ ๋ช…๋‹จ์—์„œ ์ง์ ‘ ํฌ์ธํŠธ ๋ถ€์—ฌ
โ€ข
โœ… ๋ฒ„ํŠผ ํด๋ฆญ๋งŒ์œผ๋กœ ์ผ๊ด„ ํฌ์ธํŠธ ์ฒ˜๋ฆฌ
โ€ข
โœ… ์ถœ์„, ๊ณผ์ œ, ํ€ด์ฆˆ ์ ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ํฌ์ธํŠธ๋กœ ๋ณ€ํ™˜
โ€ข
โœ… ์ง„ํ–‰ ์ƒํ™ฉ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ

์‚ฌ์ „ ์ค€๋น„

1. ๊ทธ๋ผ์šด๋“œ API ํ‚ค ๋ฐœ๊ธ‰

2.
๋‚ด ์ •๋ณด โ†’ API ํ‚ค ๊ด€๋ฆฌ ํƒญ
3.
์ƒˆ API ํ‚ค ์ƒ์„ฑ ํด๋ฆญ
4.
API ํ‚ค ๋ณต์‚ฌ (์˜ˆ: sk_live_xxx...)

2. ํด๋ž˜์Šค ID ํ™•์ธ

1.
๊ทธ๋ผ์šด๋“œ ์›น์‚ฌ์ดํŠธ โ†’ ํด๋ž˜์Šค ๊ด€๋ฆฌ
2.
ํฌ์ธํŠธ๋ฅผ ๋ถ€์—ฌํ•  ํด๋ž˜์Šค์˜ ID ๋ณต์‚ฌ (์˜ˆ: NP0hetJ3wyQKFtRnFeftmPiy8Dl3_2)

3. ํ•™์ƒ ๋ฒˆํ˜ธ ํ™•์ธ

โ€ข
๊ทธ๋ผ์šด๋“œ์—์„œ ๊ฐ ํ•™์ƒ์—๊ฒŒ ๋ถ€์—ฌ๋œ ๋ฒˆํ˜ธ(code) ํ™•์ธ
โ€ข
์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์˜ ํ•™์ƒ ๋ชฉ๋ก๊ณผ ๋งค์นญ

๋ฒ„ํŠผ์œผ๋กœ ์ผ๊ด„ ํฌ์ธํŠธ ๋ถ€์—ฌ

โœจ ํŠน์ง•

โ€ข
์—ฌ๋Ÿฌ ํ•™์ƒ์—๊ฒŒ ๋™์‹œ์— ํฌ์ธํŠธ ๋ถ€์—ฌ
โ€ข
์„ ํƒํ•œ ํ–‰๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
โ€ข
์ง„ํ–‰ ์ƒํ™ฉ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ
โ€ข
์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ๋งŒ์œผ๋กœ ์‹คํ–‰

๐Ÿ“ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ๊ตฌ์„ฑ

A
B
C
D
E
F
์„ ํƒ
ํ•™์ƒ๋ฒˆํ˜ธ
์ด๋ฆ„
ํฌ์ธํŠธ
์„ค๋ช…
์ƒํƒœ
โ˜‘๏ธ
1
๊น€์ฒ ์ˆ˜
10
์ถœ์„
๋Œ€๊ธฐ์ค‘
โ˜‘๏ธ
2
์ด์˜ํฌ
10
์ถœ์„
๋Œ€๊ธฐ์ค‘
โ˜
3
๋ฐ•๋ฏผ์ˆ˜
10
์ถœ์„
๋Œ€๊ธฐ์ค‘

๐Ÿ”ง Apps Script ์ฝ”๋“œ

/**
 * ๊ทธ๋ผ์šด๋“œ API ์„ค์ •
 * โš ๏ธ ์‹ค์ œ API ํ‚ค์™€ ํด๋ž˜์Šค ID๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”!
 */
const GROWND_API_KEY = 'sk_live_your_api_key_here'; // ๋ฐœ๊ธ‰๋ฐ›์€ API ํ‚ค
const GROWND_CLASS_ID = 'your_class_id_here'; // ํด๋ž˜์Šค ID
const GROWND_API_URL = 'https://growndcard.com/api/v1'; 

/**
 * ๋ฉ”๋‰ด์— ์ปค์Šคํ…€ ๋ฒ„ํŠผ ์ถ”๊ฐ€
 */
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ')
    .addItem('์„ ํƒํ•œ ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ', 'awardPointsToSelected')
    .addItem('์ „์ฒด ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ', 'awardPointsToAll')
    .addSeparator()
    .addItem('์„ค์ •', 'showSettings')
    .addToUi();
}

/**
 * ์„ ํƒํ•œ ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ
 */
function awardPointsToSelected() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const ui = SpreadsheetApp.getUi();
  
  // ํ™•์ธ ๋Œ€ํ™”์ƒ์ž
  const response = ui.alert(
    'ํฌ์ธํŠธ ๋ถ€์—ฌ ํ™•์ธ',
    '์„ ํƒ๋œ ํ•™์ƒ๋“ค์—๊ฒŒ ํฌ์ธํŠธ๋ฅผ ๋ถ€์—ฌํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?',
    ui.ButtonSet.YES_NO
  );
  
  if (response !== ui.Button.YES) {
    return;
  }

  // ๋ฐ์ดํ„ฐ ๋ฒ”์œ„ ๊ฐ€์ ธ์˜ค๊ธฐ (2ํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘, ํ—ค๋” ์ œ์™ธ)
  const dataRange = sheet.getRange(2, 1, sheet.getLastRow() - 1, 6);
  const data = dataRange.getValues();
  
  let successCount = 0;
  let failCount = 0;

  // ๊ฐ ํ–‰ ์ฒ˜๋ฆฌ
  for (let i = 0; i < data.length; i++) {
    const [checked, studentCode, name, points, description, status] = data[i];
    
    // ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์„ ํƒ๋œ ํ–‰๋งŒ ์ฒ˜๋ฆฌ
    if (checked === true) {
      // ์ƒํƒœ ์—…๋ฐ์ดํŠธ: ์ฒ˜๋ฆฌ ์ค‘
      sheet.getRange(i + 2, 6).setValue('โณ ์ฒ˜๋ฆฌ ์ค‘...');
      SpreadsheetApp.flush(); // ์ฆ‰์‹œ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ
      
      try {
        const result = awardPointToStudent(studentCode, points, description);
        
        if (result.success) {
          sheet.getRange(i + 2, 6).setValue(`โœ… ${points}P ๋ถ€์—ฌ ์™„๋ฃŒ`);
          successCount++;
        } else {
          sheet.getRange(i + 2, 6).setValue(`โŒ ${result.error}`);
          failCount++;
        }
      } catch (error) {
        sheet.getRange(i + 2, 6).setValue(`โŒ ${error.message}`);
        failCount++;
      }
      
      SpreadsheetApp.flush();
    }
  }

  // ๊ฒฐ๊ณผ ์•Œ๋ฆผ
  ui.alert(
    'ํฌ์ธํŠธ ๋ถ€์—ฌ ์™„๋ฃŒ',
    `์„ฑ๊ณต: ${successCount}๋ช…\n์‹คํŒจ: ${failCount}๋ช…`,
    ui.ButtonSet.OK
  );
}

/**
 * ์ „์ฒด ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ
 */
function awardPointsToAll() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const ui = SpreadsheetApp.getUi();
  
  // ํ™•์ธ ๋Œ€ํ™”์ƒ์ž
  const response = ui.alert(
    '์ „์ฒด ํฌ์ธํŠธ ๋ถ€์—ฌ ํ™•์ธ',
    '์ „์ฒด ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ๋ฅผ ๋ถ€์—ฌํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?',
    ui.ButtonSet.YES_NO
  );
  
  if (response !== ui.Button.YES) {
    return;
  }

  const dataRange = sheet.getRange(2, 2, sheet.getLastRow() - 1, 5); // ์ฒดํฌ๋ฐ•์Šค ์ œ์™ธ
  const data = dataRange.getValues();
  
  let successCount = 0;
  let failCount = 0;

  for (let i = 0; i < data.length; i++) {
    const [studentCode, name, points, description, status] = data[i];
    
    if (studentCode && points) {
      sheet.getRange(i + 2, 6).setValue('โณ ์ฒ˜๋ฆฌ ์ค‘...');
      SpreadsheetApp.flush();
      
      try {
        const result = awardPointToStudent(studentCode, points, description);
        
        if (result.success) {
          sheet.getRange(i + 2, 6).setValue(`โœ… ${points}P ๋ถ€์—ฌ ์™„๋ฃŒ`);
          successCount++;
        } else {
          sheet.getRange(i + 2, 6).setValue(`โŒ ${result.error}`);
          failCount++;
        }
      } catch (error) {
        sheet.getRange(i + 2, 6).setValue(`โŒ ${error.message}`);
        failCount++;
      }
      
      SpreadsheetApp.flush();
    }
  }

  ui.alert(
    'ํฌ์ธํŠธ ๋ถ€์—ฌ ์™„๋ฃŒ',
    `์„ฑ๊ณต: ${successCount}๋ช…\n์‹คํŒจ: ${failCount}๋ช…`,
    ui.ButtonSet.OK
  );
}

/**
 * ๊ฐœ๋ณ„ ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ (๋‚ด๋ถ€ ํ•จ์ˆ˜)
 */
function awardPointToStudent(studentCode, points, description) {
  const url = `${GROWND_API_URL}/classes/${GROWND_CLASS_ID}/students/${studentCode}/points`;
  
  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'X-API-Key': GROWND_API_KEY
    },
    payload: JSON.stringify({
      type: 'reward',
      points: points,
      description: description || '์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์—์„œ ๋ถ€์—ฌ',
      source: 'google_sheets'
    }),
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const statusCode = response.getResponseCode();
    const contentText = response.getContentText();
    
    // HTML ์‘๋‹ต ์ฒดํฌ (์—๋Ÿฌ ํŽ˜์ด์ง€ ๋ฐฉ์ง€)
    if (contentText.startsWith('<')) {
      console.error('HTML ์‘๋‹ต:', contentText.substring(0, 200));
      return { 
        success: false, 
        error: `API ์‘๋‹ต ์˜ค๋ฅ˜ (์ƒํƒœ ${statusCode}). URL์„ ํ™•์ธํ•˜์„ธ์š”.` 
      };
    }
    
    const result = JSON.parse(contentText);
    
    return result.success 
      ? { success: true } 
      : { success: false, error: result.error.message };
      
  } catch (error) {
    console.error('API ํ˜ธ์ถœ ์—๋Ÿฌ:', error);
    return { success: false, error: error.message };
  }
}

/**
 * ์„ค์ • ๋Œ€ํ™”์ƒ์ž
 */
function showSettings() {
  const ui = SpreadsheetApp.getUi();
  ui.alert(
    'โš™๏ธ API ์„ค์ •',
    `ํ˜„์žฌ ์„ค์ •:\n\n` +
    `API ํ‚ค: ${GROWND_API_KEY.substring(0, 15)}...\n` +
    `ํด๋ž˜์Šค ID: ${GROWND_CLASS_ID}\n\n` +
    `์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด Apps Script ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์„ธ์š”.`,
    ui.ButtonSet.OK
  );
}

๐Ÿ“– ์„ค์ • ๋ฐฉ๋ฒ•

1๋‹จ๊ณ„: Apps Script ์—ด๊ธฐ

1.
๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์—์„œ ์ƒ๋‹จ ๋ฉ”๋‰ด: ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ โ†’ Apps Script
2.
์ƒˆ ์ฐฝ์ด ์—ด๋ฆฌ๋ฉด ๊ธฐ์กด ์ฝ”๋“œ ์‚ญ์ œ

2๋‹จ๊ณ„: ์ฝ”๋“œ ๋ณต์‚ฌ ๋ฐ ์„ค์ •

1.
์œ„์˜ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ
2.
์ค‘์š”: ๋‹ค์Œ ๋‘ ์ค„์„ ์‹ค์ œ ๊ฐ’์œผ๋กœ ์ˆ˜์ •:
const GROWND_API_KEY = 'sk_live_xxx...'; // ๋ฐœ๊ธ‰๋ฐ›์€ ์‹ค์ œ API ํ‚ค
const GROWND_CLASS_ID = 'NP0hetJ3wyQKFtRnFeftmPiy8Dl3_2'; // ์‹ค์ œ ํด๋ž˜์Šค ID

3๋‹จ๊ณ„: ์ €์žฅ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ

1.
๐Ÿ’พ ์ €์žฅ ๋ฒ„ํŠผ ํด๋ฆญ (๋˜๋Š” Ctrl+S / Cmd+S)
2.
ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์ž…๋ ฅ (์˜ˆ: "๊ทธ๋ผ์šด๋“œ ํฌ์ธํŠธ ๊ด€๋ฆฌ")
3.
Apps Script ํƒญ ๋‹ซ๊ธฐ

4๋‹จ๊ณ„: ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ๊ตฌ์„ฑ

1.
์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ๋‹ซ์•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ด๊ธฐ (์ƒˆ๋กœ๊ณ ์นจ)
2.
์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ƒ๋‹จ์— "๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ" ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚จ
3.
์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ:
A์—ด: ์ฒดํฌ๋ฐ•์Šค ์‚ฝ์ž…
โ€ข
์‚ฝ์ž… โ†’ ์ฒดํฌ๋ฐ•์Šค ํด๋ฆญ
โ€ข
๊ฐ ํ•™์ƒ ํ–‰์— ์ฒดํฌ๋ฐ•์Šค ์ถ”๊ฐ€
B์—ด: ํ•™์ƒ๋ฒˆํ˜ธ (์ˆซ์ž, ์˜ˆ: 1, 2, 3...)
C์—ด: ํ•™์ƒ์ด๋ฆ„
D์—ด: ๋ถ€์—ฌํ•  ํฌ์ธํŠธ (์ˆซ์ž)
E์—ด: ํฌ์ธํŠธ ์„ค๋ช… (ํ…์ŠคํŠธ)
F์—ด: ์ƒํƒœ (์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง, ๋น„์›Œ๋‘๊ธฐ)

5๋‹จ๊ณ„: ์ฒซ ์‹คํ–‰ ์‹œ ๊ถŒํ•œ ๋ถ€์—ฌ

1.
๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ โ†’ ์„ ํƒํ•œ ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ ํด๋ฆญ
2.
๊ถŒํ•œ ๊ฒ€ํ†  ํŒ์—…์ด ๋‚˜ํƒ€๋‚˜๋ฉด ํด๋ฆญ
3.
๋ณธ์ธ ๊ตฌ๊ธ€ ๊ณ„์ • ์„ ํƒ
4.
๊ณ ๊ธ‰ ํด๋ฆญ โ†’ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋กœ ์ด๋™ ํด๋ฆญ
5.
ํ—ˆ์šฉ ํด๋ฆญ

6๋‹จ๊ณ„: ์‚ฌ์šฉํ•˜๊ธฐ

1.
ํฌ์ธํŠธ๋ฅผ ๋ถ€์—ฌํ•  ํ•™์ƒ์˜ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ
2.
๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ โ†’ ์„ ํƒํ•œ ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ ํด๋ฆญ
3.
ํ™•์ธ ๋Œ€ํ™”์ƒ์ž์—์„œ ์˜ˆ ํด๋ฆญ
4.
์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌ ์ƒํ™ฉ ํ™•์ธ

๋ฌธ์ œ ํ•ด๊ฒฐ

โŒ "๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜

์›์ธ: Apps Script ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์ง€ ์•Š์Œ
ํ•ด๊ฒฐ:
1.
Apps Script ์‹คํ–‰ ์‹œ ๊ถŒํ•œ ๊ฒ€ํ†  ํด๋ฆญ
2.
๋ณธ์ธ ๊ตฌ๊ธ€ ๊ณ„์ • ์„ ํƒ
3.
๊ณ ๊ธ‰ โ†’ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋กœ ์ด๋™ ํด๋ฆญ
4.
ํ—ˆ์šฉ ํด๋ฆญ

โŒ "API ํ‚ค ์ธ์ฆ ์‹คํŒจ" ์˜ค๋ฅ˜

์›์ธ: API ํ‚ค๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜ ๋งŒ๋ฃŒ๋จ
ํ•ด๊ฒฐ:
1.
๊ทธ๋ผ์šด๋“œ ์›น์‚ฌ์ดํŠธ์—์„œ API ํ‚ค ํ™•์ธ
2.
Apps Script ์ฝ”๋“œ์˜ GROWND_API_KEY ๊ฐ’ ์—…๋ฐ์ดํŠธ
3.
API ํ‚ค๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ

โŒ "ํ•™์ƒ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜

์›์ธ: ํ•™์ƒ ๋ฒˆํ˜ธ๊ฐ€ ์ž˜๋ชป๋จ
ํ•ด๊ฒฐ:
1.
๊ทธ๋ผ์šด๋“œ ์›น์‚ฌ์ดํŠธ์—์„œ ์ •ํ™•ํ•œ ํ•™์ƒ ๋ฒˆํ˜ธ ํ™•์ธ
2.
์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์˜ ํ•™์ƒ ๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
3.
ํ•™์ƒ ๋ฒˆํ˜ธ๋Š” ์ˆซ์ž์—ฌ์•ผ ํ•จ (๋ฌธ์ž์—ด X)
4.
B์—ด ์ „์ฒด๋ฅผ ์„ ํƒ โ†’ ์šฐํด๋ฆญ โ†’ ์„œ์‹ โ†’ ์ˆซ์ž โ†’ ์ˆซ์ž ์„ ํƒ

โŒ "ํด๋ž˜์Šค ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜

์›์ธ: API ํ‚ค๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Œ
ํ•ด๊ฒฐ:
1.
๊ทธ๋ผ์šด๋“œ ์›น์‚ฌ์ดํŠธ โ†’ ๋‚ด ์ •๋ณด โ†’ API ํ‚ค ๊ด€๋ฆฌ
2.
ํ•ด๋‹น API ํ‚ค์˜ ๊ถŒํ•œ์— ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
3.
ํ•„์š”์‹œ API ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žฌ์ƒ์„ฑ

โŒ "์ผ์ผ ํ˜ธ์ถœ ์ œํ•œ ์ดˆ๊ณผ" ์˜ค๋ฅ˜

์›์ธ: ํ•˜๋ฃจ 500ํšŒ API ํ˜ธ์ถœ ์ œํ•œ ๋„๋‹ฌ
ํ•ด๊ฒฐ:
1.
๋‚ด์ผ๊นŒ์ง€ ๋Œ€๊ธฐ (๋งค์ผ ์ž์ • ์ดˆ๊ธฐํ™”)
2.
๋˜๋Š” ์—ฌ๋Ÿฌ API ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ถ„์‚ฐ ์‚ฌ์šฉ
3.
๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต ํ˜ธ์ถœ ์ œ๊ฑฐ

โŒ ์ƒ๋‹จ์— "๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ" ๋ฉ”๋‰ด๊ฐ€ ์•ˆ ๋ณด์ž„

์›์ธ: ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ €์žฅ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจ ํ•„์š”
ํ•ด๊ฒฐ:
1.
Apps Script์—์„œ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
2.
์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์™„์ „ํžˆ ๋‹ซ๊ธฐ
3.
๋‹ค์‹œ ์—ด๊ธฐ (์ตœ๋Œ€ 30์ดˆ ๋Œ€๊ธฐ)
4.
์—ฌ์ „ํžˆ ์•ˆ ๋ณด์ด๋ฉด Apps Script์—์„œ onOpen ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์‹คํ–‰

โŒ ํ•จ์ˆ˜ ์‹คํ–‰์ด ๋„ˆ๋ฌด ๋А๋ฆผ

์›์ธ: ๋งŽ์€ ํ•™์ƒ์—๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ API ํ˜ธ์ถœ
ํ•ด๊ฒฐ:
โ€ข
ํ•™์ƒ ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ 10-20๋ช…์”ฉ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌ
โ€ข
๋˜๋Š” ์ฝ”๋“œ์— ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ (rate limit ๋ฐฉ์ง€์šฉ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ํฌํ•จ)

๐Ÿ“Œ ํ™œ์šฉ ํŒ

1๏ธโƒฃ ์ถœ์„ ์ฒดํฌ ์‹œํŠธ

A
B
C
D
E
F
์„ ํƒ
ํ•™์ƒ๋ฒˆํ˜ธ
์ด๋ฆ„
ํฌ์ธํŠธ
์„ค๋ช…
์ƒํƒœ
โ˜‘๏ธ
1
๊น€์ฒ ์ˆ˜
5
2025-01-15 ์ถœ์„
โ˜‘๏ธ
2
์ด์˜ํฌ
5
2025-01-15 ์ถœ์„
โ˜
3
๋ฐ•๋ฏผ์ˆ˜
0
๊ฒฐ์„
โ€ข
์ถœ์„ํ•œ ํ•™์ƒ๋งŒ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ
โ€ข
D์—ด์— ์ถœ์„ ํฌ์ธํŠธ (์˜ˆ: 5์ ) ์ž…๋ ฅ
โ€ข
E์—ด์— ๋‚ ์งœ + "์ถœ์„" ์ž…๋ ฅ
โ€ข
๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ โ†’ ์„ ํƒํ•œ ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ

2๏ธโƒฃ ํ€ด์ฆˆ/๊ณผ์ œ ์ ์ˆ˜

A
B
C
D
E
F
์„ ํƒ
ํ•™์ƒ๋ฒˆํ˜ธ
์ด๋ฆ„
ํฌ์ธํŠธ
์„ค๋ช…
์ƒํƒœ
โ˜‘๏ธ
1
๊น€์ฒ ์ˆ˜
20
์ˆ˜ํ•™ ํ€ด์ฆˆ A๋“ฑ๊ธ‰
โ˜‘๏ธ
2
์ด์˜ํฌ
15
์ˆ˜ํ•™ ํ€ด์ฆˆ B๋“ฑ๊ธ‰
โ˜‘๏ธ
3
๋ฐ•๋ฏผ์ˆ˜
10
์ˆ˜ํ•™ ํ€ด์ฆˆ C๋“ฑ๊ธ‰
โ€ข
์ „์ฒด ํ•™์ƒ์—๊ฒŒ ์ฐจ๋“ฑ ํฌ์ธํŠธ ๋ถ€์—ฌ
โ€ข
๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ โ†’ ์ „์ฒด ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ

3๏ธโƒฃ ์ผ๊ด„ ํฌ์ธํŠธ ๋ถ€์—ฌ

์ „์ฒด ํ•™์ƒ์—๊ฒŒ ๋™์ผํ•œ ํฌ์ธํŠธ๋ฅผ ๋ถ€์—ฌํ•  ๋•Œ:
โ€ข
์ฒดํฌ๋ฐ•์Šค ์—†์ด B~E์—ด๋งŒ ์ฑ„์šฐ๊ธฐ
โ€ข
๐ŸŽฏ ๊ทธ๋ผ์šด๋“œ โ†’ ์ „์ฒด ํ•™์ƒ์—๊ฒŒ ํฌ์ธํŠธ ๋ถ€์—ฌ

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ

์ด์ œ ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์—์„œ ๊ทธ๋ผ์šด๋“œ ํฌ์ธํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ถ”์ฒœ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

โ€ข
โœ… ์ถœ์„ ๊ด€๋ฆฌ: ๋งค์ผ ์ถœ์„ ์ฒดํฌ โ†’ ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ ํฌ์ธํŠธ ๋ถ€์—ฌ
โ€ข
โœ… ํ€ด์ฆˆ/์‹œํ—˜: ์ ์ˆ˜ ์ž…๋ ฅ โ†’ ๋“ฑ๊ธ‰๋ณ„ ํฌ์ธํŠธ ์ฐจ๋“ฑ ๋ถ€์—ฌ
โ€ข
โœ… ๊ณผ์ œ ์ œ์ถœ: ์ œ์ถœ ์—ฌ๋ถ€ ์ฒดํฌ โ†’ ์ผ๊ด„ ํฌ์ธํŠธ ๋ถ€์—ฌ
โ€ข
โœ… ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ: ํŠน๋ณ„ ํ™œ๋™, ์šฐ์ˆ˜ ํ•™์ƒ ํฌ์ธํŠธ ์ง€๊ธ‰

์ฐธ๊ณ 

โ€ข
๐Ÿ“– API ๋ฌธ์„œ: https://slashpage.com/grownd/grownd_API