如何用LineBot取代Google表單
許多人收集訂單資訊或是收集問卷資料,都會使用google表單來做,google表單很方便讓我們能透過網路取得大家所填的資料,並且即時將資料儲存進google試算表。但是google表單的畫面長得千篇一律,而且比較沒有人味,如果透過Line的對話,讓填資料者覺得好像有個人在網路的那一端回應自己填報的資料,在填報時就會覺得較有趣且人性。今天練習寫了一個用Line收集這些表單資料的介面,它就像google表單一樣的功能,但是讓你感覺是用Line對話的方式,就可以把資料存進google的試算表了。
1、在雲端硬碟建立一個google表單如下:
1、在雲端硬碟建立一個google表單如下:
2、將表單建立與試算表的連結
2、將表單建立與試算表的連結
3、將表單建立與試算表的連結
3、將表單建立與試算表的連結
4、取得表單的連結網址,以便給他人輸入內容
4、取得表單的連結網址,以便給他人輸入內容
5、透過表單輸入的資料,會儲存進試算表裡
5、透過表單輸入的資料,會儲存進試算表裡
6、在原來的試算表上新增一個工作表,取名叫「問題」,這個工作表是要給Line問使用者問題,並且回應一些文字回饋用的。
6、在原來的試算表上新增一個工作表,取名叫「問題」,這個工作表是要給Line問使用者問題,並且回應一些文字回饋用的。
7、將試算表網址列如下圖的這個部份的ID複製下來,接下來的程式需要用到它
7、將試算表網址列如下圖的這個部份的ID複製下來,接下來的程式需要用到它
8、舊有的index.js可考慮備份成另一個檔,然後將下面的程式碼整個放進index.js裡面
8、舊有的index.js可考慮備份成另一個檔,然後將下面的程式碼整個放進index.js裡面
請注意,底下的程式碼請依據程式內的註釋,有六行要將之前取得的各種憑證放入修改:
請注意,底下的程式碼請依據程式內的註釋,有六行要將之前取得的各種憑證放入修改:
//以下的四列require裡的內容,請確認是否已經用npm裝進node.js
var 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);
});
9、接下來要將修改過的index.js傳上heroku。因為之前已經上傳過了,所以會和第一次上傳時指令稍微不同。
9、接下來要將修改過的index.js傳上heroku。因為之前已經上傳過了,所以會和第一次上傳時指令稍微不同。
- d:
- cd bottest (以上指令請依據你的資料夾位置做更改)
- heroku login (這邊請依據提示輸入申請heroku時,所填的帳號及設定的密碼)
- git add .
- git commit -am 'ok'
- git push heroku master
10、上傳完之後,請回到heroku的網頁,依下圖操作,如果能看到「要問的問題已下載完畢!」,表示程式已沒有問題。如果沒看到,表示程式無法啟動,請重新修改程式。
10、上傳完之後,請回到heroku的網頁,依下圖操作,如果能看到「要問的問題已下載完畢!」,表示程式已沒有問題。如果沒看到,表示程式無法啟動,請重新修改程式。
PS.為什麼會有這一句「要問的問題已下載完畢!」?因為程式裡放了這一段碼
console.log('要問的問題已下載完畢!');
所以出現這一句文字表示程式執行得沒問題。
11、接下來就可以使用LineBot幫你收集訂單資料了
11、接下來就可以使用LineBot幫你收集訂單資料了