Googleスプレッドシートの予定をLINE Botで取得する
前回の記事「Google Apps ScriptでLINE Botを作る基本」では、GASを使ってLINE Botを作成し、メッセージを受信・返信する方法を紹介しました。
今回は、Googleスプレッドシートを使ってLINE Botでスケジュールを取得する方法を解説します。
1. Googleスプレッドシートの準備
まずは、Googleスプレッドシートに予定データを用意します。
スプレッドシートの作成手順
- Googleスプレッドシートを開く
- シート名を 「年間予定」 に変更
- 以下のようなデータを入力
日付 | 1年生の予定 | 2年生の予定 | 3年生の予定 | 特別な予定 |
---|---|---|---|---|
2025/04/01 | 入学式 | オリエンテーション | 実習開始 | 全体集会 |
2025/04/02 | 授業開始 | 授業開始 | 研究発表 | - |
このシートから予定データを取得して、LINE Botの返信メッセージに組み込みます。
2. GASでスプレッドシートの予定を取得する関数を作成
以下のスクリプトをGASに追加し、指定した日付のスケジュールを取得できるようにします。
function getSchedule(date) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("年間予定");
if (!sheet) {
Logger.log("エラー: シートが見つかりません");
return "エラー: シートが見つかりません";
}
var data = sheet.getDataRange().getValues();
Logger.log("取得データ: " + JSON.stringify(data));
var year1 = [], year2 = [], year3 = [];
var specialEvents = [];
for (var i = 1; i < data.length; i++) {
var sheetDate = new Date(data[i][0]);
var formattedSheetDate = Utilities.formatDate(sheetDate, Session.getScriptTimeZone(), "yyyy/MM/dd");
if (formattedSheetDate === date) {
if (data[i][1]) year1.push(data[i][1]);
if (data[i][2]) year2.push(data[i][2]);
if (data[i][3]) year3.push(data[i][3]);
if (data[i][4]) specialEvents.push(data[i][4]);
}
}
var message = date + "の予定は\n";
message += "1年生: " + (year1.length > 0 ? year1.join(", ") : "なし") + "\n";
message += "2年生: " + (year2.length > 0 ? year2.join(", ") : "なし") + "\n";
message += "3年生: " + (year3.length > 0 ? year3.join(", ") : "なし") + "\n";
if (specialEvents.length > 0) {
message += "特別な予定: " + specialEvents.join(", ") + "\n";
}
message += "です。\n※予定が更新されていない可能性があります。各自確認してください。\n";
message += "https://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit";
Logger.log("返信メッセージ: " + message);
return message;
}
3. LINE Botのメッセージ処理を更新
次に、doPost
関数を修正し、スケジュールを取得できるようにします。
function doPost(e) {
try {
var json = JSON.parse(e.postData.contents);
Logger.log("受信データ: " + JSON.stringify(json));
var events = json.events;
if (!events || events.length === 0) {
return ContentService.createTextOutput(JSON.stringify({ "status": "no event" }))
.setMimeType(ContentService.MimeType.JSON);
}
var replyToken = events[0].replyToken;
var userMessage = events[0].message.text.trim();
var userId = events[0].source && events[0].source.userId ? events[0].source.userId : null;
if (!userId) {
Logger.log("エラー: userIdが取得できませんでした。");
sendLineReply(replyToken, "エラー: ユーザーIDが取得できませんでした。");
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": "userId not found" }))
.setMimeType(ContentService.MimeType.JSON);
}
var replyMessage = "すみません、理解できませんでした。";
if (userMessage.match(/\d{4}\/\d{2}\/\d{2}/)) {
replyMessage = getSchedule(userMessage);
} else if (userMessage.includes("明日")) {
var today = new Date();
today.setDate(today.getDate() + 1);
var tomorrow = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy/MM/dd");
replyMessage = getSchedule(tomorrow);
} else if (userMessage.match(/年間予定|スケジュール|カレンダー/)) {
replyMessage = "年間予定はこちらです!\nhttps://docs.google.com/spreadsheets/d/YOUR_SPREADSHEET_ID/edit";
}
sendLineReply(replyToken, replyMessage);
return ContentService.createTextOutput(JSON.stringify({ "status": "success" }))
.setMimeType(ContentService.MimeType.JSON);
} catch (error) {
Logger.log("エラー: " + error.toString());
return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": error.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
4. 動作テスト
以下の関数を実行し、スケジュール取得が正常に動作するか確認します。
function testGetSchedule() {
var testDate = "2025/04/01";
var result = getSchedule(testDate);
Logger.log("テスト結果: " + result);
}
5. まとめ
今回の記事では、Googleスプレッドシートと連携してLINE Botからスケジュールを取得する方法を紹介しました。
これを応用すれば、学校の行事予定や業務スケジュールをLINEで簡単に確認できるようになります。