ワザ箱 暮らしと仕事の悩みを、手順で解決するサイト

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

公開 2026年10月21日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

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

あわせて読みたい

GASで宛先ごとに名前や本文の一部を変えてメールを一括送信したい スプレッドシートやExcelをPDFにすると印刷範囲がずれて端に寄る スプレッドシートを毎月PDFにしてGmailに添付して送るのが面倒 ExcelとGoogleスプレッドシートで関数が違って式が動かない