【GAS×チャットワーク】チャットワークからGoogleカレンダーに作業記録を残すスクリプト

GoogleAppsScript

前回は、チャットワークでGoogleAppsScriptと連携し、スプレッドシートに作業ログを残すというスクリプトを作成しました。

今回はその続きとして、スプレッドシートに記録したログを、Googleカレンダーにも転記するスクリプトを追加しましたので紹介します。

 

前回のまとめ

前回の記事は以下です。

【GAS×チャットワーク】作業時間を記録するスクリプトを作成しました
作業を行う際は、その作業内容と、作業にかかった時間を記録すると、何かと利点があります。しかし、私の場合、それをやろうと思っても適切なツールが見つかりませんでした。ならば自分で作ってみよう!と思いたち、作ってみた!というのが今回の内容です。 ...

前回の記事では主として、

  • GoogleAppsScriptとチャットワークの連携
  • Webhookの設定

を行いました。

チャットワークで「開始」や「終了」と入力した際に、スプレッドシートに開始時間や終了時間、また作業した内容などを記録できるようにしました。

スクリプトは以下のようなものでした。

function doPost(e){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('ログ');
  var json = JSON.parse(e.postData.contents);
  var body = json.webhook_event.body;
  var time = json.webhook_event.send_time;
  time = transTime(time);
  var lastRow = sh.getLastRow();
  if(body.slice(0,2)=="開始"){
    sh.getRange(lastRow+1, 1).setValue(time);
    sh.getRange(lastRow+1, 2).setValue(body.slice(3));
  }else{
    if(body.slice(0,2)=='終了'){
      sh.getRange(lastRow, 3).setValue(time);
      sh.getRange(lastRow, 4).setValue(body.slice(3));
      sh.getRange(lastRow, 5).setFormula("C" + lastRow + "-  A" + lastRow)
    }
  }
}

function transTime(intTime){
    var d = new Date( intTime * 1000 );
    var year  = d.getFullYear();
    var month = d.getMonth() + 1;
    var day  = d.getDate();
    var hour = ( '0' + d.getHours() ).slice(-2);
    var min  = ( '0' + d.getMinutes() ).slice(-2);
    var sec   = ( '0' + d.getSeconds() ).slice(-2);
    return( year + '/' + month + '/' + day + ' ' + hour + ':' + min + ':' + sec );
}

今回はその続きです。

 

スクリプトを追加しよう!

列挙型変数を使ってみましょう!

スクリプトを追加していくにあたり、「列挙型変数」を使っていきましょう。コードが長くなるので、これを使ったほうが便利です。また、列挙型変数を使用することで、コードのメンテナンス性も向上します。次のコードを関数の冒頭に追加しましょう。

  var INDEX = {
    START_TIME : 0,
    START_TASK : 1,
    END_TIME : 2,
    END_TASK : 3
  };
  var COL = {
    START_TIME : 1,
    START_TASK : 2,
    END_TIME : 3,
    END_TASK : 4,
    ELAPSED_TIME : 5
  }

 

前回に記述したスクリプトも、この列挙型変数を利用して書き直してください。

 

カレンダーと連携しよう!

Googleカレンダーと連携するスクリプトを書いていきます。

以下を、「終了」が入力された際に起動するようにスクリプトに追加しましょう。

      var data = sh.getRange(lastRow, 1, 1, 5).getValues();
      var myCal = CalendarApp.getCalendarById('****@group.calendar.google.com');
      var title = data[0][INDEX.END_TASK];
      var startTime = data[0][INDEX.START_TIME];
      var endTime = data[0][INDEX.END_TIME];
      myCal.createEvent(title, startTime, endTime);

 

myCalには、任意のGoogleカレンダーのIDを入力してください。作業内容を記録する用のカレンダーを追加してみてもいいかもしれません。これで、Googleカレンダーにも、ログの内容が反映されるようになります。

全体のコードは以下のようになります。

 

function doPost(e){
  var INDEX = {
    START_TIME : 0,
    START_TASK : 1,
    END_TIME : 2,
    END_TASK : 3
  };
  var COL = {
    START_TIME : 1,
    START_TASK : 2,
    END_TIME : 3,
    END_TASK : 4,
    ELAPSED_TIME : 5
  }
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  sh = ss.getActiveSheet()
  var sh = ss.getSheetByName('ログ');
  var json = JSON.parse(e.postData.contents);
  var body = json.webhook_event.body;
  var time = json.webhook_event.send_time;
  time = transTime(time);
  var lastRow = sh.getLastRow();
  if(body.slice(0,2)=="開始"){
    sh.getRange(lastRow+1, COL.START_TIME).setValue(time);
    sh.getRange(lastRow+1, COL.START_TASK).setValue(body.slice(3));
  }else{
    if(body.slice(0,2)=='終了'){
      sh.getRange(lastRow, COL.END_TIME).setValue(time);
      sh.getRange(lastRow, COL.END_TASK).setValue(body.slice(3));
      sh.getRange(lastRow, COL.ELAPSED_TIME).setFormula("C" + lastRow + "- A" + lastRow)
      //以下を追加
      var data = sh.getRange(lastRow, 1, 1, 5).getValues();
      var myCal = CalendarApp.getCalendarById('****@group.calendar.google.com');
      var title = data[0][INDEX.END_TASK];
      var startTime = data[0][INDEX.START_TIME];
      var endTime = data[0][INDEX.END_TIME];
      myCal.createEvent(title, startTime, endTime);
    }
  }
}

function transTime(intTime){
  // var d = new Date( intTime );
  var d = new Date( intTime * 1000 );
  var year  = d.getFullYear();
  var month = d.getMonth() + 1;
  var day  = d.getDate();
  var hour = ( '0' + d.getHours() ).slice(-2);
  var min  = ( '0' + d.getMinutes() ).slice(-2);
  var sec   = ( '0' + d.getSeconds() ).slice(-2);
  return( year + '/' + month + '/' + day + ' ' + hour + ':' + min + ':' + sec );
}

 

まとめ

今回はチャットワークとスプレッドシート、Googleカレンダーとを連携するスクリプトを作成しました。作業内容や時間などが、スプレッドシートだけでなく、時系列でも見えやすくなります。