React Native Tech Blog

supported by maricuru (旧maricuru tech blogです)

【Google Apps Script】Googleカレンダーから月間の稼働時間を集計する

こんにちは、maricuruのワダ(@takahi5)です。

今回はGoogle Apps Scriptネタです。

社内のグループウェアとしてG Suiteを使ってる会社は多いのではないでしょうか。
Google App Scriptを使うと、スプレッドシートやGoogleカレンダーをプログラムで操作できるので、定形作業を自動化したりできます。

手間のかかる事務作業を自動化するツールとか作るとメチャメチャ喜ばれますw

もちろん社員の労働効率もあがるので、会社としてもバンザイです。

f:id:wasan:20181103223544p:plain

解決したい課題

弊社では柔軟な働き方を推奨していて、子育て中のママさんが自宅でスキマ時間に作業をしてたりします。
また東京近郊だけでなく、関西で働いているスタッフもいます。

それらのメンバーの勤務時間は、Googleカレンダーに本人が入力する形で管理しています。
そして給与計算の際には、経理担当がGoogleカレンダーを手作業で数えています。

そこで、この手作業で数える作業をなんとかできないのか!?
というのが今回解決したい課題でした。

カレンダーを集計して稼働時間を出力する

そこで、この経理担当が人力でやってる作業をGoogle Apps Scriptを使って自動化しました。

いきなりコード全文です!
(実際の業務で使ってるのではなく簡潔にしたサンプルです)

要件はこんな感じです

  • 指定した複数のユーザーをまとめて取得
  • 特定タイトルの予定だけに絞って集計
  • 合計の稼働時間をサマリして表示

なげえ、、、

ではポイントを要約して解説します。

カレンダーの読み込み

var calendar = CalendarApp.getCalendarById('yamamoto@gmail.com');

のようにしてyamamoto@gmail.comのカレンダーを取得できます。
このときスクリプトの実行者はyamamoto@gmail.comのカレンダーを共有されている必要があります。

var events = calendar.getEvents(startDate,endDate); 

で対象期間のカレンダーイベントたちを取得します。

  for each(var evt in events){
   var title = evt.getTitle();
   var startTIme = evt.getStartTime();
   var endTIme = evt.getEndTime();
  }

それをforで回して各種情報を取得できます。

title, startTime...その他にも各種情報を取得できます。詳しくはコチラ↓

Class CalendarEvent  |  Apps Script  |  Google Developers

集計する

このサンプルでは、

evt.getTitle();

したものをチェックし、カレンダーの中から特定の予定名に絞っています。

また

evt.getEndTime() - evt.getStartTime() 

の差分で稼働時間を計算しています。

スプレッドシートに結果を出力

  var id = SpreadsheetApp.create('スプレッドシート名').getId();
  var spreadsheet = SpreadsheetApp.openById(id);

のようにしてspreadsheetインスタンスを取得できます。

var sheet = spreadsheet.insertSheet('summary');

summaryという名前のシートを挿入し、sheetインスタンスを取得します。

つぎに配列形式で持っているデータをガサっとsheetに書き込みます。

var array = [
  ['2018-10-26 9:00', '2018-10-26 14:00', '5', 'データ入力', 'yamamoto@gmail.com' ],
  ['2018-10-28 9:00', '2018-10-28 15:00', '6', 'データ入力', 'yamamoto@gmail.com' ],
  ['2018-10-29 9:00', '2018-10-29 14:00', '5', '文章校正',     'yamamoto@gmail.com' ]
]

のような配列があったとすると

  var rows = array.length;
  var cols = array[0].length;
  sheet.getRange(1,1,rows,cols).setValues(array);

これ一発で、この配列データががSheetに挿入されます。

まとめ

以上になります!

Google Apps Script用に覚えることは少しありますが、JavaScriptで書けるのはいいですね!
何かの参考になれば幸いです!