フリーランスの作業時間をスプレッドシートで自動集計、時給差2倍が発覚

「実質時給、見えました。」Notionの作業ログをGASで同期し実質時給を自動計算する仕組みのアイキャッチ画像

結論:Notionに作業ログを記録し、GASでスプレッドシートに同期、案件ごとの実質時給を自動計算するようにしました。結果、金額だけでは分からなかった「時間対効果の悪い案件」が具体的に見えるようになりました。

この記事でわかること

  • なぜ金額ではなく「時給」で仕事を見るべきか
  • Notionでの作業ログの記録方法
  • スプレッドシートでの自動集計・時給換算の計算式
  • 実際に集計してわかったこと

前回の記事で、Notionを原本にしてスプレッドシートへ自動同期する仕組みを作りました。今回はこの土台の上に、作業時間の記録と時給換算を積み上げます。

なぜ「時給」で自分の仕事を見るべきか

案件を選ぶとき、多くの人は「金額」だけを見ます。しかし同じ5万円の案件でも、10時間で終わるものと30時間かかるものでは、実質時給が3倍違います。金額ベースで案件を選び続けると、気づかないうちに時間対効果の悪い仕事が積み重なっていきます。これを可視化するのが今回のゴールです。

時間記録の設計

前回のルールどおり、記録の起点はNotionです。案件管理DBとは別に「作業ログ」という簡易データベースを作り、以下のプロパティを持たせました。

  • 案件名(案件管理DBとのリレーション)
  • 作業日
  • 作業時間(分)

Notionには開始・終了時刻から自動で時間を計算するロールアッププロパティがないため、今回は作業後に分数を手入力する方式にしています。1エントリ1〜2秒で終わるので、これくらいの手間なら継続できると判断しました。

GASでの同期処理

前回作った同期の仕組みをそのまま流用し、「作業ログ」DBも同じようにスプレッドシートへ同期します。

const WORKLOG_DB_ID = 'ここに作業ログDBのIDを入れる';
const WORKLOG_SHEET_NAME = '作業ログ(同期)';

function syncWorklog() {
  const results = queryNotionDatabaseById_(WORKLOG_DB_ID);
  const sheet = getOrCreateNamedSheet_(WORKLOG_SHEET_NAME);

  sheet.clearContents();
  sheet.appendRow(['案件名', '作業日', '作業時間(分)']);

  results.forEach(page => {
    const props = page.properties;
    const project = props['案件名']?.relation?.[0]?.id ? getRelatedPageTitle_(props['案件名'].relation[0].id) : '';
    const date = props['作業日']?.date?.start || '';
    const minutes = props['作業時間(分)']?.number ?? 0;

    sheet.appendRow([project, date, minutes]);
  });
}

getRelatedPageTitle_は、リレーション先の案件ページIDからタイトルを取得する小さな関数です(Notion APIはリレーションを貼るとIDしか返さないため、別途ページ取得が必要になります)。

スプレッドシート側の集計・時給換算

同期した「作業ログ」シートと、前回の「案件一覧(同期)」シートを組み合わせて、案件ごとの実質時給を計算します。

項目計算式(例)
案件ごとの合計時間(分)=SUMIF(作業ログ!A:A, A2, 作業ログ!C:C)
合計時間(時間)=B2/60
実質時給=案件一覧!C2/C2(金額 ÷ 稼働時間)

つまずいたポイント:Notionのリレーションプロパティは、同期のたびにAPI呼び出し回数が増えます。案件数が多いと実行時間が伸びるので、Claude Codeと一緒に「関連ページのタイトルをキャッシュして再利用する」処理を追加し、無駄な呼び出しを減らしました。

実際に集計してわかったこと

2週間分のデータで集計した結果、案件によって実質時給に2倍以上の差があることが分かりました。金額だけを見ていたときは気づけなかった差です。まだサンプルが少ないので断定はできませんが、次にどの案件を優先すべきかの判断材料が1つ増えました。

よくある質問

作業時間の記録を忘れてしまいそうです。どう対策していますか?

まだ良い解決策はなく、正直に言うと数回記録漏れがありました。次回以降、リマインド通知の仕組みを検討する予定です。

分単位ではなく時間単位で記録してもいいですか?

問題ありません。計算式の分母を調整すれば同じように使えます。

案件が少ない場合でも意味がありますか?

データが少ないうちは参考程度になりますが、傾向を掴むためにも早めに記録を始めておくことをお勧めします。

次回は、この作業ログをもとに、月次の稼働実績を自動でレポート化する仕組みを作ります。