ChatGPTにマクロを作ってもらった。

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

使い方

  1. ExcelでCSVを開く
  2. Alt + F11 → VBAエディタ
  3. 「挿入」→「標準モジュール」
  4. 上のコードを貼り付け
  5. 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

手順

  1. マクロ実行
  2. 「GoogleCal」シートを CSVで保存
  3. Googleカレンダー → 設定 → インポート

✔ 変換 → 整形 → インポート、全部1回で完了


🥈 方法B:Googleスプレッドシートだけで完結(Excel不要)

流れ

  1. CSVを Googleスプレッドシートにアップ
  2. 別シートで 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個で完結させる

ここまで一緒に整えましょうか。


ちゃんと動きました。

 

 

Verified by MonsterInsights