๐Ÿ“ ํšŒ๊ณ  ๋ฆฌํฌํŠธ ์ค€๋น„ 1๋‹จ๊ณ„ ํ™œ๋™๋กœ๊น… ์‹œ์Šคํ…œ ์‹ค์Šต ๋”ฐ๋ผํ•˜๊ธฐ

๐Ÿ—’๏ธ ์†Œ๊ฐœ

์ด๋ฒˆ ์‚ฌ๋ก€๋Š” Hero ์Šคํ„ฐ๋””์žฅ๋‹˜์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ ํšŒ๊ณ  ๋ฆฌํฌํŠธ ์ž๋™ ์ž‘์„ฑ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ค€๋น„ 1๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•œ ์‹œ๊ฐ„๋ณ„ ํ™œ๋™ ๋กœ๊น… ์‹œ์Šคํ…œ ์‹ค์Šต ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.
์ด ์‹ค์Šต์„ ํ†ตํ•ด ์•ž์œผ๋กœ ๋งŒ๋“ค ์ „์ฒด ์‹œ์Šคํ…œ์˜ ํ๋ฆ„์„ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ณด๋ฉฐ, ์ž๋™ํ™”์˜ ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™Œ


๐Ÿ”ง ์‚ฌ์šฉ ๋„๊ตฌ

  • Activepieces: ์ „์ฒด ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ ์„ค๊ณ„

  • Discord: ์‹œ๊ฐ„ ์•Œ๋ฆผ ๋ฐ ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 

  • Google Forms: ํ™œ๋™ ์ž…๋ ฅ์šฉ ํผ ์ž‘์„ฑ

  • Google Sheets: ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ €์žฅ

  • Google Calendar: ํ™œ๋™์„ ์ผ์ •์œผ๋กœ ์ž๋™ ๊ธฐ๋ก


โš™๏ธ ๊ตฌํ˜„ ๊ณผ์ •

1. ์›Œํฌํ”Œ๋กœ์šฐ 1 โ€” ๋งค์‹œ๊ฐ„ ์ •๊ฐ์— Discord๋กœ ํผ ๋งํฌ ์ž๋™ ์ „์†ก

  • Cron ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ **0 6-23 * * *** (์ •๊ฐ 6์‹œ~23์‹œ ๋งค์ผ ๋งค์›” ๋งค์š”์ผ) ํ˜•ํƒœ๋กœ ์Šค์ผ€์ค„ ์‹คํ–‰ (๋ณธ์ธ์ด ํ™œ๋™๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•  ์‹œ๊ฐ„ ์„ค์ •)

  • ๋งค ์ •๊ฐ๋งˆ๋‹ค Google Form ๋งํฌ๊ฐ€ ์ž๋™์œผ๋กœ DM์œผ๋กœ ๋„์ฐฉ

  • ํ•™์Šต ๋ชฉํ‘œ: ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ž๋™ํ™”์˜ ํ•ต์‹ฌ์ธ Cron ๊ตฌ์กฐ ์ดํ•ด


2. Code ๋ธ”๋ก์—์„œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ์ž๋™ ์ƒ์„ฑ โ†’ Google Form URL ๊ตฌ์„ฑ

์ด ๋‹จ๊ณ„๋Š” ์‹ค์Šต ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์˜€์Šต๋‹ˆ๋‹ค.
Google Form์€ entry ID๋ฅผ ์ด์šฉํ•ด ์‚ฌ์ „ ์ž…๋ ฅ(prefilled)๋œ ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ๋‚ ์งœ(Date)์™€ ์‹œ๊ฐ„(Time)์„ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ URL์— ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กญ๊ฒŒ ์—ด๋ฆฐ ์‚ฌ์ „ ์ž…๋ ฅ Form์— ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์ž…๋ ฅํ•œ ํ›„ ๋งํฌ ๋ณต์‚ฌํ•˜์—ฌ entry ID ์–ป๊ธฐ

ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ๋ฌธ์ž ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋‚ ์งœยท์‹œ๊ฐ„์„ ์ƒ์„ฑํ•˜๊ณ , Google Form์œผ๋กœ ์ „๋‹ฌํ•  URL์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

export const code = async (inputs) => {
 // ํ•œ๊ตญ ์‹œ๊ฐ„ (UTC+9) ๊ธฐ์ค€์œผ๋กœ ํ˜„์žฌ ์‹œ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ
 const now = new Date();
 const koreaTime = new Date(now.toLocaleString("en-US", { timeZone: "Asia/Seoul" }));
 // ๋‚ ์งœ ํฌ๋งท: YYYY-MM-DD
 const year = koreaTime.getFullYear();
 const month = String(koreaTime.getMonth() + 1).padStart(2, '0');
 const day = String(koreaTime.getDate()).padStart(2, '0');
 const dateStr = `${year}-${month}-${day}`;
 // ์‹œ๊ฐ„์„ 1์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋ฐ˜์˜ฌ๋ฆผ
 let hours = koreaTime.getHours();
 const minutes = koreaTime.getMinutes();
 // 30๋ถ„ ์ด์ƒ์ด๋ฉด ๋‹ค์Œ ์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผ
 if (minutes >= 30) {
 hours = (hours + 1) % 24;
 }
 const roundedHours = String(hours).padStart(2, '0');
 const timeStr = `${roundedHours}:00`;
 // Google Form URL ์ƒ์„ฑ
 const baseUrl = "https://docs.google.com/forms/d/e/์ถ”์ถœํ•œ Form ID/viewform";
 const params = new URLSearchParams({
 'usp': 'pp_url', // Prefilled URL ๋ชจ๋“œ ํ‘œ์‹œ
 'entry.์ถ”์ถœํ•œ ๋‚ ์งœ entry': dateStr, // ๋‚ ์งœ ํ•„๋“œ
 'entry.์ถ”์ถœํ•œ ์‹œ๊ฐ„ entry': timeStr // ์‹œ๊ฐ„ ํ•„๋“œ
 });
 const prefilledUrl = `${baseUrl}?${params.toString()}`;
 return {
 url: prefilledUrl,
 date: dateStr,
 time: timeStr
 };
};

โœจ 1) ํ•œ๊ตญ ์‹œ๊ฐ„ ๊ธฐ์ค€(Date & Time) ์ƒ์„ฑ

JavaScript์˜ Date()๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UTC ๊ธฐ์ค€์ด๊ธฐ ๋•Œ๋ฌธ์—
toLocaleString("en-US", { timeZone: "Asia/Seoul" })์„ ์‚ฌ์šฉํ•ด ํ•œ๊ตญ ์‹œ๊ฐ„(KST) ๊ธฐ์ค€์œผ๋กœ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

โœจ 2) ๋‚ ์งœ ํฌ๋งท ๊ตฌ์„ฑ: YYYY-MM-DD

์›”ยท์ผ์ด 10๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ "01"์ฒ˜๋Ÿผ ๋‘ ์ž๋ฆฌ๋กœ ๋งž์ถ”๊ธฐ ์œ„ํ•ด padStart(2, "0") ์‚ฌ์šฉ.

โœจ 3) ์‹œ๊ฐ„ ๋ฐ˜์˜ฌ๋ฆผ ๋กœ์ง

  • ํ˜„์žฌ ์‹œ๊ฐ„์ด 14:45๋ผ๋ฉด โ†’ 15:00

  • ํ˜„์žฌ ์‹œ๊ฐ„์ด 14:10์ด๋ผ๋ฉด โ†’ 14:00
    โ€œ30๋ถ„ ๊ธฐ์ค€ ๋ฐ˜์˜ฌ๋ฆผโ€์„ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹ ๋•๋ถ„์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž๋™ ์ž…๋ ฅ ํŽ˜์ด์ง€๋ฅผ ์—ด์—ˆ์„ ๋•Œ
โ€˜๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •๊ฐ ์‹œ๊ฐ„โ€™์ด ์ž๋™ ์ž…๋ ฅ๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โœจ 4) Google Form entry ID์— ๊ฐ’ ํฌํ•จ

const params = new URLSearchParams({
  'entry.์ถ”์ถœ ๋‚ ์งœ entry': dateStr,
  'entry.์ถ”์ถœ ์‹œ๊ฐ„ entry': timeStr
});

Google Form์—์„œ ์ž…๋ ฅ ํ•ญ๋ชฉ๋งˆ๋‹ค ๋ถ€์—ฌ๋œ ๊ณ ์œ  ID(entry.XXXX)๋ฅผ
URL์— ๋ถ™์—ฌ ์ฃผ๋ฉด ์‚ฌ์ „ ์ž…๋ ฅ(pre-filled)์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.


3. Google Form URL ๋งํฌ ๋””์Šค์ฝ”๋“œ๋กœ ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ

  • Discord ์— ์˜จ ๋ฐ์ผ๋ฆฌ ๋กœ๊ทธ ๊ธฐ๋ก Form ๋งํฌ ๋ฉ”์‹œ์ง€

ํ•œ๊ตญ์–ด ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ์›น์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฐ์ƒท


๐Ÿช„ ์›Œํฌํ”Œ๋กœ์šฐ 2 โ€” ํผ ์‘๋‹ต ์ฒ˜๋ฆฌ & AI ๋ถ„๋ฅ˜

  • Code ์—์„œ Inputs ์ž…๋ ฅํ•  ๋•Œ ๋จผ์ € New Response๋ฅผ ํ…Œ์ŠคํŠธ ํ•œ ํ›„ Output ๊ฐ’์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋„ฃ๋Š”๋‹ค. ์ด ๋•Œ Code Data Selector ์—์„œ answers ๋ฅผ ๋๊นŒ์ง€ ์—ด์–ด์„œ ํ™•์ธ

  • ์‚ฌ์šฉ์ž๊ฐ€ Google Form์— ๊ธฐ๋กํ•œ ๋‚ด์šฉ์ด ์ œ์ถœ๋˜๋ฉด Activepieces๊ฐ€ ์ด๋ฅผ ๋ฐ›์•„

    • AI๋กœ ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜

      ๊ธฐ๋Šฅ ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•œ ํ…์ŠคํŠธ ์Šคํฌ๋ฆฐ์ƒท
    • Format Date ์™€ Add/Subtract Time ๋กœ ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋”์— ์‹œ๊ฐ„๋Œ€ ๋ณ„๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์‹œ๊ฐ„์˜ ํฌ๋งท๊ณผ ํ™œ๋™ ์‹œ๊ฐ„์„ 1์‹œ๊ฐ„ ๋Œ€๋กœ ์„ค์ •

    • Google Calendar ์ผ์ • ์ƒ์„ฑ

    • Google Sheet์— ์ €์žฅ

      ํ•œ๊ตญ์–ด ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” Google ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ
    • Discord๋กœ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ์ „์†ก

๊นŒ์ง€ ์ž๋™ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ Calendar ์ผ์ • ๋งํฌ๋ฅผ Discord์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ชฐ๋ผ์„œ ํ—ค๋งธ์ง€๋งŒ, ์Šคํ„ฐ๋””์žฅ๋‹˜์˜ ์„ค๋ช…์œผ๋กœ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“š ๋„์›€ ๋ฐ›์€ ์ž๋ฃŒ

๐Ÿ‘‰ Hero ์Šคํ„ฐ๋””์žฅ๋‹˜์˜ ์‹œ๊ฐ„๋ณ„ ํ™œ๋™ ๋กœ๊น… ์‹ค์Šต ๊ฐ€์ด๋“œ PDF


๐Ÿ’ฌ ๋งˆ๋ฌด๋ฆฌ ๋ฉ”์‹œ์ง€ ๐Ÿงฉ

์ฒ˜์Œ์—๋Š” Format Date, Add/Subtract Time, entry ID, Cron ๋“ฑ
๊ฐ ์„ค์ •์ด ๋‚ฏ์„ค์–ด์„œ ๋ณต์žกํ•˜๋‹ค๊ณ  ๋А๊ปด์กŒ์ง€๋งŒ
ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋‹ˆ ์ „๋ถ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋œ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ๋„ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ˜ผ์ž ๋™๋™๋Œ€๊ธฐ๋ณด๋‹ค๋Š”
์Šคํ„ฐ๋”” ์นดํ†ก๋ฐฉ์—์„œ ๊ณต์œ ํ•˜๋ฉฐ ํ•จ๊ป˜ ํ•ด๊ฒฐํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š

์ž๋™ํ™”๋Š” ํ˜ผ์ž ํ•  ๋•Œ๋ณด๋‹ค ๊ฐ™์ด ํ•  ๋•Œ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์žฌ๋ฏธ์žˆ๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ซ๊ฒŒ ๋œ ์‹ค์Šต์ด์—ˆ์Šต๋‹ˆ๋‹ค!

2
1๊ฐœ์˜ ๋‹ต๊ธ€

๋‰ด์Šค๋ ˆํ„ฐ ๋ฌด๋ฃŒ ๊ตฌ๋…

๐Ÿ‘‰ ์ด ๊ฒŒ์‹œ๊ธ€๋„ ์ฝ์–ด๋ณด์„ธ์š”