2026年7月28日火曜日

LINEに位置情報を送る For LEZYNE & Garmin 

event_note7月 28, 2026 editBy shamu_shamu forumNo comments

以前LEZYNEの位置情報をLINEに飛ばすってのをやっていたんだけどLINE Notifyってサービスが終了して放置😢

かと言って自分でプログラム的なの書けないし今までのGAS(Gmail のラベル判定)を流用して出来ないかな?と思いChatGPTにぶん投げてみるとトントン拍子に話が進み「LINE Messaging API」を導入しなさいとご指示を受ける。

LINE Messaging APIだけど月に200通までは無料。

どんなに頑張っても200アクティビティを越える事も無いだろうからとりあえず安心ですw

流れは下記を参考に

📱 Gmailの特定メールをLINEへ通知する方法

2025年3月31日にLINE Notifyはサービス終了しました。
代わりにLINE Messaging APIを使えば今までと同じように通知できます。
STEP1 LINE公式アカウントを作成
  1. LINE Official Account Managerへアクセス
  2. 「アカウントを作成」をクリック
  3. LINEでログイン
  4. アカウント名を入力(例:Gmail通知)
  5. 業種を選択
  6. 作成
💡 ポイント
個人利用なら会社名などは不要です。
STEP2 Messaging APIを有効にする
  1. 設定をクリック
  2. Messaging APIをクリック
  3. 「Messaging APIを利用する」をクリック
  4. Providerを選択
  5. プライバシーポリシー・利用規約は空欄でもOK
STEP3 アクセストークンを取得
① LINE Developersを開く
② Messaging APIをクリック
Issueをクリック
④ 表示された文字列をコピー
⚠️ このアクセストークンはパスワードと同じです。
絶対に公開しないでください。
STEP4 Your User IDを取得
  1. Basic settingsを開く
  2. Your user IDをコピー
STEP5 Botを友だち追加
  1. QRコードを表示
  2. LINEで読み取る
  3. 友だち追加
  4. 「こんにちは」と送る
✅ 「メッセージありがとうございます!」と返信が来れば成功です。
STEP6 Apps Scriptへ設定
var channelAccessToken = "ここにChannel Access Token"; var userId = "ここにYour User ID";
完成!
🎉 これでGmailに届いたメールをLINEへ通知できるようになります。


と言う事でこれでおしまい!って事にはならずもういっちょ追加。

GarminのLiveTrackも追加出来ればよりもっと良くね!と思い再度ChatGPTに以前のコードを手直してもらいGarminにも対応出来るようにお願い。

何度かやり取りした結果下記のコードが完成!


LEZYNE & Garmin 対応LINEメッセージ

 

//========================
// 設定
//========================




var channelAccessToken = "xxxxxxxxxxxxx";
var userId = "Uxxxxxxxxxxxxxxxxx";

var labelName = "位置情報";          // Gmailラベル名
var subjectWord = "Follow OR LiveTrack";          // 件名に含まれる文字
var date = new Date(Date.now() - interval * 60 * 1000);

var after = Utilities.formatDate(
  date,
  Session.getScriptTimeZone(),
  "yyyy/MM/dd"
);

var query =
  'label:' + labelName +
  ' is:unread' +
  ' (subject:Follow OR subject:LiveTrack)' +
  ' after:' + after;
var interval = 10;                    // 何分前まで検索するか

//========================
// LINEへ送信
//========================
function sendLine(message) {

  Logger.log("message=[" + message + "]");

  var payload = {
    "to": userId,
    "messages": [
      {
        "type": "text",
        "text": message
      }
    ]
  };

  Logger.log(JSON.stringify(payload));

  var options = {
    method: "post",
    contentType: "application/json; charset=UTF-8",
    headers: {
      Authorization: "Bearer " + channelAccessToken
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  var res = UrlFetchApp.fetch(
    "https://api.line.me/v2/bot/message/push",
    options
  );

  Logger.log(res.getResponseCode());
  Logger.log(res.getContentText());
}
//========================
// メイン
//========================
function main() {

  Logger.log("START");

  var date = new Date(Date.now() - interval * 60 * 1000);




  var after = Utilities.formatDate(
    date,
    Session.getScriptTimeZone(),
    "yyyy/MM/dd"
  );

  var query =
    'label:' + labelName +
    ' is:unread' +
    //' subject:"' + subjectWord + '"' +
      ' (subject:Follow OR subject:LiveTrack)' +
    ' after:' + after;

  Logger.log(query);

  var threads = GmailApp.search(query);

  Logger.log("件数=" + threads.length);

  for (var i = 0; i < threads.length; i++) {

    var msg = threads[i].getMessages().pop();

    var body = msg.getPlainBody();

    Logger.log(body);

    //lezyneのみ
    //var match = body.match(
    //  /https:\/\/www\.gpsroot\.com\/livetracking\/\?[^"' <]+/
    //);

//lezyneとgarmin両方に対応ヴァージョン
var match = body.match(
  /https:\/\/www\.gpsroot\.com\/livetracking\/\?[^"' <]+/
);

if (!match) {
  match = body.match(
    /https:\/\/livetrack\.garmin\.com\/[^"' <]+/
  );
}

    if (!match) {
      Logger.log("URLが見つかりません");
      continue;
    }

var service = "";

if (match[0].indexOf("gpsroot.com") > -1) {
  service = "Lezyne Follow My Ride";
} else if (match[0].indexOf("livetrack.garmin.com") > -1) {
  service = "Garmin LiveTrack";
} else {
  service = "位置情報";
}

var text =
  "🚴 " + service + "🏃 "+ "\n\n" +
  "下のリンクをクリックすると位置情報が確認できるかも? \n\n" +
  match[0];

    sendLine(text);

    msg.markRead();
  }
}

//LINEテスト送信 終わったらコメントアウトする
//function testLine() {
  //sendLine("📱 LINE送信テストです!\nGASから正常に送信できました。");
//}


上記のはGarminの時の画面。

色々残骸も残ってるしLEZYNの部分なんて殆どの人が不要なはずw
不要な部分は適時変えてもらうとしてAI便利やなって話でした。
ちなみにこれだと自分にしか?メッセージ飛ばないのでグループラインを作成して設定とかをもうちょっとごにょごにょしたらちゃんと出来るようになりました。
※詳しくはChatGPTに直し方聞いてねw

0 comments:

コメントを投稿

お気軽にコメント下さい