Google Apps ScriptでのDateオブジェクトの各生成方法、日付と時刻を分ける

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Googleスプレッドシート上に勤怠管理集計システムを作っています。

前回の記事はこちら。

Google Apps Scriptでチャットワークでのチャット打刻システムを作る
Googleスプレッドシートを使って勤怠管理集計システムを作成しています。今回はGoogle Apps Scriptでチャットワークからの出勤・退勤の打刻情報を受け取るスクリプトを作っていきます。

チャットワークの打刻用グループで「出勤」「退勤」などのメッセージが送られてきたら、その内容に応じてログ出力をするというスクリプトを組みました。

これをさらに発展させまして、スプレッドシートに記録をしていきたいということなのですが、今回はこのお題を用いてGoogle Apps Scriptでの日時の取り扱いについてマスターをしていきたいと思います。

Dateオブジェクトの生成のいくつかの種類と要素を取得するメソッド、またDateオブジェクトを日付と時刻に分解する方法などです。

スポンサーリンク

前回のおさらい

前回作成したスクリプトはこちらです。

function recordTime(){
  var params = {
    headers : {"X-ChatWorkToken" : '---------------------'}, //チャットワークAPIトークン
    method : "get"
  };
  var roomID = XXXXXXXX; //ルームID
  var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //指定のグループチャットからメッセージを取得

  try{
    var respons = UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントからレスポンスを取得
    var json = JSON.parse(respons.getContentText()); //文字列をJSON形式として解析しJSONオブジェクトとして返す

    for each(var obj in json){
      if(obj.body.match(/出勤/) || obj.body.match(/おはよう/)){

        Logger.log("出勤");

      }else if(obj.body.match(/退勤/) || obj.body.match(/お疲れ/)){

        Logger.log("退勤");
      }
    }
  }catch(e){

    Logger.log('エラーが発生しました');
    Logger.log(e.message);

  }
}

11行目までで、チャットワークの特定のグループチャットからのメッセージをごそっと取得してきます。

13行目以降の処理で、その全てのメッセージの内容に応じて

  • 「出勤」または「おはよう」を含むなら「出勤」をログ出力
  • 「退勤」または「お疲れ」を含むなら「退勤」をログ出力

という処理を行います。

今回は目標として、このスクリプトにチャットワークAPIのレスポンスからメッセージ送信時の日付と時刻を取得する処理を追加していきたいと思います。

チャットワークで打刻した日付と時刻を取得する

まずチャットワークAPIからのレスポンスは以下のような構造になります。

[
  {
    "message_id": 5,
    "account": {
      "account_id": 123,
      "name": "Bob",
      "avatar_image_url": "https://example.com/ico_avatar.png"
    },
    "body": "Hello Chatwork!",
    "send_time": 1384242850,
    "update_time": 0
  }
]

ここでいう「send_time」がメッセージの送信日時に該当していますので、obj.send_timeで取得できそうですね。

しかし10桁の数値…日時っぽくないなぁなどと思われるかも知れませんが、そうなんです。このチャットワークAPIのレスポンスで取得できる日時はUNIX時間です。

UNIX時間については以下記事でも説明していますが、1970年1月1日0時0分0秒からの経過秒数で表現する形式です。

429 Too Many Requests

打刻のデータシートとしては、「日付」と「時刻」を別々に取得したいので、このUNIX時間を分解していく必要があります。

UNIX時間を日付と時刻に分解する

JavaScriptのDateオブジェクトの生成方法

一度、JavaScriptのDateオブジェクトについて整理をしてみましょう。

Dateオブジェクトの生成方法にはいくつかの種類があります。

まず、引数を指定しない場合は、現在の日時でDateオブジェクトを生成します。

new Date()

特定の日時であれば、年、月、日、時間、分、秒を指定することで、該当日時のオブジェクトを生成することができます。

new Date(2008, 5, 1, 2, 0, 0)

また括弧内に文字列形式で指定することで、該当日時のDateオブジェクトを生成することができます。

new Date(‘2008/05/01 02:00:00’)

またUNIX時間はミリ秒に変換すればDateオブジェクトを生成できます。

new Date(UNIX時間*1000)

と、このような種類があります。

Dateオブジェクトの各要素を取得するメソッド

また、Dateオブジェクトに対してそれぞれの値をを取得するメソッドはこちらでしたね。

getFullYear() //年
getMonth() //月(値は0~11(1月~12月))
getDate() //日
getDay() //曜日(値は0~6(日曜日~土曜日))
getHours() //時
getMinutes() //分
getSeconds() //秒

以下記事もご覧ください。

429 Too Many Requests

Dateオブジェクトを日付と時刻に分ける

ですから、今回の場合

  1. UNIX時間からDateオブジェクトを生成
  2. 生成したDateオブジェクトから日付だけまたは時刻だけを抜き出す

という手順で進めればOKですね。抜き出すというのは、欲しい要素以外はゼロにしてDateオブジェクトを生成するということです。

まずチャットワークAPIのレスポンスからDateオブジェクトを生成するには

var date = new Date(obj.send_time*1000); //レスポンスから送信日時を取り出す

とします。

次に日付だけを取得したい場合は、時刻以降をゼロにすれば良いですから

var date_D = new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0);

時刻だけを取得したい場合は、年、月、日をゼロにします。また、システムとしては秒も加味しないのでゼロに切り捨てちゃいます。

var date_T = new Date(0,0,0,date.getHours,date.getMinutes,0);

実行結果

では前述の3行を元にスクリプトを以下のように修正しました。

function recordTime(){
  var params = {
    headers : {"X-ChatWorkToken" : '---------------------'}, //チャットワークAPIトークン
    method : "get"
  };
  var roomID = XXXXXXXX; //ルームID
  var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //指定のグループチャットからメッセージを取得
  
  try{
    var respons = UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントからレスポンスを取得
    var json = JSON.parse(respons.getContentText()); //文字列をJSON形式として解析しJSONオブジェクトとして返す
  
    for each(var obj in json){
      
      var date = new Date(obj.send_time*1000); //レスポンスから送信日時を取り出す
      var date_D = new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0); //日付を取り出す
      var date_T = new Date(0,0,0,date.getHours(),date.getMinutes(),0); //時刻を取り出す
      
      if(obj.body.match(/出勤/) || obj.body.match(/おはよう/)){
        
        Logger.log("日付:" + date_D + ",時刻:" + date_T.getHours() + ":" + date_T.getMinutes() + ",出勤");
        
      }else if(obj.body.match(/退勤/) || obj.body.match(/お疲れ/)){
        
        Logger.log("日付:" + date_D + ",時刻:" + date_T.getHours() + ":" + date_T.getMinutes() + ",退勤");
      }
    }
  }catch(e){
    Logger.log('エラーが発生しました');
    Logger.log(e.message);
  }
}

チャットワークの該当のグループチャットにて「出勤です」「お疲れです」などと入力した上で、スクリプトを実行してみますと

Google Apps ScriptでDateを日付と時刻に分解した結果

このように、ログ出力がされました。

まとめ

以上、Google Apps ScriptでのDateオブジェクトの取り扱いについてお伝えしてきました。

  • Dateオブジェクトの生成の仕方
  • 年、月などの要素を取得するメソッド
  • Dateオブジェクトから日付、時刻のみを取得する方法

などですね。

Javascriptの場合、Dateオブジェクトの取り扱いはなかなか厄介ですので、一つ一つマスターして頂ければよいと思います。

次回ですが、チャットワークAPIのレスポンスからアカウントID、かつ打刻情報をシートの最終行に追加していきたいと思います。

Google Apps Scriptでチャットワークからの打刻情報をシートの最終行に追加する方法
Googleスプレッドシート上に勤怠管理集計システムを作っています。今回はGoogle Apps Scriptでチャットワークからの打刻情報をappendRowでシートの最終行に追加する方法です。

どうぞお楽しみに!

連載目次:チャットワークのメッセージ送信で出勤・退勤の打刻をする

本シリーズはチャットワークの特定のグループチャットで出勤や退勤の打刻が可能になる勤怠システムをGoogle Apps Scriptとスプレッドシートを用いて作っていきます。これからはチャットというインターフェースがトレンドになってきますので、良い練習になると思いますよ!
  1. Google Apps Scriptでチャットワークでのチャット打刻システムを作る
  2. Google Apps ScriptでのDateオブジェクトの各生成方法、日付と時刻を分ける
  3. Google Apps Scriptでチャットワークからの打刻情報をシートの最終行に追加する方法
  4. Google Apps Scriptでスプレッドシート内を検索して行番号を返す関数(高速版)
  5. Google Apps Scriptでチャットワークからの出勤・退勤の打刻データを様々な条件分岐を駆使して処理する
タイトルとURLをコピーしました