Googleカレンダーに予定をインポートするのに、今まではデータを切ったり貼ったりしていたんだけれども、もっと楽な方法はないものかと思ってAIに相談しました。
以下よしすけとChatGPTの会話です。
よしすけ

エクセルのスクリーンショットをペーストしてCSVファイルの9行目までをペースト。
やりたいことを指示しました。
ChatGPT
いいですね、これは典型的だけど意外と手でやると面倒なやつです🙂
**「1 が入っている列名を、日付とペアにして縦に吐き出す」**マクロを書けば一発です。
前提(今のCSV/Excelの形)
- A列:日時
- B列以降:人名(中村、社長、金子茂子…)
- セルの値が 1 のところだけ有効
- 1行に複数人いる場合は、その人数分だけ行を増やす
出力形式
2026/4/1,大田
2026/4/4,中村
2026/4/4,社長
2026/4/4,金子茂子
2026/4/5,前田
2026/4/6,中村
2026/4/7,金子茂子
VBAマクロ(そのまま使えます)
Sub ConvertCSVStyle()
Dim srcWs As Worksheet
Dim dstWs As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim r As Long, c As Long
Dim outRow As Long
' 元データのシート
Set srcWs = ActiveSheet
' 出力用シートを作成(既にあれば削除)
Application.DisplayAlerts = False
On Error Resume Next
Worksheets("変換結果").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set dstWs = Worksheets.Add
dstWs.Name = "変換結果"
' 最終行・列
lastRow = srcWs.Cells(srcWs.Rows.Count, 1).End(xlUp).Row
lastCol = srcWs.Cells(1, srcWs.Columns.Count).End(xlToLeft).Column
outRow = 1
' データ走査
For r = 2 To lastRow
For c = 2 To lastCol
If srcWs.Cells(r, c).Value = 1 Then
dstWs.Cells(outRow, 1).Value = srcWs.Cells(r, 1).Value
dstWs.Cells(outRow, 2).Value = srcWs.Cells(1, c).Value
outRow = outRow + 1
End If
Next c
Next r
' CSVっぽく見せる(任意)
dstWs.Columns("A:B").AutoFit
MsgBox "変換が完了しました", vbInformation
End Sub
使い方
- ExcelでCSVを開く
- Alt + F11 → VBAエディタ
- 「挿入」→「標準モジュール」
- 上のコードを貼り付け
- Excelに戻って マクロ実行
→ 「変換結果」シートに、希望どおり縦持ちデータが生成されます。
応用(必要なら)
- CSVとして自動保存したい
- 「1」以外(TRUE / ○ / ✔)でも反応させたい
- 日付フォーマットを強制したい
- 出力を既存シートに追記したい
このへんもすぐ拡張できます。
次はどこまで自動化します?
よしすけ
このデータ変換の目的はGoogleカレンダーにインポートするためなのですが、もっと手順を省くようなやり方があれば提案してください。
ChatGPT
目的が Googleカレンダーに入れるだけ なら、
正直いま考えている「Excel → マクロ → CSV」は やや重装備 です。
手順を削る方向で、現実的な選択肢を整理しますね。
結論から(おすすめ順)
🥇 方法A:Excelで一発生成 → そのままGoogleカレンダー用CSV
👉 マクロ1本・中間作業ゼロ
🥈 方法B:Googleスプレッドシートで直接変換
👉 Excelすら使わない/クラウド完結
🥉 方法C:Google Apps Script(完全自動)
👉 定期運用向け・一度作れば放置
🥇 方法A:Excelで「Googleカレンダー仕様CSV」を直接作る(最短)
GoogleカレンダーのCSVは、最低限これでOKです:
Subject,Start Date
中村,2026/4/4
社長,2026/4/4
つまり
- 「日付 + 人名」= イベント
- 時間がなければ 終日イベント で問題なし
改良版マクロ(そのままインポート可)
Sub ExportForGoogleCalendar()
Dim ws As Worksheet
Dim outWs As Worksheet
Dim r As Long, c As Long
Dim lastRow As Long, lastCol As Long
Dim outRow As Long
Set ws = ActiveSheet
Application.DisplayAlerts = False
On Error Resume Next
Worksheets("GoogleCal").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set outWs = Worksheets.Add
outWs.Name = "GoogleCal"
' Googleカレンダー用ヘッダ
outWs.Cells(1, 1).Value = "Subject"
outWs.Cells(1, 2).Value = "Start Date"
outWs.Cells(1, 3).Value = "All Day Event"
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
outRow = 2
For r = 2 To lastRow
For c = 2 To lastCol
If ws.Cells(r, c).Value = 1 Then
outWs.Cells(outRow, 1).Value = ws.Cells(1, c).Value
outWs.Cells(outRow, 2).Value = ws.Cells(r, 1).Value
outWs.Cells(outRow, 3).Value = "True"
outRow = outRow + 1
End If
Next c
Next r
MsgBox "Googleカレンダー用CSV完成", vbInformation
End Sub
手順
- マクロ実行
- 「GoogleCal」シートを CSVで保存
- Googleカレンダー → 設定 → インポート
✔ 変換 → 整形 → インポート、全部1回で完了
🥈 方法B:Googleスプレッドシートだけで完結(Excel不要)
流れ
- CSVを Googleスプレッドシートにアップ
- 別シートで
FLATTENを使う
=ARRAYFORMULA(
SPLIT(
FLATTEN(
IF(B2:G="",,A2:A&","&B1:G1)
),
",")
)
→ そのまま「日付・名前」リスト完成
→ ファイル → 共有 → CSVでダウンロード → インポート
✔ VBA不要
✔ マクロ禁止環境でもOK
🥉 方法C:Google Apps Script(最終形態)
- CSVをDriveに置くだけ
- 自動でイベント作成
- CSVすら不要
CalendarApp.getDefaultCalendar()
.createAllDayEvent(name, new Date(date))
👉 定期的に同じ形式のデータを流し込む人向け
(今回が単発ならオーバーキル)
判断基準まとめ
| 状況 | ベスト |
|---|---|
| Excel使ってる | 🥇 方法A |
| マクロ禁止 | 🥈 方法B |
| 毎月やる | 🥉 方法C |
率直な結論
Googleカレンダーがゴールなら
「中間CSV」を作る発想を捨てたほうが速い
もし次にやるなら、
- 人ごとに色分けしたい
- カレンダーを分けたい
- 時間帯(9:00–17:00)を入れたい
ここまで含めて設計できます。
どこまで自動化します?
よしすけ
(今回が単発ならオーバーキル)ってどういう意味ですか?やり過ぎっていうこと?
ChatGPT
そうそう、その理解で ぴったり合ってます 🙂
「オーバーキル(overkill)」 というのは、
目的に対して、手段や仕組みが必要以上に大がかり・強力すぎる
→ つまり やり過ぎ
という意味です。
今回の文脈で言うと
- やりたいこと
→ 「この表を一回だけ Googleカレンダーに入れたい」 - Google Apps Script案
→- スクリプトを書く
- 権限設定する
- Drive・Calendar APIの理解が必要
- デバッグも発生する可能性あり
これを 一回きりの作業 に使うと、
🐜を踏みつぶすのに🛠大型建設機械を持ち出す
みたいな感じになるわけです。
だから「単発ならオーバーキル」
| 手段 | 適正 |
|---|---|
| Excelマクロ | ちょうどいい |
| スプレッドシート関数 | ちょうどいい |
| Apps Script | 継続運用前提なら最強/単発だとやり過ぎ |
逆に「オーバーキルじゃなくなる瞬間」
もし今後こんなことが起きたら、話は変わります:
- 毎月・毎週このCSVが来る
- 担当者が変わっても自動で入れたい
- 人が触るとミスが出る
- カレンダーが業務の基幹になる
この場合は、
「一回で済む楽」より
「毎回考えなくていい仕組み」
の方が価値が出てきます。
まとめると
- はい、「やり過ぎ」という意味
- ただし 悪い意味ではなく
- 「将来を見越すならアリ」な手段
言葉が少し乱暴だったので、そこ引っかかるのは自然です。
他にもIT用語で「これ日本語だと誤解されやすいな」というの、気になったらどんどん聞いてください。
1年に1回しかつかわないんですけど、どうですかね?
ChatGPT
率直に言いますね。
「1年に1回」なら、Apps Scriptはやり過ぎです。
しかも かなり。
判断をハッキリさせると
年1回の作業に対して
| 手段 | 評価 |
|---|---|
| Excelマクロ | ◎ 最適 |
| スプレッドシート関数 | ○ まあ良い |
| Apps Script | ✕ コスパ悪い |
理由はシンプルで、
- 1年後には
「あれ?これどうやるんだっけ?」
になります。 - スクリプトは 思い出しコスト が高い。
- 権限・仕様変更で 去年動いたものが今年動かない こともある。
1年に1回なら、いちばん大事なのは
「考えなくても再現できること」
技術的にカッコいいかどうかは、正直どうでもいいです。
おすすめの現実解(これで十分)
✔ Excelマクロを1本だけ保存
- ファイル名例
GoogleCalendar用_変換.xlsm - シートに 「①マクロ実行 → ②CSV保存 → ③インポート」 と書いておく
👉 来年の自分への説明書付き
さらに省力化するなら(ワンポイント)
- マクロで CSVまで自動保存
- ファイル名に年を自動付与
ThisWorkbook.SaveAs _
Filename:="GoogleCalendar_" & Year(Date) & ".csv", _
FileFormat:=xlCSV
※ここまでやっても、まだ「適正レベル」
逆に「やらない方がいいこと」
- GASを書く
- APIを叩く
- 自動実行・トリガー設定
👉 1年に1回だと 必ず忘れる
👉 忘れる仕組みはストレスになる
結論
年1回 → 仕組みは「紙の手順書レベル」が正解
Excelマクロ+短いメモ。
これが一番ラクで、一番失敗しません。
もしよければ、
- 「来年の自分向けコメント」をマクロに埋め込む
- ボタン1個で完結させる
ここまで一緒に整えましょうか。
ちゃんと動きました。