Google Apps ScriptでLINE Botを作る基本

# Google Apps ScriptでLINE Botを作る基本

Google Apps Script（GAS）を使って公式LINE Botを作る方法を解説します。  
この記事では、`doPost` 関数を使ってLINEからのメッセージを受信し、返信する基本的な仕組みを紹介します。

---

## 1. Google Apps Scriptの準備

まずは、Google Apps Script（GAS）のプロジェクトを作成しましょう。

### 手順
1. [Google Apps Script](https://script.google.com/) にアクセス
2. `新しいプロジェクト` を作成
3. `コード.gs` に以下のコードを追加

---

## 2. `doPost` 関数の実装

LINEからのメッセージを受信し、返信する基本的な処理を行います。

```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);
    }

    Logger.log("ユーザーID: " + userId);

    var replyMessage = "すみません、理解できませんでした。";
    if (userMessage.includes("こんにちは")) {
      replyMessage = "こんにちは！";
    } else if (userMessage.includes("天気")) {
      replyMessage = "今日の天気は晴れです！";
    }

    Logger.log("返信メッセージ: " + replyMessage);
    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);
  }
}
```
---
このdoPost関数は、Google Apps Script（GAS）を使用してLINE BotのWebhookとして動作する処理です。
以下に詳しく明記してあります

https://qiita.com/akaunntonikome/items/fb9036df6890b82d30db

---

## 3. LINE Botへメッセージを送信する関数
LINE APIを使ってメッセージを返信する処理を追加します。
```javascript:javascript
function sendLineReply(replyToken, message) {
  var channelAccessToken = "YOUR_CHANNEL_ACCESS_TOKEN";

  var url = "https://api.line.me/v2/bot/message/reply";
  var payload = {
    "replyToken": replyToken,
    "messages": [{ "type": "text", "text": message }]
  };

  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + channelAccessToken
    },
    "payload": JSON.stringify(payload)
  };

  try {
    var response = UrlFetchApp.fetch(url, options);
    Logger.log("LINE返信レスポンス: " + response.getContentText());
  } catch (error) {
    Logger.log("LINE API送信エラー: " + error.toString());
  }
}

```
---
---
## 4. Webhookの設定
1.[LINE Developers](https://developers.line.biz/ja/) にアクセス
2.チャネルを作成
3.Messaging API の設定ページでWebhook URLをGASのデプロイURLに設定

---
## 5. 動作テスト
以下の関数を実行し、テストデータを送信してみましょう。

```javascript:javascript
function testDoPost() {
  var testEvent = {
    "postData": {
      "contents": JSON.stringify({
        "events": [
          {
            "replyToken": "test_reply_token",
            "source": { "userId": "test_user" },
            "message": { "text": "こんにちは" }
          }
        ]
      })
    }
  };

  var result = doPost(testEvent);
  Logger.log("テスト結果: " + result.getContentText());
}

```
---
---

## 6. Googleスプレッドシートと連携
次に、スプレッドシートのデータを取得し、LINE Botで返信できるようにします。
```javascript: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;
}

```
---
# まとめ
この記事では、Google Apps Scriptを使ってLINE Botを作成する基本的な方法を紹介しました。
次回は、Googleスプレッドシートと連携してスケジュールを取得する方法を解説します。

---
次の記事

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

https://qiita.com/rohtxe/items/eede989e6fb5b16e39f5