Googleスプレッドシートの予定をLINE Botで取得する

# Googleスプレッドシートの予定をLINE Botで取得する

前回の記事「[Google Apps ScriptでLINE Botを作る基本](https://qiita.com/rohtxe/items/650c3311f4a3a5d8ba4d)」では、GASを使ってLINE Botを作成し、メッセージを受信・返信する方法を紹介しました。  
今回は、Googleスプレッドシートを使ってLINE Botでスケジュールを取得する方法を解説します。

---

## 1. Googleスプレッドシートの準備

まずは、Googleスプレッドシートに予定データを用意します。

### スプレッドシートの作成手順
1. Googleスプレッドシートを開く
2. シート名を **「年間予定」** に変更
3. 以下のようなデータを入力

| 日付       | 1年生の予定 | 2年生の予定 | 3年生の予定 | 特別な予定 |
|------------|------------|------------|------------|------------|
| 2025/04/01 | 入学式     | オリエンテーション | 実習開始 | 全体集会 |
| 2025/04/02 | 授業開始   | 授業開始   | 研究発表 | - |

このシートから予定データを取得して、LINE Botの返信メッセージに組み込みます。

---

## 2. GASでスプレッドシートの予定を取得する関数を作成

以下のスクリプトをGASに追加し、指定した日付のスケジュールを取得できるようにします。

```javascript
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` 関数を修正し、スケジュールを取得できるようにします。
```javascript
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. 動作テスト
以下の関数を実行し、スケジュール取得が正常に動作するか確認します。

```javascript
function testGetSchedule() {
  var testDate = "2025/04/01";
  var result = getSchedule(testDate);
  Logger.log("テスト結果: " + result);
}
```
---
# 5. まとめ
今回の記事では、Googleスプレッドシートと連携してLINE Botからスケジュールを取得する方法を紹介しました。
これを応用すれば、学校の行事予定や業務スケジュールをLINEで簡単に確認できるようになります。

---
# 次の記事
### 👉 「GASでLINE Botの応答を改善する（エラー処理＆リッチメニュー）」