8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GAS+linebotでgoogle spreadsheet勤怠管理

Last updated at Posted at 2021-04-24

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

やりたいこと

  • 出勤退勤を含むワードをlineに投下すると、その人のユーザー名、出勤時間帯とメッセージがgoogle spreadsheetに記録される。
  • lineで出勤よろしくお願いします!お疲れ様でした!などのリプライを返す。

(バイトでは不要だったのでスプレッドシートに退勤の記録を残さない方針で実装しました。多分追加するのは簡単だと思います。)

前提

  • line accountを持っている
  • google accountを持っている
  • line developers登録済み

まずやること

  • google spreadsheetを作成
  • シートの名前を sheet1にする。
  • sheet idをメモっておく

以下のようなシートができていたら大丈夫です。

Screen Shot 2021-04-24 at 19.17.19.png

line の アクセストークン取得

developers consoleから取得します。自分のbotのチャンネルの Messaging APIにあります。

Screen Shot 2021-04-24 at 19.45.54.png

GASのコード

スプレッドシートのメニューからGASのコードエディタを開けます。

Screen Shot 2021-04-24 at 19.30.17.png

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,
      }],
    }),
  });
}

デプロイ

ウェブアプリとしてデプロイします。アクセスできるユーザーは 全員としておきます。

Screen Shot 2021-04-24 at 19.19.03.png

これでデプロイされるので、URLをコピーして

Screen Shot 2021-04-24 at 19.20.16.png

webhookに貼り付けます。

Screen Shot 2021-04-24 at 19.21.19.png

verify を押してsuccessだったら成功です。

Screen Shot 2021-04-24 at 19.21.43.png

lineでの挙動

時間外に出勤しようとしたので、もう終わっていると言われてしまいました、、、

IMG_4002.jpg

退勤のときはうまくいきます。

IMG_4003.jpg

ただ、出勤と退勤で連動できていないのが、ちょっとひっかかる。けどまあいいか。

spreadsheet側の挙動

ここは直すのを忘れていました、finishedのまま記録されていますね。まあ挙動を確認できたので次回以降直すとします。

Screen Shot 2021-04-24 at 19.28.58.png

まとめ

GASでLinebotを作って、spreadsheet側でも反映させることができました。
不具合やらミスやらでだいたい3時間ぐらいかかったと思います。

GASに触れることができたのは楽しかったですね!ただデバッグとかの簡単な方法を教えて欲しい、、、

参考

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

Google Apps Script で LINE Bot を作成する

Messaging APIリファレンス #分析

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

Class UrlFetchApp

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?