LINE 通知設定指南

使用安全 Touch Mail 的「LINE 通知功能」的初始設定步驟。
※請務必在電腦(PC)上進行此設定。
【重要】每月免費訊息則數取決於您的 LINE 官方帳號方案。請根據註冊的 IC 卡數量評估適合的 LINE 官方帳號方案。
LINE Messaging API 費用

❶ 建立 LINE 官方帳號

LINE 官方帳號 建立帳號。

建立 LINE 官方帳號

※如果您從未用登入 LINE Official Account Manager 的帳號登入過 LINE Developers Console,在操作過程中會顯示註冊開發者資訊的畫面。請輸入您的姓名和電子郵件地址以建立開發者帳號。

❷ 啟用 Messaging API 並建立 channel

從帳號列表中選擇已建立的「LINE 官方帳號」
https://manager.line.biz/

帳號列表

前往「設定」

設定

前往「Messaging API」

Messaging API

前往「使用 Messaging API」

使用 Messaging API

建立 LINE Developers provider。
(如果已經建立 provider,您也可以選擇現有的 provider。)

建立 Provider

登入 LINE Developers Console
LINE Developers

LINE Developers 登入

選擇已建立(或選定)的 provider,並確認 channel 已建立。

確認 Channel

❸ 發行長期 Channel Access Token

發行位於已建立 channel 的「Messaging API 設定」標籤內的「Channel Access Token (長期)」。請複製它,因為稍後會在 GAS 中使用。

Channel Access Token (長期)

❹ 設定 Google Apps Script

建立一個新的 Google 試算表,並在第一列中,A欄輸入「IDm」,B欄輸入「LINE ID」,C欄輸入「連結日期與時間」。

從頂部選單的「擴充功能」開啟「Apps Script」並貼上以下程式碼。

開啟 Apps Script
// =========================================================
// 【初期設定】
// 將您的設施取得的「Channel Access Token」貼在下方
// =========================================================
const LINE_ACCESS_TOKEN = '請將發行的 Channel Access Token (長期) 貼在這裡';

/**
 * 處理來自應用程式和 LINE 的請求的主函式
 */
function doPost(e) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  try {
    const json = JSON.parse(e.postData.contents);

    // =========================================================
    // 處理 1:來自家長的連結設定 (接收來自 LINE 的 Webhook)
    // =========================================================
    if (json.events && json.events.length > 0) {
      const event = json.events[0];
      if (event.type === 'message' && event.message.type === 'text') {
        const text = event.message.text;
        const userId = event.source.userId;

        if (text.startsWith("idm=")) {
          const idm = text.replace("idm=", "").trim();
          // 在試算表中記錄 IDm 和 User ID
          sheet.appendRow([idm, userId, new Date()]);
          replyLineMessage(event.replyToken, "連結完成!\n您現在將收到來自 安全 Touch Mail 的通知。");
        }
      }
      return ContentService.createTextOutput(JSON.stringify({status: "success"})).setMimeType(ContentService.MimeType.JSON);
    }

    // =========================================================
    // 處理 2:來自應用程式的感應通知
    // =========================================================
    if (json.idm && json.action === 'touch') {
      const targetIdm = json.idm;
      const data = sheet.getDataRange().getValues();
      let targetUserId = null;

      // 從試算表底部尋找最新的連結資料
      for (let i = data.length - 1; i >= 1; i--) {
        if (String(data[i][0]) === String(targetIdm)) {
          targetUserId = data[i][1];
          break;
        }
      }

      if (targetUserId) {
        let messageText = "";

        // 優先使用在應用程式中設定的自訂訊息(如果有)
        if (json.custom_message) {
          messageText = json.custom_message;
        } else {
          // 否則,建立標準訊息
          messageText = 
            `來自【${json.terminal_name}】的 ${json.mode} 通知\n\n` +
            `${json.child_name} 已經 ${json.mode}。\n\n` +
            `地點:${json.location}\n` +
            `發送者:${json.terminal_name}\n` +
            `時間:${json.timestamp}`;
        }

        // 執行 LINE 發送
        pushLineMessage(targetUserId, messageText);
        
        return ContentService.createTextOutput(JSON.stringify({status: "success"})).setMimeType(ContentService.MimeType.JSON);
      } else {
        return ContentService.createTextOutput(JSON.stringify({status: "error", message: "User not linked"})).setMimeType(ContentService.MimeType.JSON);
      }
    }
  } catch (err) {
    return ContentService.createTextOutput(JSON.stringify({status: "error", message: err.toString()})).setMimeType(ContentService.MimeType.JSON);
  }
}

// ---------------------------------------------------------
// 輔助函式:發送回覆
// ---------------------------------------------------------
function replyLineMessage(replyToken, text) {
  const url = "https://api.line.me/v2/bot/message/reply";
  const payload = {
    "replyToken": replyToken,
    "messages": [{"type": "text", "text": text}]
  };
  const options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + LINE_ACCESS_TOKEN
    },
    "payload": JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options);
}

// ---------------------------------------------------------
// 輔助函式:發送推播訊息
// ---------------------------------------------------------
function pushLineMessage(userId, text) {
  const url = "https://api.line.me/v2/bot/message/push";
  const payload = {
    "to": userId,
    "messages": [{"type": "text", "text": text}]
  };
  const options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + LINE_ACCESS_TOKEN
    },
    "payload": JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options);
}

將程式碼中 '請將發行的 Channel Access Token (長期) 貼在這裡' 的部分,替換為您在步驟 3 中取得的您自己的 Channel Access Token

從畫面右上角的「部署」>「新增部署作業」,選擇類型為「網頁應用程式」,並將存取權限設定為「所有人」,然後執行。

執行部署

複製發行的「網頁應用程式網址」

複製 URL

※「網頁應用程式網址」也將在「安全 Touch Mail」的設定中使用。我們建議您使用可以從電腦存取的方法(例如電子郵件)將其分享到您的智慧型手機。

LINE Developers Console 上,點擊您建立的 channel 的「Messaging API 設定」標籤內的「Webhook URL」區塊的「編輯」,貼上複製的「網頁應用程式網址」。

此頁面上的 Bot 基礎 ID(以 @ 開頭的 ID)就是您連結的「LINE 官方帳號 ID」。此「LINE 官方帳號 ID」將在「安全 Touch Mail」的設定中使用。我們建議將其分享到您的智慧型手機。

貼上 Webhook URL

❺ 應用程式設定

開啟安全 Touch Mail 應用程式,並從初始設定畫面進入「LINE 通知設定」。

在「LINE 通知伺服器 URL」輸入您剛才分享的「網頁應用程式網址」。

在「設施的 LINE 官方 ID」輸入您剛才分享的「LINE 官方帳號 ID (以 @ 開頭的 ID)」,然後儲存。

❻ 顯示 LINE 連結用的行動條碼

完成到步驟 ❺ 的設定後,在「註冊/更新 IC 卡或智慧型手機」時將會顯示 LINE 連結用的行動條碼。
請接收通知的家長掃描此行動條碼並直接送出訊息,即可開始在 LINE 接收通知。

LINE 連結用的行動條碼

整個流程的參考網站