いろんな方がやっているかと思いますが、一応メモとして残しておきます。
大学のアルバイトでの勤怠管理用です。
やりたいこと
-
出勤
、退勤
を含むワードをlineに投下すると、その人のユーザー名、出勤時間帯とメッセージがgoogle spreadsheetに記録される。 - lineで
出勤よろしくお願いします!
、お疲れ様でした!
などのリプライを返す。
(バイトでは不要だったのでスプレッドシートに退勤の記録を残さない方針で実装しました。多分追加するのは簡単だと思います。)
前提
- line accountを持っている
- google accountを持っている
- line developers登録済み
まずやること
- google spreadsheetを作成
- シートの名前を
sheet1
にする。 - sheet idをメモっておく
以下のようなシートができていたら大丈夫です。
line の アクセストークン取得
developers consoleから取得します。自分のbotのチャンネルの Messaging API
にあります。
GASのコード
スプレッドシートのメニューからGASのコードエディタを開けます。
GASのスクリプトは以下のようになります。
ACCESSTOKEN
, id
はさきほどそれぞれ取得したものを使いましょう。
ちなみに、urlをgetするときに返される変数はreponse
という変数名に格納しないとエラーになります。
var ACCESSTOKEN = "xxxxxx"
//spreadSheetの設定
var id = 'xxxxxx';//https://docs.google.com/spreadsheets/d/"この部分がidです"/edit#gid=1856578608
var spreadsheet = SpreadsheetApp.openById(id);
var URL = "https://api.line.me/v2/bot/message/reply"; // 応答メッセージ用のAPI URL
// ボットにメッセージ送信/フォロー/アンフォローした時の処理
function doPost(e) {
var json = JSON.parse(e.postData.contents);
var reply_token= json.events[0].replyToken;
var user_id = json.events[0].source.userId;
var user_message = json.events[0].message.text; //ここにメッセージが格納される
// ユーザー名を取得する場合は、user_idから取得する必要がある。あと、ここはresponseという変数名に格納しないとエラーになる?
var response = UrlFetchApp.fetch(
'https://api.line.me/v2/bot/profile/' + user_id,
{
"headers": {
"Authorization": "Bearer " + ACCESSTOKEN,
}
}
);
profile = JSON.parse(response);
var username = profile.displayName
var today = new Date();
var month = today.getMonth() + 1;
var date = today.getDate();
var hour = today.getHours();
var minute = today.getMinutes();
var time = month + '月' + date + '日' +hour + ':' + minute;
// 時間帯によってどの時限のシフトか分ける
switch (true) {
case hour <= 13:
var period = "lunch";
break
case hour <= 14:
var period = "3rd period";
break
case hour <= 16:
var period = "4th period";
break
default:
var period = "finished";
break
}
if(user_message.includes('出勤')){//出勤という言葉を含む場合
var sheet;
sheet = spreadsheet.getSheetByName("sheet1");//sheet1に記入する
sheet.appendRow([user_message, username, period]);//シートにメッセージを記入
//返信
if (period == "finished") {
textMessage = "tutoring sessions are over for today!";
} else {
textMessage = username + 'さん、' + period + 'のシフトよろしくお願いします!';
}
pushMessage(textMessage, reply_token);
}
else if(user_message.includes('退勤')){//退勤という言葉を含む場合
textMessage = username + 'さん、' + 'お疲れ様でした!';
pushMessage(textMessage, reply_token);
}
}
/*メッセージを送信*/
function pushMessage(textMessage, replyToken) {
UrlFetchApp.fetch(URL, {
"headers": {
"Content-Type": "application/json; charset=UTF-8",
"Authorization": "Bearer " + ACCESSTOKEN,
},
"method": "post",
"payload": JSON.stringify({
"replyToken": replyToken,
"messages": [{
"type": "text",
"text": textMessage,
}],
}),
});
}
デプロイ
ウェブアプリとしてデプロイします。アクセスできるユーザーは 全員
としておきます。
これでデプロイされるので、URLをコピーして
webhookに貼り付けます。
verify を押してsuccessだったら成功です。
lineでの挙動
時間外に出勤しようとしたので、もう終わっていると言われてしまいました、、、
退勤のときはうまくいきます。
ただ、出勤と退勤で連動できていないのが、ちょっとひっかかる。けどまあいいか。
spreadsheet側の挙動
ここは直すのを忘れていました、finishedのまま記録されていますね。まあ挙動を確認できたので次回以降直すとします。
まとめ
GASでLinebotを作って、spreadsheet側でも反映させることができました。
不具合やらミスやらでだいたい3時間ぐらいかかったと思います。
GASに触れることができたのは楽しかったですね!ただデバッグとかの簡単な方法を教えて欲しい、、、