許多人收集訂單資訊或是收集問卷資料,都會使用google表單來做,google表單很方便讓我們能透過網路取得大家所填的資料,並且即時將資料儲存進google試算表。但是google表單的畫面長得千篇一律,而且比較沒有人味,如果透過Line的對話,讓填資料者覺得好像有個人在網路的那一端回應自己填報的資料,在填報時就會覺得較有趣且人性。今天練習寫了一個用Line收集這些表單資料的介面,它就像google表單一樣的功能,但是讓你感覺是用Line對話的方式,就可以把資料存進google的試算表了。
//以下的四列require裡的內容,請確認是否已經用npm裝進node.jsvar linebot = require('linebot');var express = require('express');var google = require('googleapis');var googleAuth = require('google-auth-library');//以下的引號內請輸入申請LineBot取得的各項資料,逗號及引號都不能刪掉var bot = linebot({ channelId: '請輸入LineBot的channelId', channelSecret: '請輸入LineBot的channelSecret', channelAccessToken: '請輸入LineBot的channelAccessToken'});//底下輸入client_secret.json檔案的內容var myClientSecret=請將client_secret.json檔案的內容放在這裡,前後不能加引號var auth = new googleAuth();var oauth2Client = new auth.OAuth2(myClientSecret.installed.client_id,myClientSecret.installed.client_secret, myClientSecret.installed.redirect_uris[0]);//底下輸入sheetsapi.json檔案的內容oauth2Client.credentials =請將sheetsapi.json檔案的內容放在這裡,前後不能加引號//試算表的ID,引號不能刪掉var mySheetId='請輸入試算表的ID編號';var myQuestions=[];var users=[];var totalSteps=0;var myReplies=[];//程式啟動後會去讀取試算表內的問題getQuestions();//這是讀取問題的函式function getQuestions() { var sheets = google.sheets('v4'); sheets.spreadsheets.values.get({ auth: oauth2Client, spreadsheetId: mySheetId, range:encodeURI('問題'), }, function(err, response) { if (err) { console.log('讀取問題檔的API產生問題:' + err); return; } var rows = response.values; if (rows.length == 0) { console.log('No data found.'); } else { myQuestions=rows; totalSteps=myQuestions[0].length; console.log('要問的問題已下載完畢!'); } });}//這是將取得的資料儲存進試算表的函式function appendMyRow(userId) { var request = { auth: oauth2Client, spreadsheetId: mySheetId, range:encodeURI('表單回應 1'), insertDataOption: 'INSERT_ROWS', valueInputOption: 'RAW', resource: { "values": [ users[userId].replies ] } }; var sheets = google.sheets('v4'); sheets.spreadsheets.values.append(request, function(err, response) { if (err) { console.log('The API returned an error: ' + err); return; } });}//LineBot收到user的文字訊息時的處理函式bot.on('message', function(event) { if (event.message.type === 'text') { var myId=event.source.userId; if (users[myId]==undefined){ users[myId]=[]; users[myId].userId=myId; users[myId].step=-1; users[myId].replies=[]; } var myStep=users[myId].step; if (myStep===-1) sendMessage(event,myQuestions[0][0]); else{ if (myStep==(totalSteps-1)) sendMessage(event,myQuestions[1][myStep]); else sendMessage(event,myQuestions[1][myStep]+'\n'+myQuestions[0][myStep+1]); users[myId].replies[myStep+1]=event.message.text; } myStep++; users[myId].step=myStep; if (myStep>=totalSteps){ myStep=-1; users[myId].step=myStep; users[myId].replies[0]=new Date(); appendMyRow(myId); } }});//這是發送訊息給user的函式function sendMessage(eve,msg){ eve.reply(msg).then(function(data) { // success return true; }).catch(function(error) { // error return false; });}const app = express();const linebotParser = bot.parser();app.post('/', linebotParser);//因為 express 預設走 port 3000,而 heroku 上預設卻不是,要透過下列程式轉換var server = app.listen(process.env.PORT || 8080, function() { var port = server.address().port; console.log("App now running on port", port);});PS.為什麼會有這一句「要問的問題已下載完畢!」?因為程式裡放了這一段碼
console.log('要問的問題已下載完畢!');所以出現這一句文字表示程式執行得沒問題。