GAS+linebotでgoogle spreadsheet勤怠管理


いろんな方がやっているかと思いますが、一応メモとして残しておきます。
大学のアルバイトでの勤怠管理用です。

やりたいこと

  • 出勤退勤を含むワードを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という変数名に格納しないとエラーになります。

code.gs
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に触れることができたのは楽しかったですね!ただデバッグとかの簡単な方法を教えて欲しい、、、

参考

GASを使ってLINEBOTを作ろう(1).

Google Apps Script で LINE Bot を作成する

Messaging APIリファレンス #分析

Messaging APIリファレンス #応答メッセージ

Class UrlFetchApp