ð ãLINEã«è©±ãã ããã§äºå®ç®¡çïŒChatGPT à GAS à Googleã«ã¬ã³ããŒã§äœãç§æžããã
ð 1. ã¯ããã«
ãã®èšäºã§ã¯ãChatGPT API ãš Google Apps ScriptïŒä»¥äž GASïŒãLINE Messaging API ãçµã¿åãããŠããäŒè©±ã ãã§äºå®ç®¡çãã§ããç§æžãããããäœæããŸãã
ãããªããšãã§ããŸã
- LINEã§ãææ¥ã®10æã«çŸå®¹é¢ããšéãã ãã§ãGoogleã«ã¬ã³ããŒã«äºå®ç»é²
- ãææ¥ã®äºå®æããŠãã§äºå®ã確èª
- ãææ¥ã®äºå®ãã£ã³ã»ã«ããŠãã§åé€
ð 2. äœ¿çšæè¡ãšæºå
䜿ã£ãæè¡
- Google Apps Script (GAS)
- OpenAI ChatGPT API (gpt-4o-mini)
- Googleã«ã¬ã³ã㌠(CalendarApp)
- LINE Messaging API (Webhook ãš reply)
å¿ èŠãªãã®
- OpenAI APIããŒ
- LINEã®ã¢ã«ãŠã³ã
- Googleã¢ã«ãŠã³ã
âïž 3. æ§æå³ãšæ§ææŠèŠ
- LINE ãå ¥ååä»ãè¿ä¿¡ãæ åœ
- GAS ãããžãã¯ã³ã³ãããŒã©ãŒ
- ChatGPT ãèªç¶èšèªãæ§é å
- Googleã«ã¬ã³ã㌠ãäºå®ã®ç»é²å
âïž 4. å®è£ æé
ãã®ç§æžãããã¯ãLINEã»ChatGPTã»Googleã«ã¬ã³ããŒã»GAS ã®4ã€ã飿ºãããŠæ§ç¯ããŸãã
4-1. LINE BotãäœæãWebhook URLãèšå®
- LINE Developers Console ã«ã¢ã¯ã»ã¹
- ãããã€ããŒãäœæïŒãªããã°æ°èŠäœæïŒ
- ãMessaging APIããéžæããŠãã£ãã«ãäœæ
- ãã£ãã«äœæåŸã以äžãèšå®ïŒ
- Webhookéä¿¡ â ãªã³
- å¿çã¡ãã»ãŒãž â ãªã
- Webhook URL â åŸã»ã©äœæãã GAS ã® Webã¢ããªURLã貌ã
- ãã£ãã«ã¢ã¯ã»ã¹ããŒã¯ã³ãæ§ããïŒGASå ã§äœ¿ãïŒ
4-2. Google Apps ScriptïŒGASïŒã§Webã¢ããªãäœæ
- Google Apps Script ã«ã¢ã¯ã»ã¹
- æ°èŠãããžã§ã¯ããäœæãã以äžã®ãããªæ§æã§èšè¿°ïŒ
function doPost(e) {
const json = JSON.parse(e.postData.contents);
const replyToken = json.events[0].replyToken;
const userMessage = json.events[0].message.text;
const replyText = runSchedulerBot(userMessage); // æ¬äœããžãã¯
UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", {
method: "post",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + LINE_ACCESS_TOKEN
},
payload: JSON.stringify({
replyToken: replyToken,
messages: [{ type: "text", text: replyText }]
})
});
return ContentService.createTextOutput("OK");
}
-
runSchedulerBot() 颿°ã§ã¯ãChatGPT API ãšã®ãããšãã»Googleã«ã¬ã³ããŒæäœãªã©ã®åŠçãå®è£ ïŒåŸè¿°ïŒ -
ããããã€ãâãæ°ãããããã€ãâãWebã¢ããªã
- ã¢ã¯ã»ã¹æš©ã¯ãå šå¡ïŒå¿åãŠãŒã¶ãŒå«ãïŒãã«èšå®
- çºè¡ãããURLã LINE ã® Webhook ã«ç»é²
4-3. çŸåšã®æ¥æãååŸããŠåºæºã«ãã
ããããã¯runSchedulerBot颿°ã®è§£èª¬ãè¡ããŸãã
ãã®é¢æ°ã¯ãLINEãã¹ãã¬ããã·ãŒãããã®å
¥åã¡ãã»ãŒãžïŒuserMessageïŒãããšã«ãChatGPTã«åãåãããäºå®ã®ç»é²ã»ç¢ºèªã»åé€ãè¡ãæ¬äœããžãã¯ã§ãã
ãŸããGPT ã«ãä»ãäœå¹Žäœæäœæ¥ãããäŒãããããçŸåšæå»ãååŸããŠããã³ããå ã«çµã¿èŸŒã¿ãŸãã
function runSchedulerBot(userMessage) {
const now = new Date();
const nowStr = Utilities.formatDate(now, Session.getScriptTimeZone(), "yyyy/MM/dd HH:mm");
<--- çç¥ --->
}
function formatDate(date) {
return Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy/MM/dd HH:mm");
}
ããã«ãããGPTããææ¥ããä»é±æ«ããªã©ã®çžå¯Ÿè¡šçŸãæ£ããè§£éã§ããããã«ãªããŸãã
4-4. ChatGPT ãžã®ããã³ããèšèš
次ã«ãGPT ã«å¯ŸããŠæåŸ
ããåºå圢åŒãæç€ºãã ããã³ãã ãçµã¿ç«ãŠãŸãã
以äžã¯ç°¡ç¥åããããã³ããã§ãã
const systemPrompt = `
çŸåšã®æ¥æã¯ ${nowStr} ã§ãã
ãããåºæºã«ããææ¥ããæ¥é±ããâ¯æâ¯æ¥ããªã©ãæ£ç¢ºã«è§£éããŠãã ããã
ãåºåãã©ãŒãããã
#æäœ
ç»é² / åé€ / ç¢ºèª ã®ãããã
#è¿ç
ç§æžãããäžå¯§ãªæç«
#æéïŒç¢ºèªæã¯å¿
é ïŒ
éå§: YYYY/MM/DD HH:mm
çµäº: YYYY/MM/DD HH:mm
#äºå®ïŒç»é²ã»å逿ã¯å¿
é ïŒ
ã¿ã€ãã«: ââ
éå§: YYYY/MM/DD HH:mm
çµäº: YYYY/MM/DD HH:mm
`;
-
#æäœã«ãã£ãŠåŠçã®çš®å¥ã倿 -
#äºå®ã¯ã¿ã€ãã«,éå§,çµäºãæç€º -
#æéïŒç¢ºèªæïŒã ChatGPT ã«æç€ºããŠå«ããããŸã
â ç»é²ã»åé€ã®æäœã§ã¯
#äºå®ãããã¯ã å¿ é ã§ããããã³ããå ã«æèšã
4-5. WebhookåŠç
systemPrompt ãš userMessage ã gpt-4o-mini ã«éä¿¡ããå¿çãååŸããŸãã
const requestOptions = {
method: "post",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + OPENAI_API_KEY
},
payload: JSON.stringify({
model: "gpt-4o-mini",
messages: [
{ role: "system", content: systemPrompt },
{ role: "user", content: userMessage }
]
})
};
const gptResponse = UrlFetchApp.fetch("https://api.openai.com/v1/chat/completions", requestOptions);
const json = JSON.parse(gptResponse.getContentText());
const replyText = json.choices[0].message.content.trim();
4.6 ChatGPT ã®åºåãè§£æããŠåŠçãåå²
ChatGPT ã®åºåããã以äžã®ãããã¯ãæ£èŠè¡šçŸã§æœåºããŸãã
const operationMatch = replyText.match(/#æäœ\s*([\s\S]*?)#è¿ç/);
const responseMatch = replyText.match(/#è¿ç\s*([\s\S]*?)(#æé|#äºå®)/);
const periodMatch = replyText.match(/#æé\s*([\s\S]*?)($|#äºå®)/);
const scheduleMatch = replyText.match(/#äºå®\s*([\s\S]*)/);
æœåºããå 容ãããšã«ãæäœçš®å¥ãšè¿çæã決å®ããŸãã
let operation = "ç»é²";
let userMessageFormatted = "";
if (operationMatch) {
operation = operationMatch[1].trim();
}
if (responseMatch) {
userMessageFormatted = responseMatch[1].trim();
}
4.7 æäœãã確èªãã®å ŽåïŒäºå®ã®ç¢ºèªïŒ
æäœãã確èªãã®ãšãã¯#æéããéå§ã»çµäºæ¥æãåãåºãããã®æéã«ç»é²ãããŠããäºå®ãååŸããŸãã
const events = CalendarApp.getDefaultCalendar().getEvents(start, end);
if (events.length > 0) {
userMessageFormatted += "\n\nð
ç»é²ãããŠããäºå®:\n";
userMessageFormatted += events.map(e => {
const time = formatDate(e.getStartTime());
return `ã»${time} ïœ ${e.getTitle()}`;
}).join("\n");
} else {
userMessageFormatted += "\nïŒãã®æéã«äºå®ã¯ãããŸããïŒ";
}
æäœããç»é²ããŸãã¯ãåé€ãã®å Žå
â ç»é²
calendar.createEvent(title, start, end);
return `ð
${title} ã®äºå®ãç»é²ããŸããã`;
ðïž åé€
const events = calendar.getEvents(start, end);
const targetEvents = events.filter(event => event.getTitle().includes(title));
if (targetEvents.length > 0) {
targetEvents.forEach(event => event.deleteEvent());
return `ðïž ${targetEvents.length} ä»¶ã®ã${title}ãã®äºå®ãåé€ããŸããã`;
} else {
return `âã${title}ãã®äºå®ãèŠã€ãããŸããã§ããã`;
}
â 5. åäœäŸ
| å ¥åäŸ | çµæ |
|---|---|
| ææ¥ã®10æã«ããå ¥ã㊠| ð äºå®ãGoogleã«ã¬ã³ããŒã«ç»é²ããã |
| ææ¥ã®äºå®æã㊠| â ç»é²æžã¿ã®äºå®äžèЧã衚瀺ããã |
| ææ¥ã®äºå®ãã£ã³ã»ã« | ðïž æå®ã®äºå®ãåé€ããã |
以äžã¯å®éã« LINE ã«å ¥åããŠãGoogleã«ã¬ã³ããŒãšé£åããåäœçµæã§ãã
ð äºå®ãç»é²ãã
å ¥åïŒ
ææ¥ã®10æãã1æéãçŸå®¹é¢ã®äºå®ãå ¥ããŠ
çµæïŒ
ð çŸå®¹é¢ã®äºå®ãç»é²ããŸããã


ð äºå®ã確èªãã
å ¥åïŒ
ææ¥ã®äºå®ãæããŠ
çµæïŒ
ææ¥ã®äºå®ã確èªããããŸãã
ð
ç»é²ãããŠããäºå®ïŒ
- 2025/04/23 10:00~ çŸå®¹é¢

ðïž äºå®ãåé€ãã
å ¥åïŒ
ææ¥ã®çŸå®¹é¢ã®äºå®ãåé€ããŠ
çµæïŒ
ðïž 1ä»¶ã®ãçŸå®¹é¢ãã®äºå®ãåé€ããŸããã

ãã¹ãŠã®æäœãèªç¶èšèªã§å®çµããŸãããããLINEã§å®çµããã®ã§ãäºå®ç®¡çããã£ãšèº«è¿ã«ãªããŸãïŒ
ð¬ ææ³ã»æ¯ãè¿ã
ä»åã®éçºãéããŠãèªç¶èšèªã§äºå®ãç»é²ã»ç¢ºèªã§ããä»çµã¿ããããšãæ¥åžžã®äºå®ç®¡çããšãŠãã¹ã ãŒãºã«ãªããšå®æããŸããã
ç¹ã« äºå®ã®ç»é²ãšç¢ºèªã¯å®å®ããŠåäœã§ããŸãããLINE ã«ãææ¥10æã«çŸå®¹é¢ããšè©±ããããã ãã§äºå®ãå ¥ãã®ã¯ãã¡ãã£ãšæªæ¥æããããŸãã
ãã ããå逿©èœã«ã€ããŠã¯ãŸã äžå®å®ãªéšåãæ®ã£ãŠãããå ¥åå 容ã«ãã£ãŠåé€å¯Ÿè±¡ãèŠã€ãããªãã±ãŒã¹ããããŸããããã®ç¹ã¯ä»åŸã®ç²ŸåºŠåäžã®èª²é¡ã§ãã
ð€ å®éã«äœ¿ããã©ããïŒ
æ£çŽãªãšããããã±ã£ãšã«ã¬ã³ããŒãèŠãããšããã¯ãã£ã±ã Google ã«ã¬ã³ããŒãã®ãã®ãéããæ¹ãæ©ãããšããããŸãããã®ãããLINEãããã¯ãããŸã§è£å©çã»äžŠåçã«äœ¿ãã®ãçŸå®çãããããŸããã
ãšã¯ããããæããµããã£ãŠããŠã¹ããããè§ŠããªãããäŒè©±æèŠã§äºå®ãå ¥ãããããšãã£ãã·ãŒã³ã§ã¯ããªã䟿å©ã«æããŸããã
ð® ä»åŸã®ã¢ã€ãã¢ã»æ¹è¯ãããããš
- â æ¯æ©21:00ã«ãææ¥ã®äºå®ããLINEã§ãªãã€ã³ãããŠãããæ©èœã远å ããã
- ð ããã¹ãã¿ã¹ã¯ãç· åã管çã§ããããã«æ¡åŒµããŠãããã
- ð ã«ã¬ã³ããŒãèŠãŠã空ããŠããæéãã«èªåã§äºå®ãã¿ã¹ã¯ãé 眮ããŠããããããªãææ¡åã®ç§æžAI ã«ããŠãããã
ä»åã®åãçµã¿ã¯ããæªæ¥ã®äºå®ç®¡çãã«äžæ©è¿ã¥ããæèŠããããŸãããâš
ð 7. ãããã«
ãã®èšäºãèªãã§ããã£ãŠã¿ããïŒããšæã£ãŠãããããå¬ããã§ãã
詊ããŠã¿ãããZenn ã X ã§ææ³ãèãããŠãã ããïŒ
Discussion