Sign In
๊ทธ๋ผ์šด๋“œ ๊ธฐ๋ณธ ๊ฐ€์ด๋“œ
๋ฉ€ํ‹ฐํด๋ž˜์Šค ๊ด€๋ฆฌ

๐Ÿ’ ๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ร— ๊ทธ๋ผ์šด๋“œ 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