重點一句話
嗯⋯今天要來聊的,是那個⋯⋯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 帳號登入就可以了。登入之後,步驟大概是這樣:
- 建立 Provider: 這個就⋯⋯想成是一個開發者的名字,隨便取一個你記得住的就好。
 - 建立 Channel: 在 Provider 下面,選「Create a Messaging API channel」。這個 Channel 就是你的機器人本體。
 - 填寫基本資料: 幫你的機器人取個名字,上傳一張⋯⋯嗯⋯⋯大頭貼。其他就隨意填。
 - 取得 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 Sheet,點上面選單的「擴充功能」,然後選「Apps Script」。 這會開一個新的⋯⋯新的程式編輯器分頁。
- 貼上程式碼: 把原本裡面有的 `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); } - 修改設定值: 你需要改兩個地方。
  
- `CHANNEL_ACCESS_TOKEN`:把你剛剛從 LINE Developers 網站複製的那一長串,貼到單引號裡面。
 - `SHEET_ID`:回到你的 Google Sheet,看一下網址列。網址會長得像 `.../spreadsheets/d/一長串亂碼/edit`。把那一長串亂碼複製下來,貼到單引號裡面。對,就是這個 ID。
 
 - 部署成網路應用程式: 這是最關鍵的一步。點右上角的藍色按鈕「部署」,選「新增部署」。在「選取類型」那邊,選「網頁應用程式」。然後⋯⋯在「誰可以存取」的下拉選單,一定要選「任何人」。這個很重要,不然LINE找不到你的程式。最後按下「部署」。
 - 取得 Webhook URL: 部署成功後,它會給你一個⋯⋯一個網址,結尾是 `.../exec`。這個就是你的 Webhook URL,第二把鑰匙。把它複製下來。
 
第四步:把 LINE 和 Google 連起來
好,就快⋯⋯快完成了。我們現在回到 LINE Developers 的網站,就是你機器人的設定頁面。
找到「Messaging API」頁籤,裡面有一個「Webhook settings」。把剛剛從 Google Apps Script 複製的那個 `.../exec` 網址,貼到「Webhook URL」欄位裡。 然後,下面有個「Use webhook」,把它打開。
這樣⋯⋯就完成了。你可以把你的機器人加到一個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 的核心,所以⋯⋯嗯⋯⋯短期內應該是不用擔心它會被關掉。只是想提醒一下,免得你把這兩個東西搞混了。
好了,差不多就是這樣。希望這個⋯⋯嗯⋯⋯教學對你有幫助。除了簽到,你還想用這個系統做什麼自動化紀錄呢?像是回報午餐訂單?或是⋯⋯回報工作進度?留言分享看看你的想法吧!
                            
												
                                            