Claude Code に Excel とスプレッドシート、どちらを作らせるか|15の操作と5つの観点で実測比較
Claude Code に表を作らせるとき、Excel にするか Google スプレッドシートにするかで迷うことがあります。どちらでも作れますが、AI エージェントに任せると、人が手で触るときとは違うところで差が出ます。
当社で両方を同じ条件で試したところ、差がはっきり出たのは次の点でした。
| こんなとき | 向いているもの | 理由 |
|---|---|---|
| 新しい表を一気に作る・大量の行を書く | Excel | 1000 行でも 0.04 秒。スプレッドシートは 1 回の操作に 0.5〜1.2 秒かかる |
| 数式を含む表に、行を足したり消したりし続ける | スプレッドシート | 行を挿入しても数式が追従する。Excel(openpyxl)は追従せず、合計が合わなくなった |
| 計算結果を AI 自身に確かめさせたい | スプレッドシート | 計算済みの値をそのまま読める。Excel は再計算の手間が要る |
| 人から受け取ったファイルに記入して返す | Excel(書き換え方に注意) | 保存し直すと図形が消える。スプレッドシートに変換するとフィルタが壊れた |
どちらを選んでも共通して必要なのが、行番号を覚えたまま書き込まないことです。行を消したあとに、消す前に調べた行番号で書き込むと、両方とも合計の行を上書きしました。
この記事では、15 の基本操作と 5 つの観点について、Claude Code で実際に試した結果をまとめます。
検証の条件
- エージェント: Claude Code(Linux 上で実行)
- Excel: Python の openpyxl 3.1.5 で読み書きしました。新規作成には xlsxwriter、計算結果と見た目の確認には LibreOffice(画面を出さない headless モード)を使いました
- スプレッドシート: Google Workspace を操作する CLI の gogcli(v0.12.0 に、行・列の削除コマンドを当社で追加したもの。以下 gog)を使いました。gog は Google Sheets API を呼ぶ道具で、認証は事前に済ませてあります
- 比べる対象: 手元にある Excel ファイルと、Google ドライブ上のスプレッドシートです。OneDrive 上の Excel は対象外です
Codex など、ほかのエージェントでも考え方は同じです。この記事では、実際に確かめた Claude Code の結果だけを書きます。
Claude Code で Excel とスプレッドシートを操作する仕組み
Excel:手元のファイルを直接書き換える
Claude Code は、Python のスクリプトを書いて実行し、xlsx ファイルを直接読み書きします。ファイルは手元にあるので、認証は要りません。
openpyxl と xlsxwriter は pip で入ります。
pip install openpyxl xlsxwriterimport openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.append(["日付", "担当", "数量", "単価", "金額"])
ws.append(["9/1", "鈴木", 1, 1000, "=C2*D2"])
wb.save("売上.xlsx")注意したいのは、openpyxl は数式を書くだけで、計算はしないことです。計算するのは、ファイルを開いた Excel や LibreOffice です。
スプレッドシート:ドライブ上のファイルを API で操作する
スプレッドシートは Google ドライブ上にあり、手元にはありません。Claude Code は、Sheets API を呼ぶ CLI を実行して、ネット越しに操作します。
# 範囲をまとめて書き込む(値は JSON の 2 次元配列)
gog sheets update -a <アカウント> <スプレッドシートID> '売上!A1:E2' \
--values-json '[["日付","担当","数量","単価","金額"],["9/1","鈴木",1,1000,"=C2*D2"]]'
# 読み取る(計算済みの値が返る)
gog sheets get -a <アカウント> <スプレッドシートID> '売上!A1:E2'計算は Google 側で行われます。そのため、書いた直後に読むと、計算済みの値が返ってきます。
基本操作 15 項目の比較
よく使う操作を 15 に絞り、両方で試しました。時間は、1 回の操作にかかった実測値です。
| 操作 | Excel(openpyxl) | スプレッドシート(gog) |
|---|---|---|
| 新規作成 | できる | できる |
| シートの追加・名前変更・削除 | できる | できる |
| 読み取り | できる。数式の計算結果は読めない | できる。計算済みの値が返る |
| セルの更新(1 セル・範囲) | できる | できる |
| 行の追加(末尾) | できる | できる |
| 行の追加(途中に挿入) | できる。数式は追従しない | できる。数式が追従する |
| 行の削除 | できる。数式は追従しない | できる。数式が追従する |
| 列の追加・削除 | できる | できる |
| 検索して置換 | 機能は無い。Python で 1 セルずつ置き換える | できる |
| 数式と計算結果の読み返し | 数式は書ける。計算結果は LibreOffice で再計算しないと読めない | できる |
| 書式(太字・背景色) | できる | できる |
| 表示形式(金額など) | できる | できる |
| セルの結合 | できる | できる |
| 見出し行の固定 | できる | できる |
| CSV の取り込み・書き出し | openpyxl に機能は無い。Python の csv モジュールと組み合わせる | できる |
| 画像の挿入 | できる。画像ファイルを指定して置ける | 数式 =IMAGE("URL") で入れる。画像を誰でも開ける場所に置き、人がブラウザで「アクセスを許可」を押す必要がある |
| 1 回の操作にかかる時間(参考) | 0.002〜0.005 秒 | 0.5〜1.2 秒(行の削除で 4.8 秒かかった回もあった) |
※ 行の追加は、末尾と途中で結果が違うため 2 行に分けています。末尾に足した行は、どちらも合計行の下に入り、合計の範囲に入りませんでした。
できることの範囲は、ほとんど同じでした。差が出たのは、数式の扱いと速さ、それに画像の挿入です。これを次の観点で詳しく見ていきます。
CSV の書き出しでも違いがありました。Excel(openpyxl と csv モジュール)では、数式が =C2*D2 という文字列のまま出力され、計算結果は入りません。スプレッドシートでは、表示形式が付いたままの値(¥2,000 など)が出力されます。どちらも、ほかのシステムに渡す前に中身を確かめる必要があります。
画像の挿入は、スプレッドシートだと公開の置き場所と人の許可が要る
Excel(openpyxl)は、画像ファイルを指定すればシートの上に置けます。手元の画像をそのまま使えます。
スプレッドシートは、API から画像を置く代わりに、セルに =IMAGE("画像のURL") という数式を書きます。画像を表示させるには、2 つの準備が要りました。
1 つめは、画像を誰でも開ける場所に置くことです。Google ドライブに置いただけの非公開の画像は、空欄のままでエラーも出ませんでした。同じ画像を「リンクを知っている全員」に公開すると、表示されました。
2 つめは、人がパソコンのブラウザでシートを開き、「アクセスを許可」を押すことです。数式を書き込んだ直後は、公開されている画像でも次のエラーになりました。
#REF! (Please use a desktop web browser to allow access to fetch data from external urls.)つまり、AI エージェントだけでは画像入りのシートを完成させられず、画像の公開と、人の操作が 1 回ずつ必要になります。社外に出せない画像は、この方法では入れられません。
さらに、許可を出したあとで API からセルの値を読むと、表示された画像のセルも、空欄のセルも、どちらも値がありませんでした。AI が値を読むだけでは、画像が出ているかどうかを見分けられません。確かめるには、PDF にして見た目を見る必要があります(観点3)。
方法ごとの「できる/できない」
同じ Excel やスプレッドシートでも、使う道具によってできることが変わります。今回試した方法を並べます。
| 方法 | できること | できないこと・注意点 |
|---|---|---|
| openpyxl(Excel) | 読み書き・書式・シートの操作 | 再計算しない。行の挿入・削除で数式が追従しない。保存し直すとテキストボックスが消える |
| xlsxwriter(Excel) | 新規作成。テキストボックスなども作れる | 既存のファイルは開けない |
| LibreOffice(Excel) | 再計算(0.92 秒)。PDF にして見た目を確認 | 表を組み立てる道具ではない。確認用に使う |
| XML の直接書き換え(Excel) | セルだけを書き換え、ほかは一切変えない | 行の挿入や書式の変更は、自分で XML を扱う必要がある |
| gog(スプレッドシート) | 値の読み書き・行と列の操作・書式・結合・固定・検索置換・CSV | 使える操作は CLI が用意したコマンドの範囲に限られる |
| Claude の Google ドライブ連携(スプレッドシート) | 読み取り。計算済みの値や結合セルも見える | セルは編集できない(変えられるのはファイル名と置き場所だけ)。1000 行のシートは途中までしか返らなかった |
Claude の Google ドライブ連携は、Claude に Google ドライブをつなぐ機能です。スプレッドシートの中身を読むのには便利ですが、編集はできませんでした。編集させるなら、gog のような CLI か、Sheets API を使う道具が要ります。
観点1:既存ファイルを壊さずに直せるか
openpyxl で保存し直すと、テキストボックスが消える
人から受け取った Excel に記入して返す場面を想定しました。テキストボックス 2 つ、コメント、プルダウン(入力規則)、フィルタ、非表示の行を含むファイルを作り、1 つのセル(B2)に名前を書き込みました。
| 項目 | 元のファイル | openpyxl で保存し直し | XML を直接書き換え | スプレッドシートに変換して戻す |
|---|---|---|---|---|
| ファイル内の部品数 | 15 | 13 | 15 | 13 |
| テキストボックス | 2 | 0 | 2 | 2 |
| コメント | 1 | 1 | 1 | 1 |
| 入力規則 | 1 | 1 | 1 | 1 |
| フィルタの条件 | 1 | 1 | 1 | 0 |
| 非表示の行 | 10 | 10 | 10 | 20(全部) |
| カスタムプロパティ | 1 | 1 | 1 | 0 |
セルを 1 つ書き換えただけでも、openpyxl で保存し直すとテキストボックスが消えました。「ここに社印を押してください」のような案内が、黙って消えるということです。なお、別に試したところ、シートに置いた画像は保存し直しても残りました。
当社では、取引先から受け取ったヒアリングシートで同じことが起きました。openpyxl で開いて保存し直しただけで、ファイル内の部品が 66 から 20 に減り、シート名も変わりました。
スプレッドシートに変換すると、フィルタが壊れる
「では、スプレッドシートに変換して編集し、Excel に戻せばよいか」というと、そうでもありませんでした。テキストボックスは残りましたが、フィルタの条件が消え、データの行がすべて非表示の状態で保存されていました。
壊さずに直すなら、XML を直接書き換える
xlsx ファイルの中身は、XML ファイルを zip でまとめたものです。書き換えたいセルの XML だけを差し替え、ほかのファイルは 1 バイトも変えずにコピーすれば、部品は何も失われません。
import re, zipfile
from xml.sax.saxutils import escape
def set_cell(src, dst, sheet_xml, ref, text):
"""シートの XML の中で、セル 1 つだけを文字列で書き換える。ほかのファイルはそのままコピーする"""
row = re.sub(r"\D", "", ref)
value = escape(text) # & < > をエスケープしないと、ファイルが壊れる
def new_cell(attrs):
attrs = re.sub(r'\s+t="[^"]*"', "", attrs) # 型だけ差し替え、書式(s="…")は残す
return f'<c{attrs} t="inlineStr"><is><t xml:space="preserve">{value}</t></is></c>'
with zipfile.ZipFile(src) as zin, zipfile.ZipFile(dst, "w", zipfile.ZIP_DEFLATED) as zout:
for item in zin.infolist():
data = zin.read(item.filename)
if item.filename == sheet_xml:
s = data.decode()
if f'<c r="{ref}"' in s:
s = re.sub(rf'<c( r="{ref}"[^>]*?)(?:/>|>.*?</c>)',
lambda m: new_cell(m.group(1)), s, count=1, flags=re.S)
else: # セルが無ければ行の末尾に足す(右隣の列にセルが無い場合だけ使える)
s = re.sub(rf'(<row r="{row}"[^>]*>.*?)(</row>)',
lambda m: m.group(1) + new_cell(f' r="{ref}"') + m.group(2), s, count=1, flags=re.S)
data = s.encode()
zout.writestr(item, data)
set_cell("申込書.xlsx", "申込書_記入済み.xlsx", "xl/worksheets/sheet1.xml", "B2", "山田太郎")書き込む値は、必ずエスケープしてから XML に入れます。「田中&鈴木」のように & や < を含む値をそのまま入れると、openpyxl では開けないファイルになりました。LibreOffice ではエラーにならず、その値だけが消えていました。気づきにくい壊れ方です。
また、元のセルに付いている書式の指定(s="…")は残します。セルを丸ごと差し替えると、記入欄の太字や背景色、罫線が消えます。上の関数で、書式付きのセルや & を含む値を書き込んでも、値と書式がそのまま残ることを確かめました。
これは文字列を 1 か所書き込むための最小限の例です。数値や日付を入れる場合や、シート名から XML ファイル名を調べる場合は、処理を足す必要があります。
AI エージェントに記入を任せるときは、「openpyxl で開いて保存し直さないこと」「XML のセルだけを差し替えること」を指示に入れておくと安全です。
観点2:準備の手間と、AI が書き込めるか
Excel は準備が要らない
Excel は手元のファイルなので、Python と openpyxl があればすぐに書き込めます。認証も要りません。
スプレッドシートは認証が要る
スプレッドシートを操作するには、Google アカウントの認証と、Sheets API を使うための設定が必要です。一度済ませてしまえば、あとは CLI を呼ぶだけで操作できます。
観点3:AI が結果を自分で確かめられるか
Excel は、計算結果を読み返せない
openpyxl で数式を書いたファイルは、計算結果を持っていません。計算結果として読もうとすると、空(None)が返ります。
wb = openpyxl.load_workbook("売上.xlsx", data_only=True) # 計算結果を読む指定
print(wb.active["E2"].value) # → NoneAI が「合計が正しいか確かめて」と言われても、このままでは確かめられません。LibreOffice で再計算したファイルを作れば、計算結果を読めるようになります。
soffice --headless --calc --convert-to xlsx --outdir recalc 売上.xlsx今回の環境では、再計算は 0.92 秒で終わりました。
スプレッドシートは、計算済みの値をそのまま読める
スプレッドシートは Google 側で計算されるので、書いた直後に読めば計算済みの値が返ります。数式そのものを見たいときは、--render FORMULA を付けます。
gog sheets get -a <アカウント> <スプレッドシートID> '売上!E2' # → 1000
gog sheets get -a <アカウント> <スプレッドシートID> '売上!E2' --render FORMULA # → =C2*D2見た目は、どちらも画像にすれば確認できる
AI が見た目まで確かめたいときは、PDF にして画像に変換し、それを読ませます。
- Excel: LibreOffice で PDF にします。テキストボックスは描かれ、非表示の行は描かれませんでした
- スプレッドシート:
gog sheets export --format pdfで PDF にします。2.76 秒かかりました。見出しの太字や背景色、結合、表示形式が確認できました
観点4:置き場所と処理速度
1 回の操作の重さが 100 倍以上違う
Excel は手元のファイルを書き換えるだけなので、1 回の操作が 0.002〜0.005 秒で終わります。スプレッドシートはネット越しの操作になるので、1 回に 0.5〜1.2 秒かかりました。
| 書き込む量 | Excel | スプレッドシート(まとめて 1 回) |
|---|---|---|
| 100 行 | 0.009 秒 | 0.58 秒 |
| 1000 行 | 0.04 秒 | 0.76 秒 |
スプレッドシートでも、まとめて 1 回で送れば 1000 行で 1 秒かかりませんでした。問題になるのは、1 行ずつ送る場合です。
1 行ずつ送ると、回数制限に引っかかる
スプレッドシートに 100 行を 1 行ずつ書き込んだところ、69.4 秒かかりました。さらに、59 回目で次のエラーが返りました。
Google API error (429 rateLimitExceeded): Quota exceeded for quota metric 'Write requests'
and limit 'Write requests per minute per user' of service 'sheets.googleapis.com'Sheets API には、1 分あたりの書き込み回数の制限があります。公式ドキュメントでは、書き込みは 1 ユーザー・1 プロジェクトあたり 1 分に 60 回までとされています。59 回目で止まったのは、この上限に達したためと考えられます。
出典: Usage limits | Google Sheets | Google for Developers
今回のスクリプトはエラーを記録して次の行へ進む作りだったため、エラーになった 1 行だけが空欄のまま残りました。
スプレッドシートに大量のデータを書かせるときは、「まとめて 1 回で書き込むこと」を指示に入れ、書き込んだあとに件数を確かめさせると安全です。
観点5:行や数式のずれ
Excel(openpyxl)は、行を挿入しても数式が追従しない
5 行のデータと合計の行がある表に、4 行目へ 1 行を挿入しました。正しい合計は 25,000 です。
| Excel(openpyxl) | スプレッドシート(gog) | |
|---|---|---|
| 挿入した行より下の金額の数式 | =C4*D4 =C5*D5 =C6*D6(1 行ずつずれたまま) | =C5*D5 =C6*D6 =C7*D7(正しく追従) |
| 合計の数式 | =SUM(E2:E6)(挿入した行が範囲から外れる) | =SUM(E2:E7) |
| 合計(再計算後) | 26,000 | 25,000 |
openpyxl で行を挿入すると、行の位置だけが動き、数式は元の文字列のまま残ります。その結果、挿入した行より下の金額が、1 つ上の行の数量で計算されていました。
openpyxl で行を挿入・削除するときは、数式を書き直す処理も自分で書く必要があります。数式を含む表を何度も更新するなら、スプレッドシートのほうが安全です。
どちらも、古い行番号で書き込むと別の行を上書きする
次は、AI エージェントが「9/5 の行の数量を 99 に直す」と決めて行番号を調べたあと、別の指示で 2 行目を削除し、そのあとで調べておいた行番号のまま書き込む場面です。
| Excel(openpyxl) | スプレッドシート(gog) | |
|---|---|---|
| 書き込んだ場所 | 合計の行の数量欄 | 合計の行の数量欄 |
| 数式 | すべて 1 行ずつずれた | 正しく追従した |
行を削除すると、その下の行は 1 つずつ上に詰まります。削除する前に調べた行番号は、もう別の行を指しています。これはスプレッドシートでも防げません。当社でも、AI エージェントがスプレッドシートの別の行を上書きしてしまったことがあります。
防ぐには、書き込む直前に、日付や ID のような変わらない値で行を探し直すことです。AI エージェントには「行番号を覚えておいて後で使わない」「書き込む直前に探し直す」と指示しておきます。
使い分けの指針
試した結果から、次のように使い分けるのがよいと考えています。
Excel が向いている場面
- 新しい表やレポートを、まとめて作る
- 大量の行を扱う(スプレッドシートの回数制限を気にしなくてよい)
- 画像を入れた資料を作る(手元の画像をそのまま置ける)
- ネットにつながらない環境や、ファイルで納品する場面
スプレッドシートが向いている場面
- 数式を含む表に、行を足したり消したりし続ける
- 計算結果を AI に確かめさせながら進める
どちらでも気をつけること
- 行番号を覚えたまま書き込まない。書き込む直前に探し直す
- Excel で人から受け取ったファイルを直すときは、openpyxl で保存し直さない
- スプレッドシートに大量に書くときは、まとめて 1 回で送る
まとめ
Claude Code に Excel とスプレッドシートを作らせて比べたところ、できる操作の範囲はほとんど変わりませんでした。差が出たのは、速さと数式の扱い、それに画像の挿入です。
- Excel は速く、準備も要りません。ただし、openpyxl は計算をせず、行を挿入しても数式を直しません
- スプレッドシートは 1 回の操作が遅く、回数制限もあります。画像を入れるには、画像を公開したうえで、人が一度許可を出す必要があります。そのかわり、数式は Google 側で正しく直され、計算結果もすぐに読めます
- 人から受け取った Excel を直すときは、どちらの方法でも部品が失われることがあります。XML のセルだけを書き換えるのが確実です
AI エージェントに表を任せるときは、どちらのツールかよりも、「どう書き換えさせるか」を指示に書いておくことが大切です。
私たちは、AIエージェントを実際の業務に組み込んで運用しています。表の作成や更新を AI に任せる仕組みづくりや、開発体制そのもののご相談も承っています。お問い合わせはこちらよりお気軽にご相談ください。
この検証を行ったのは 株式会社Amanity です。 自社で手を動かして技術を確かめたうえで、モバイルアプリ・LINEアプリ・Webアプリの受託開発を行っています。
開発について相談する