LINE群組簽到系統設定教學:自動化簽到功能建立步驟與管理技巧

Published on: | Last updated:

重點一句話

嗯⋯今天要來聊的,是那個⋯⋯LINE群組的自動簽到。其實,用一些免費工具,像Google Sheet和一個⋯⋯一個很簡單的程式,不用花錢,就可以自己做一個出來。聽起來好像很複雜,但等等我會一步一步講,其實,呃⋯⋯沒那麼難。

為什麼要自己做?不能用現成的嗎?

對,我知道,外面有很多現成的服務,像是什麼BotBonnie之類的,按幾個鈕就好了。 但⋯⋯有時候,你只是需要一個很⋯⋯很單純的功能,就是簽到、記錄時間,就這樣。那些服務可能功能太多,要付錢,設定起來反而眼花撩亂。自己做的好處,就是⋯⋯嗯,完全客製化,而且免費。還有就是,資料都存在你自己的Google Sheet裡面,比較安心。

我這邊整理了一個⋯⋯一個簡單的比較表,讓你感受一下差異。

方法 複雜度 成本 彈性 / 管理方式
單純用 LINE Notify 超低。基本上就是⋯⋯發個訊息而已。 免費。 幾乎沒有彈性。它就是個通知,沒辦法⋯⋯嗯⋯⋯記錄是誰、什麼時候簽的。除非你自己手動看。
本篇教的 (GAS + Google Sheet) 中等。要動一點點程式碼,但⋯⋯我會給你範本,照著貼就好。 完全免費。Google的服務。 很高。你可以自己改程式,加功能,像是簽退、或是⋯⋯統計遲到什麼的。資料都在自己的試算表裡,很好管理。
專業第三方服務 (例如打卡鐘App) 低。通常是圖形介面,點一點就好。 通常要月費或買斷,看功能。 功能很多,很專業。可能有GPS定位、防作弊什麼的。但就是⋯⋯被綁在那個平台上,比較死板。
簽到系統運作流程示意圖
簽到系統運作流程示意圖

怎麼做?步驟與要點

好,那我們⋯⋯就開始吧。過程會分成幾個部分:先去LINE那邊申請一個開發者帳號,然後設定Google Sheet,最後把兩邊用一小段程式碼⋯⋯嗯⋯⋯串起來。

第一步:建立你的 LINE Bot

這一步,主要是為了拿到跟LINE溝通的「鑰匙」。我們需要兩把鑰匙:一個是 Channel Access Token,另一個是⋯⋯呃⋯⋯等一下會用到的 Webhook URL。

首先,你要去一個叫 LINE Developers 的網站。 用你的 LINE 帳號登入就可以了。登入之後,步驟大概是這樣:

  1. 建立 Provider: 這個就⋯⋯想成是一個開發者的名字,隨便取一個你記得住的就好。
  2. 建立 Channel: 在 Provider 下面,選「Create a Messaging API channel」。這個 Channel 就是你的機器人本體。
  3. 填寫基本資料: 幫你的機器人取個名字,上傳一張⋯⋯嗯⋯⋯大頭貼。其他就隨意填。
  4. 取得 Channel Access Token: 建立好之後,點進你的機器人設定頁面,找到「Messaging API」這個頁籤。裡面會有一個「Channel access token (long-lived)」,點「issue」按鈕。你會得到一長串的⋯⋯嗯⋯⋯亂碼。這個要先複製下來,收好。這是第一把鑰匙。

做到這邊,你就已經有了一個⋯⋯一個空的機器人了。對了,裡面有個「Auto-reply messages」,記得把它關掉。不然你跟它說話,它會一直用預設訊息回你,很煩。

第二步:準備一個 Google Sheet 當資料庫

這個很簡單。就是⋯⋯去 Google Drive 開一個新的 Google Sheets 試算表。 然後,在第一行,看你想要記錄什麼欄位,就打什麼。最基本的,我覺得至少要有這三個:

  • 時間戳記 (Timestamp): 記錄簽到的時間。
  • 使用者ID (UserID): 記錄是誰簽到的。這個很重要,不然你不知道是誰。
  • 使用者名稱 (DisplayName): 顯示這個人的LINE名字,這樣比較⋯⋯比較直觀。

就這樣,一個空的表格,好了。我們先放著。

Google Apps Script 編輯器中的程式碼範例
Google Apps Script 編輯器中的程式碼範例

第三步:用 Google Apps Script 當作大腦

嗯⋯⋯現在我們要來寫一點點程式。不過別怕,基本上就是複製貼上,然後改幾個⋯⋯嗯⋯⋯你自己的設定值。

回到剛剛那個 Google Sheet,點上面選單的「擴充功能」,然後選「Apps Script」。 這會開一個新的⋯⋯新的程式編輯器分頁。

  1. 貼上程式碼: 把原本裡面有的 `function myFunction() { ... }` 這些都刪掉。然後把下面的程式碼,完整地⋯⋯對⋯⋯貼進去。
    
      // 這裡要換成你自己的 Channel Access Token
      const CHANNEL_ACCESS_TOKEN = '貼上你的Channel Access Token';
      
      // 這裡要換成你的 Google Sheet ID
      const SHEET_ID = '貼上你的Google Sheet ID';
      
      function doPost(e) {
      const event = JSON.parse(e.postData.contents).events;
      const replyToken = event.replyToken;
      const userId = event.source.userId;
      const messageText = event.message.text;
      
      // 收到「簽到」指令才動作
      if (messageText === '簽到') {
      const profile = getUserProfile(userId);
      const displayName = profile.displayName;
      
      const sheet = SpreadsheetApp.openById(SHEET_ID).getSheets();
      const timestamp = new Date();
      
      // 寫入資料到 Google Sheet
      sheet.appendRow([timestamp, userId, displayName]);
      
      // 回覆訊息給使用者
      const replyMessage = `哈囉,${displayName}!\n簽到成功囉!\n時間:${timestamp.toLocaleString('zh-TW', { timeZone: 'Asia/Taipei' })}`;
      replyToUser(replyToken, replyMessage);
      }
      
      return ContentService.createTextOutput(JSON.stringify({'status': 'ok'})).setMimeType(ContentService.MimeType.JSON);
      }
      
      // 取得使用者個人資料
      function getUserProfile(userId) {
      const url = `https://api.line.me/v2/bot/profile/${userId}`;
      const options = {
      'method': 'get',
      'headers': {
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
      }
      };
      const response = UrlFetchApp.fetch(url, options);
      return JSON.parse(response.getContentText());
      }
      
      // 回覆訊息
      function replyToUser(replyToken, message) {
      const url = 'https://api.line.me/v2/bot/message/reply';
      const payload = {
      'replyToken': replyToken,
      'messages': [{
      'type': 'text',
      'text': message
      }]
      };
      const options = {
      'method': 'post',
      'contentType': 'application/json',
      'payload': JSON.stringify(payload),
      'headers': {
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
      }
      };
      UrlFetchApp.fetch(url, options);
      }
      
  2. 修改設定值: 你需要改兩個地方。
    • `CHANNEL_ACCESS_TOKEN`:把你剛剛從 LINE Developers 網站複製的那一長串,貼到單引號裡面。
    • `SHEET_ID`:回到你的 Google Sheet,看一下網址列。網址會長得像 `.../spreadsheets/d/一長串亂碼/edit`。把那一長串亂碼複製下來,貼到單引號裡面。對,就是這個 ID。
  3. 部署成網路應用程式: 這是最關鍵的一步。點右上角的藍色按鈕「部署」,選「新增部署」。在「選取類型」那邊,選「網頁應用程式」。然後⋯⋯在「誰可以存取」的下拉選單,一定要選「任何人」。這個很重要,不然LINE找不到你的程式。最後按下「部署」。
  4. 取得 Webhook URL: 部署成功後,它會給你一個⋯⋯一個網址,結尾是 `.../exec`。這個就是你的 Webhook URL,第二把鑰匙。把它複製下來。

第四步:把 LINE 和 Google 連起來

好,就快⋯⋯快完成了。我們現在回到 LINE Developers 的網站,就是你機器人的設定頁面。

找到「Messaging API」頁籤,裡面有一個「Webhook settings」。把剛剛從 Google Apps Script 複製的那個 `.../exec` 網址,貼到「Webhook URL」欄位裡。 然後,下面有個「Use webhook」,把它打開。

這樣⋯⋯就完成了。你可以把你的機器人加到一個LINE群組裡,然後在群組裡打「簽到」兩個字,看看會發生什麼事。順利的話,機器人會回你簽到成功,然後你的 Google Sheet 也會多一筆資料。

LINE 聊天室與 Google Sheet 簽到結果對照
LINE 聊天室與 Google Sheet 簽到結果對照

還能怎麼玩?一些變形應用

嗯⋯⋯基本的簽到會了之後,其實可以做很多變化。程式碼稍微改一下⋯⋯就可以。

  • 簽退功能: 你可以在程式碼裡加一個 `else if (messageText === '簽退')` 的判斷,然後⋯⋯嗯⋯⋯做跟簽到一樣的事,只是回覆的訊息改成「簽退成功」。這樣一張表就可以同時管上班下班。
  • 地點回報: 如果你希望大家簽到的時候,順便回報位置。可以請大家用 LINE 的「位置資訊」功能,然後⋯⋯程式那邊要改一下,去接收位置資訊的資料格式。這個稍微複雜一點,要去查一下 LINE 的文件,看位置訊息長什麼樣子。
  • 防止作弊?嗯⋯⋯有點難: 老實說,這種方法很難完全防止作弊。 因為任何人只要知道要打「簽到」兩個字,他就可以簽。一個⋯⋯一個比較土法煉鋼的方法是,你可以每天改一次關鍵字,例如改成「簽到1103」,然後把關鍵字寫在白板上,只讓現場的人看到。但⋯⋯對,這很麻煩。更進階的作法,像是結合GPS定位打卡,那通常就要用付費的專業服務了。

這個方法的限制跟⋯⋯缺點

當然,這個免費的方法不是⋯⋯不是完美的。它有一些天生的限制。

最大的問題就是,它很依賴 Google 的服務。如果哪天 Google Apps Script 不穩,或是⋯⋯LINE 的 API 規則改了,它就可能會壞掉。 還有,它的反應速度⋯⋯嗯⋯⋯不會非常快,有時候可能會延遲個幾秒鐘。畢竟是免費的嘛。

另外,像剛剛提到的,防弊能力很弱。 如果你的場景⋯⋯是很嚴肅的,需要很精確、不能造假的⋯⋯那種出缺勤記錄,那我會覺得,你可能還是要考慮花錢買專業的打卡系統。 這個方法,比較適合用在一些⋯⋯比較輕鬆的場合,像是社團活動、讀書會,或是小辦公室內部自己記錄方便而已。

對了,還有一個要注意的。LINE官方有宣布說,那個很單純的 LINE Notify 服務會在2025年3月底結束。 不過!我們今天用的這個不是 LINE Notify,我們用的是更完整的「Messaging API」,這個是 LINE Bot 的核心,所以⋯⋯嗯⋯⋯短期內應該是不用擔心它會被關掉。只是想提醒一下,免得你把這兩個東西搞混了。

好了,差不多就是這樣。希望這個⋯⋯嗯⋯⋯教學對你有幫助。除了簽到,你還想用這個系統做什麼自動化紀錄呢?像是回報午餐訂單?或是⋯⋯回報工作進度?留言分享看看你的想法吧!

Related to this topic:

Comments

  1. Guest 2025-05-17 Reply
    這篇文章的重點真的很實用,特別是自動化簽到流程的部分!我在國外的群組中也嘗試過類似的方法,效果相當不錯。希望能學到更多提升互動的小技巧,大夥一起來分享經驗吧!
撥打專線 LINE免費通話