Googleカレンダーで生産性分析

生産性分析

税理士業務において、生産性分析は非常に重要だと考えています。

ここでいう生産性分析とは、顧問先からいただいている報酬が、作業時間に対して適正かどうかを分析することを意味します。

作業時間当たりの報酬が、あらかじめ設定した基準を下回っている場合には、顧問先に対して報酬の見直し(値上げ)をお願いすることになります。

このような対応を行うことで、時間効率の悪い業務を減らし、全体としての生産性を向上させていくことが可能になります。

Mykomon

勤務時代は、Mykomon(マイコモン) というサービスを利用していました。

Mykomonは、会計事務所向けに

  • 社員の勤務管理
  • スケジュール管理
  • 顧問先管理

などを一体的に行うことができるサービスです。

特に、生産性分析の機能が非常に充実している点が特徴です。
ただし、機能が充実している反面、個人事務所が利用するにはコスト面の負担が大きいというデメリットもあります。

そこで、他の方法で生産性分析ができないか検討することにしました。
色々と調べてみましたが、Mykomonの生産性分析機能に匹敵するような安価なサービスは見当たりませんでした。

Googleカレンダー

そこで、GoogleカレンダーとGoogleスプレッドシートを活用し、自前で生産性分析の仕組みを作ることにしました。

GoogleカレンダーはMykomonと同様に、マウスのドラッグ操作で行った業務をカレンダー上に記録することができます。

この記録した業務時間を顧問先ごとに集計できれば、顧問先ごとの作業時間当たりの報酬を把握できると考えました。

調べた結果、GoogleスプレッドシートからGoogleカレンダーに記録した時間を参照できることが分かりましたので、この機能を活用することにしました。

手順

以下、簡単に手順を説明します。

① Googleカレンダー上で記録する業務について、タイトルの先頭に4桁の顧問先コードを入力するようにします。

② Googleスプレッドシートの「拡張機能」→「Apps Script」に、以下のようなコードを記述します。

function aggregateByEventTitleCodeToSheet() {

  // スプレッドシート準備

  const ss = SpreadsheetApp.getActiveSpreadsheet();

  const sheetName = "集計";

  const sheet = ss.getSheetByName(sheetName) || ss.insertSheet(sheetName);

  sheet.clear(); // 前回の結果を消去

  const now = new Date();

  const startDate = new Date(now.getFullYear(), now.getMonth() - 11, 1); // 12ヶ月前の月初

  const endDate = new Date(now.getFullYear(), now.getMonth() + 1, 1);   // 翌月初

  const calendars = CalendarApp.getAllCalendars();

  // 月ラベル作成(YYYY-MM)

  const months = [];

  for (let i = 0; i < 12; i++) {

    const d = new Date(now.getFullYear(), now.getMonth() - 11 + i, 1);

    months.push(`${d.getFullYear()}-${('0' + (d.getMonth() + 1)).slice(-2)}`);

  }

  // 集計結果: { 顧問先コード: { 'YYYY-MM': 時間, total: 時間 } }

  const result = {};

  // 全カレンダーの全予定を取得

  calendars.forEach(cal => {

    const events = cal.getEvents(startDate, endDate);

    events.forEach(event => {

      const title = event.getTitle();

      if (!title) return;

      // 先頭4桁が数字のものだけ対象

      const match = title.match(/^(\d{4})/);

      if (!match) return;

      const code = match[1];

      const start = event.getStartTime();

      const end = event.getEndTime();

      const duration = (end - start) / (1000 * 60 * 60); // 時間換算

      const monthKey = `${start.getFullYear()}-${('0' + (start.getMonth() + 1)).slice(-2)}`;

      if (!result[code]) {

        result[code] = { total: 0 };

        months.forEach(m => result[code][m] = 0); // 0で初期化

      }

      // 安全策: 月ラベルがなければ0で初期化

      if (!result[code][monthKey]) result[code][monthKey] = 0;

      result[code][monthKey] += duration;

      result[code].total += duration;

    });

  });

  // スプレッドシートに出力

  const header = ["顧問先コード", ...months, "合計"];

  const data = [header];

  Object.keys(result).sort().forEach(code => {

    const row = [code];

    months.forEach(m => row.push((result[code][m] || 0).toFixed(2))); // undefined対策

    row.push((result[code].total || 0).toFixed(2));

    data.push(row);

  });

  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);

  Logger.log("スプレッドシートへの書き込み完了");

}

③ スクリプトを実行すると、一番左の列に4桁の顧問先コード、右側に月ごとの作業時間が集計されます。

④ 別途用意した顧問先ごとの報酬一覧表に、この作業時間を入力します。

これにより、作業時間当たりの報酬を把握することが可能になります。

うまくいかない場合は、ChatGPTに聞いてみてください。
私自身も、ChatGPTに相談しながらスクリプトを作成しました。

Mykomonの生産性分析機能には及びませんが、この方法でも十分に目的は果たせると考えています。
ぜひ参考にしてみてください。