悩 なやみ箱 暮らしと日常の悩みを、手順で解決するサイト

Googleカレンダーの予定を手でシートに転記して工数を集計している

2026年10月時点
■ 先に結論

予定名の先頭に「【会議】」のような目印を付ければ、Apps Script(GAS)で1週間分の予定を読み、目印ごとの合計時間をシートに書き出せます。
初回に手動で実行して承認し、あとは週1回の時間主導型トリガーに任せます。
終日の予定と、辞退した予定は合計から外します。

  1. 予定名の先頭に【会議】などの目印を付ける
  2. 集計用のスプレッドシートにコードを貼る
  3. 1回手動で実行し、承認画面で許可する
  4. 承認しないとカレンダーを読めない
  5. 週1回のトリガーを作る
  6. 毎週「工数」シートに1週分の行が足されていく

※2026年10月時点の Apps Script 公式リファレンスに基づいています。

色ごとに高さの違う山に積み分けられた木のブロックと、空のガラスびん

1予定名に目印を付ける

【会議】週次定例会議 1.5時間

先頭の【】の中身を分類名として、時間を合計する

予定名の途中の【】は拾いません(先頭だけ見ます)。目印の無い予定は「目印なし」にまとめて出るので、付け忘れに気づけます。

2コードを貼る

  1. 新しいスプレッドシートを作り、「拡張機能」 → 「Apps Script」
  2. 最初から入っている中身を消して、下のコードを貼って保存
  3. 関数 weeklyTotal を選んで「実行」
  4. 承認画面でアカウントを選び、カレンダーとスプレッドシートの権限を許可(チェック欄があれば両方に入れる)
const MARK = /^【(.+?)】/; // ← 目印の形。「会議:」型なら /^(.+?):/ に

function weeklyTotal() {
  const end = new Date();
  end.setHours(0, 0, 0, 0); // 今日の0時まで
  const start = new Date(end.getTime() - 7 * 24 * 60 * 60 * 1000); // 7日前の0時から
  const events = CalendarApp.getDefaultCalendar().getEvents(start, end);
  const totals = new Map();
  events.forEach((ev) => {
    if (ev.isAllDayEvent()) return; // 終日の予定は数えない
    if (ev.getMyStatus() === CalendarApp.GuestStatus.NO) return; // 辞退した予定は数えない
    const m = ev.getTitle().match(MARK);
    const cat = m ? m.pop() : '目印なし';
    const min = (ev.getEndTime() - ev.getStartTime()) / 60000;
    totals.set(cat, (totals.get(cat) || 0) + min);
  });
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('工数') || ss.insertSheet('工数');
  totals.forEach((min, cat) => {
    const row = sheet.getLastRow() + 1;
    sheet.getRange(row, 1, 1, 3).setValues([[start, cat, Math.round(min / 60 * 100) / 100]]);
  });
}

前日までの7日間の自分のデフォルト カレンダーを読みます。期間の境目をまたぐ予定は、両方の週に予定全体の時間で入ります。

アカウントによっては未確認のアプリという警告が出ます。中身がこの記事のコードと同じ時だけ進みます。
終わると「工数」タブが増え、週の開始日・分類・時間(1.5は1時間30分)が並びます。初回の行は動作確認用なので、確かめたら削除してかまいません。
出典: Class Calendar / Class CalendarEvent / Enum GuestStatus / Google サービスの承認 / OAuth クライアントの確認

3毎週動くようにする

  1. 編集画面の左の「トリガー」を開く
  2. 右下の「トリガーを追加」
  3. weeklyTotal・時間主導型を選び、週単位・月曜・好きな時刻帯(例: 午前6時〜7時)
  4. 「保存」

月曜に動かせば前週の月〜日曜が集まります。実行は時刻帯のどこかですが、期間は実行日の0時が基準なので結果は同じです。
出典: インストール可能なトリガー / Class ClockTriggerBuilder

合計が合わない時のチェックリスト