Google カレンダーをタイムシートにする方法
クライアントの仕事をすでに Google カレンダーに入れているなら、タイムシートの大部分はもうそろっています。足りないのは、日付と所要時間の一覧と、クライアントごとの合計です。Google カレンダーはそれを作ってくれません。エクスポートで得られるのはカレンダーのファイルであって、表ではないからです。ここでは、無料の手作業から完全な自動化まで 3 つの方法と、気づかないうちに合計を狂わせる細かな点を紹介します。
方法 1:スプレッドシートに手で入力する
Google カレンダーを週ビューで開き、その横で空の Google スプレッドシートを開いて、会議ごとに 1 行ずつ、日付、開始、終了、クライアントを入力します。時間を出すために =(C2-B2)*24 の列を追加し、いちばん下に合計を入れます。
費用はかからず、週に数件の会議なら十分です。それを超えると毎週時間がかかり、入力ミスも目に見えません。入力した 14:30 をカレンダーと照らし合わせて確認し直す人はいないからです。
方法 2:Google スプレッドシートの短いスクリプト
Google スプレッドシートは、Google に組み込まれたスクリプト機能である Apps Script を使ってカレンダーを読み込めます。新しいスプレッドシートで 拡張機能、Apps Script の順に開き、以下を貼り付けて 2 つの日付を調整し、listMonth を実行します。自分で作ったスクリプトの承認を Google から求められます。
function listMonth() {
var cal = CalendarApp.getDefaultCalendar();
var start = new Date(2026, 9, 1), end = new Date(2026, 10, 1); // October 2026
var rows = [['Date', 'Start', 'End', 'Hours', 'Title', 'Colour']];
cal.getEvents(start, end).forEach(function (e) {
if (e.isAllDayEvent()) return;
var hours = (e.getEndTime() - e.getStartTime()) / 3600000;
rows.push([e.getStartTime(), e.getStartTime(), e.getEndTime(), hours, e.getTitle(), e.getColor()]);
});
var sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}
Apps Script の月は 0 から数えるため、new Date(2026, 9, 1) は 10月1日です。予定ごとに 1 行、所要時間と色番号が入ります。あとはピボット テーブルや SUMIF で合計が出せます(数式はガイド「Google カレンダーの時間をクライアント別・色別・週別に集計する方法」で紹介しています)。
少しのコードに抵抗がなければ、よい無料の選択肢です。読み込むのはメインのカレンダーだけで、以下に挙げる落とし穴は、自分で対処しない限りすべてそのまま残ります。
方法 3:アドオンで自動化する
アドオンを使えば、同じ読み込みを決まった間隔で代わりに行ってくれます。私たちが開発している Calendar Timesheet は、選んだカレンダーを 1 時間ごとに読み込み、色、カレンダー、タイトルの単語、ゲストのメールドメインで各会議をクライアントに振り分け、今月 シートを常に最新の状態に保ちます。毎月 1 日には前月を締めてクライアントごとの請求明細を作り、概要をメールでお知らせします。任意の期間のエクスポートは無料です。クライアント、単価、オートパイロットは Pro の機能で、最初の月末まで使えるトライアルがあります。
ほかのアドオンには、予定をそのままシートに書き出すものもあり、自分でレポートを作りたい人に向いています。以下の落とし穴こそが、単なるエクスポートと、そのまま請求に使えるタイムシートとの違いです。
合計を狂わせる落とし穴
境目をまたぐ会議
10月31日の 22:00 から 01:00 までのワークショップは、2 か月にまたがります。全体を 10月に数えると 10月は請求しすぎになり、11月は不足します。期間内の部分だけを数えるべきです。
辞退した招待と未回答の招待
カレンダーのスクリプトは、辞退した予定も返します。誰かに招待された会議を断っても、単純なエクスポートにはそのまま入ってしまいます。自分の回答で絞り込みましょう。
終日の予定と「予定なし」の時間
休日、移動日、リマインダーは、終日の予定になっていたり「予定なし」に設定されていたりすることがよくあります。これらは作業時間ではありません。終日の予定を 24 時間として読み込むと、合計が大きく狂います。
2 つのカレンダーにある同じ会議
クライアントから招待され、その会議を自分の仕事用カレンダーにもコピーした場合、両方のカレンダーをエクスポートすると 2 回数えられます。予定には共通の識別子(iCalUID)があり、それを使えば 1 つだけ残せます。
例外のある定期的な会議
ある週は移動し、別の週はキャンセルした毎週の電話会議は、シリーズの設定どおりではなく、実際に行われたとおりに数える必要があります。シリーズではなく、展開した個々の回を読み込みましょう。
タイムゾーン
スプレッドシートとカレンダーのタイムゾーンが違うと、開始時刻がずれます。タイムシートには 1 つのタイムゾーンを使いましょう。通常はスプレッドシートのタイムゾーンです。
信頼できるタイムシートのためのチェックリスト
- クライアントの見分け方(色、カレンダー、タイトルの単語、ゲストのドメイン)を 1 つ決めて、それを守ります。
- 各会議のうち、期間内の部分だけを数えます。
- 辞退した招待、終日の予定、「予定なし」に設定した時間は除外します。
- 2 つのカレンダーにある会議は 1 回だけ数えます。
- 請求した月はその時点で固定し、後でカレンダーを編集しても送付済みの内容が変わらないようにします。
1 時間ごとに自動で任せたいですか?Calendar Timesheet は、このチェックリストの各項目を、あなた自身の Google スプレッドシートで、アカウントの作成なしで処理します。