GoogleカレンダーのCSVエクスポート|列の中身を確かめる

「google カレンダー csv エクスポート」で設定画面を開いても、CSVという選択肢はどこにも出てこない。書き出しのボタンを押して降りてくるのは.zipファイルで、中を開くと入っているのは.icsのファイルである。手順を踏み外したわけではない。Googleカレンダーの書き出しが、最初からiCalendar形式の1種類に限られているためである。

必要なのは表の形であることが多い。先月の会議に何時間を使ったのか、ある取引先に週のどれだけを渡しているのか、消えている時間が本当に消えているのか。こうした問いはカレンダーの絵では答えが出ず、行と列に落とさないと数えられない。この記事では、書き出しの前に確かめる条件、ICSを表に変える3つの道、そして作った表をGoogleカレンダーへ戻すときに通る列の決まりを順に整理する。

出口はICSひとつ、入口はICSとCSVの2つ

Googleカレンダーの設定にある項目は「インポート / エクスポート」という対になった名前だが、扱える形は対になっていない。読み込みは.icsと.csvの両方を受け付ける一方で、書き出しは.icsだけである。この非対称が、この作業で行き止まりに当たる原因のほぼすべてを説明する。

Googleカレンダーの標準エクスポート機能では、出力形式が「.ics」形式のみに限定されています。そのため、csvファイルやExcelファイル、Googleスプレッドシート形式では出力することができません。 出典: note.com

この形の差は、検索して出てくる解説が2つに分かれる理由にもなっている。「エクスポートしてExcelで開く」と書いてある手順は、読み込み側の話を書き出し側に取り違えている。読み込みの画面に.csvの入口があるので、そこだけを見ると書き出しにもあるように見える。実際に押せるのは書き出し側の1種類だけで、表の形はこちら側で作ることになる。

つまり、この作業は「CSVでエクスポートする方法を探す」ではなく「ICSを受け取ってから表に変える」という順序になる。どこで変換するかが唯一の論点で、選び方は次の節以降で分かれる。

書き出す前に確かめる3つの条件

書き出しの手順自体は短い。パソコンでGoogleカレンダーを開き、右上の設定から「インポート / エクスポート」を選び、エクスポート欄のボタンを押すと.zipファイルがダウンロードされる。中には管理できるカレンダーごとに.icsファイルが1本ずつ入っている。1つのカレンダーだけが必要なら、左側のマイカレンダーで名前にカーソルを合わせ、「設定と共有」を開いて「カレンダーをエクスポート」を押すと.icsが単体で降りてくる。

そのうえで、Googleのヘルプは書き出しの条件を3つ挙げている。1つ目は、スマートフォンのGoogleカレンダーアプリからは書き出せず、パソコンのGoogleカレンダーだけが対応していることである。2つ目は、書き出す対象のカレンダーに「予定の変更および共有の管理」の権限が必要なことで、他人から共有してもらっただけのカレンダーでは足りない。3つ目は、職場や学校の組織でGoogleカレンダーを使っている場合、管理者がエクスポート設定を制限していることがある点である。詳しくはGoogle カレンダーから予定を書き出すの説明に条件が並んでいる。

もう1つ、つまずきやすい表示がある。「iCal 形式の公開 URL」のリンクを使ったときに「フィード処理エラー」と出る場合は、代わりに「iCal 形式の非公開 URL」を使う。非公開URLが表示されていないカレンダーは、その経路では書き出せない。

1行が何を指すかを決めてから変換する

変換に入る前に決めておくと、やり直しが消える論点が1つある。表の1行が何を指すのかである。

1行が1件の予定を指す形は、変換ツールがそのまま出してくれる単位である。予定の種類の多さや、場所が入っている予定の数を数えるには向く。ただし時間の合計には使えない。毎週の定例は、ICSの中では繰り返しの規則を持った1件として保存されているので、1年間続いた定例も1行にしかならない。

1行が1回の実施を指す形は、勤務表や工数表が求める単位である。繰り返しの規則を展開して、実施日ごとに行を作る必要がある。ここが変換の道を分ける最大の差になる。

1行が1日や1週を指す形は、報告書が求める単位で、実施ごとの行を後から集計して作る。この単位で降りてくる書き出しは存在しないので、表計算側での2段目の作業になる。

「取引先ごとの月の時間」を出したいと決まった時点で、繰り返しの展開は避けて通れないと分かる。この一行を先に書くだけで、次の3つの道のうち1つは候補から外れる。

手元でICSを表に変える道

追加の準備が要らない道である。1か月分を1回だけ数える用途で、何もインストールしない前提を守りたいときに向く。

ICSの中身は文字で読める形をしている。先頭に BEGIN:VCALENDAR の行があり、続いて VERSION:2.0 や PRODID の行が並び、最後に END:VCALENDAR で閉じる。1件の予定は BEGIN:VEVENT と END:VEVENT の行の間に入っている。この構造はGoogleの説明にも書かれており、規格そのものはRFC 5545で公開されている。

変換で崩れやすい箇所は3つある。1つは時刻の扱いで、DTSTART の値は末尾にZが付いたUTC表記のものと、TZIDでタイムゾーンを添えたものが混ざる。読み替えを揃えないと、時刻が9時間ずれた表ができる。2つ目は長い行の折り返しである。RFC 5545は1行の長さを75オクテットまでにすることを求めており、それを超える説明文は次の行へ折り返されて先頭に空白が入る。折り返しを戻さずに読むと、説明の途中で切れた表になる。3つ目は繰り返しで、RRULEの規則を展開しない限り実施ごとの行にはならない。

数える対象が単発の予定ばかりなら、この道で足りる。定例が多いカレンダーでは、展開の実装を自分で持つことになる。

スプレッドシート側から取りに行く道

同じ集計を毎月出す予定があるなら、この道が結果的に速い。GoogleスプレッドシートのApps Scriptからカレンダーを読み、行を書き込む形である。

要点は、繰り返しの展開を自分で書かなくてよいところにある。CalendarAppの getEvents は、指定した期間内に発生したすべての予定を返す。公式の説明は「指定された期間内に開始または終了するイベント、または期間全体を包含するイベント」を返すと書いており、毎週の定例はその期間に入った回数分だけ返ってくる。勤務表の単位が最初から手に入るということである。詳しい仕様はCalendarApp のリファレンスにある。

注意点も同じページに書かれている。時刻にタイムゾーンが指定されていない場合、値はスクリプトのタイムゾーンで解釈され、これはカレンダーのタイムゾーンと違うことがある。スクリプトの設定を確かめずに書くと、月末や月初の数件が隣の月に入る。

書き込んだシートは、ファイルメニューからCSVでもExcelの形式でも保存できる。時間主導のトリガーを付ければ、決まった時刻に書き直させることもできる。1回の集計なら手間が上回るが、毎月同じ問いが来るなら初回だけの投資になる。

アカウントのデータとして丸ごと落とす道

出欠まで数えたい場合は、この道だけが該当する。Googleカレンダーのデータをアカウント単位で書き出す経路である。

Googleの説明によれば、この形で降りてくるiCalendar形式のデータには、予定の開始時間と終了時間、定期的な予定の繰り返し間隔に関するデータ、招待者とその返答ステータス、予定のタイトルと説明と場所、作成日と最終更新日が含まれる。ブレイクアウトセッションの設定はJSON形式で別に降りてくる。招待者と返答ステータスが含まれる点が、設定画面からの書き出しとの実質的な違いになる。内容はGoogle カレンダーからデータを書き出すに列挙されている。

一方で、削除済みのデータは降りてこない。仕事用または学校用のアカウントでは、種類によってダウンロードできないデータがある点も明記されている。

この道で得られるのもiCalendar形式なので、表にする工程は残る。ただし、会議に何人を集めたのか、辞退が何件あったのかを列に持てるのは、この経路を通ったデータだけである。

取り込み直す前提で列を組む

作った表をGoogleカレンダーへ戻す場面は思ったより多い。別のアカウントへ移す、手で直した時刻を反映する、過去の記録を別カレンダーに積む。読み込みは.csvを受け付けるので、そのときの決まりを知っておくと作り直しが消える。

必須の列は2つだけである。予定の名前が入る Subject と、開始日が入る Start Date で、残りは省略できる。使える列は Start Time、End Date、End Time、All Day Event、Description、Location、Private が続く。終日かどうかと限定公開かどうかは True か False で書く。

列名 役割 省略
Subject 予定の名前 不可
Start Date 開始日 不可
Start Time 開始時刻 可
End Date 終了日 可
End Time 終了時刻 可
All Day Event 終日かどうか 可
Description 説明やメモ 可
Location 場所 可
Private 限定公開かどうか 可

書き方の決まりは2つある。ヘッダーは英語で書くこと。そして予定の詳細にカンマを含めるときは、その値を引用符で囲むこと。日本語のヘルプでも列名は英語のまま書くよう指定されている。

落ちる情報も先に知っておく。読み込みでは、予定のゲストと会議のデータは運ばれない。さらに、.csvから定期的な予定を読み込むと、繰り返しの予定としてではなく1回限りの予定の連続として表示されることがある。繰り返しの規則を保ったまま移したい場合は、CSVではなくICSを選ぶ。手順と列の一覧はGoogle カレンダーに予定を読み込むにまとまっている。

表にして最初に見えるのは、会議ではなく間の時間

集計を出した人が最初に気づくのは、会議の合計時間が思っていたほど多くないことである。週の労働時間から会議の合計を引いても、手が動いていた実感のある時間には届かない。差は会議と会議の間にある移動と、始める前の準備と、終わったあとの後処理で、これらはカレンダーに1行も書かれていないので表にも現れない。

書かれていない時間は集計できない。ここが、表を作ったあとに残る本当の課題になる。移動を予定の一部として扱う運用にすると、書き出した表の合計と実際の1日が初めて噛み合う。考え方は移動時間にまとめてあり、1日の組み立て方として読むと集計の穴がどこにあるか見当が付く。

そして、書かれるかどうかを決めるのは意識ではなく入力の手数である。日付を選び、時刻を選び、場所を打ち、移動時間を選ぶ操作が毎回必要なら、急いでいる日は会議だけが残る。話し言葉と音声で予定を入れられる形であれば、移動中に思い出した分をその場で登録できるので、後から書き足す工程が消える。1件あたりの操作は予定の入れ方で確かめられ、全体の流れは使い方で追える。

書き出しと集計をどこまで道具側に任せられるかは、アプリごとに差が出る部分でもある。扱える形と自動化の範囲を軸ごとに並べた他のカレンダーとの比較を見ると、毎月の集計を手作業のどこまで残すかの線引きがしやすくなる。支払いの形まで含めて確かめるなら購入のページも同じ画面で開いておくと判断が早い。

よくある質問

GoogleカレンダーからCSVで直接エクスポートできますか?

できません。設定画面からの書き出しは.icsのiCalendar形式だけで、CSVやExcelの形式は選べません。読み込み側は.csvを受け付けるため入口はありますが、書き出し側には無いので、表の形が必要なときは変換の工程を自分で持つことになります。

書き出したファイルが.zipになっているのはなぜですか?

設定画面からの書き出しは、管理できるカレンダーをまとめて対象にし、カレンダーごとの.icsファイルを1つの.zipに詰めて降ろします。中身を使うには.zipを開いて個々の.icsを取り出します。1つのカレンダーだけなら、そのカレンダーの「設定と共有」から書き出すと.icsが単体で降りてきます。

毎週の定例は表の何行になりますか?

変換の方法で変わります。ICSファイルをそのまま表に直すと、繰り返しの規則を持った1行にしかなりません。実施ごとに行が必要なら、規則を展開する処理か、期間内の発生を返すApps ScriptのgetEventsを使う経路を選びます。時間の合計を出す用途では、この違いが結果を大きく変えます。

エクスポートのボタンが押せないときは何を見ますか?

3点を順に確かめます。スマートフォンのアプリではなくパソコンのGoogleカレンダーを開いているか、対象のカレンダーに「予定の変更および共有の管理」の権限があるか、職場や学校のアカウントで管理者がエクスポート設定を制限していないかです。制限が原因の場合は管理者への確認が必要になります。

記事一覧へ戻る