⭐️LINE Notify終了のお知らせ😭 → Messaging API移行でイケてる通知システム作る✨

## 🎀 Notifyが終了⁉️OMG〜😱

みんな大好きLINE Notifyが、サービス終了しちゃうらしいの〜😭  
**2025年3月31日** までだから、それまでに移行しなきゃダメ👀💦

> **公式の悲報😢**  
> [LINE Notify サービス終了のお知らせ](https://notify-bot.line.me/closing-announce)  

これからは、 **LINE Messaging API** っていうもっとイケてるやつを使って通知するんだって✨  
ま、Notifyよりいろいろ機能盛り盛りらしいから、ギャルも切り替えていくよ〜ん🌈

---

## Messaging APIってなに？🧐💭

Messaging APIって、Notifyより進化してるけど、ちょっとクセがある感じ💔  
でもね、超わかりやすく説明するから心配いらんよ🫶

### 💸 コスト感はこんな感じ！
- **Notify** は完全無料💖（感謝しかない🙏✨）
- **Messaging API** は無料枠があるけど、200通/月まで📩

例:  
10人グループに1メッセ送ると10通カウントされるの😱！
100人グループなら2回でアウト❌ 
仲間内の通知には正直キツいけど、**自分用とか特定の通知** なら余裕っしょ👌✨

---

## やってみた系🌟GASでWebhook連携✨

さてさて、LINEから届く通知を **Googleスプレッドシート** に保存するやつ作るよ〜ん📊💕

### 📋 手順はこうだよ！

1. **スプレッドシート作る**
   - シート名は「WebhookData」で決まりっしょ⭐️

2. **GASを書く**✍️💻
   - 以下のコードをペタッと貼り付けてね！

```javascript
// スプレッドシートID 🎀（スプレッドシートのURLからIDコピってね〜✨）
const SHEET_ID = "YOUR_SPREADSHEET_ID"; 
// 保存するシートの名前は「WebhookData」って感じで決まりっしょ⭐️
const SHEET_NAME = "WebhookData";

// Webhookからデータをキャッチ💌
function doPost(e) {
  // LINEから飛んできたリクエストデータをJSON形式に変換✨
  const contents = JSON.parse(e.postData.contents); 
  // イベントデータ（複数かも！）を抽出💃
  const events = contents.events;

  // スプレッドシートをオープンしてターゲットシートをゲット📝
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);

  // イベントデータを1つずつシートに記録していくよ〜ん🌈
  events.forEach(event => {
    const timestamp = new Date(event.timestamp); // イベント発生時刻をGet⏰
    const sourceType = event.source.type; // イベント元（user or group）をゲット📌
    const sourceId = event.source.userId || event.source.groupId; // userIDまたはgroupID取得🆔

    // スプレッドシートの次の行にデータを追加💃📊
    // 順番は [タイムスタンプ, 送信元タイプ, 送信元ID] だよ〜
    sheet.appendRow([timestamp, sourceType, sourceId]);
  });

  // LINEサーバーに「OKです〜💕」ってレスポンス返す
  return ContentService.createTextOutput(JSON.stringify({status: "success"}))
    .setMimeType(ContentService.MimeType.JSON);
}
```

3. **デプロイする🌈**
   - GASメニューから「デプロイ > ウェブアプリとしてデプロイ」やって、URLゲット🍭✨

4. **Webhook設定する📱**
   - [LINE Developer Console](https://developers.line.biz/)でWebhook URLをペタッと登録〜！

---

### 📈 実行結果を見てっ✨
LINEに何かメッセージ送ると、スプレッドシートに **Timestamp / SourceType / SourceID** がズラッと出てくるよ！👀🎉

---

## ギャル的困ったポイント👛

1. **アクセストークン問題😮‍💨**
   - Consoleでトークン作るのがちょいダル…けど1回だけだから頑張ろ💪✨

2. **送信先IDの謎（uid, gid）🤔**
   - **Webhook設定** して、友達登録とかグループ招待でIDゲットするんだけど…ちょっとめんどいw  
     超楽したいなら **GoogleスプレッドシートをWebアプリ化** して自動取得するのもアリかもね💖

一応サンプルのコードも書いたから載せとくね💻
```javascript
// 🌟スプレッドシートID（スプレッドシートURLからコピるだけっしょ〜！）
const SHEET_ID = "YOUR_SPREADSHEET_ID";
// 保存用シート名、デフォは "WebhookData" ね✨
const SHEET_NAME = "WebhookData";

// 💌 Webhookからのデータを受け取る
function doPost(e) {
  // JSONデータ解析するよ〜✨
  const contents = JSON.parse(e.postData.contents);
  const events = contents.events;

  // スプレッドシートをオープン💻
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);

  // イベントデータをシートに記録していくよん🎀
  events.forEach(event => {
    const timestamp = new Date(event.timestamp); // イベントの時間⏰
    const sourceType = event.source.type; // 送信元タイプ（userとかgroupとか）💃
    const sourceId = event.source.userId || event.source.groupId; // 送信元ID（uidかgidね）✨

    // スプレッドシートにペタっと保存📊
    sheet.appendRow([timestamp, sourceType, sourceId]);
  });

  // LINEにレスポンス送るからこれ大事〜🙌
  return ContentService.createTextOutput(JSON.stringify({status: "success"}))
    .setMimeType(ContentService.MimeType.JSON);
}

// 🔧 UID/GIDをゲットしやすくするためのシート初期化機能
function setupSheet() {
  const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME) 
                || SpreadsheetApp.openById(SHEET_ID).insertSheet(SHEET_NAME);

  // シートにカラム名入れとくと便利っしょ〜✨
  sheet.getRange(1, 1, 1, 3).setValues([["Timestamp", "SourceType", "SourceID"]]);
}
```

---

## まとめだよ🎀

- Notify終了だから、Messaging APIに移行しようね〜✨
- 無料枠気にしつつ、通知システムをリニューアル💖
- ギャルはコード書くのもイケてるし、GASでスプレッドシート連携とか余裕っしょ⭐️

---

みんなも超イケてる通知システム作ってみてね💌✨ なんかあったらコメントよろしくっ✌️💕