大きいGoogleスプレッドシートをAIに全件読ませる(自然言語の書き出しは黙って切られる)
行数の多いシートはコネクタの自然言語書き出しだと途中で切れ、AIは成功と報告する。xlsxをbase64で取りZIPとして自力で開いて全件取り込む手順と、部分一致の誤ヒットを止めるガードまで。
約3.8万トークンの節約 (API料金換算で約57円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「大きいGoogleスプレッドシートをAIに全件読ませる(自然言語の書き出しは黙って切られる)」は、Google WorkspaceカテゴリのAI指示書(MDファイル)です。行数の多いシートはコネクタの自然言語書き出しだと途中で切れ、AIは成功と報告する。xlsxをbase64で取りZIPとして自力で開いて全件取り込む手順と、部分一致の誤ヒットを止めるガードまで。この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約3.8万トークン(API料金換算で約57円)・90%のトークンを節約できます。
- カテゴリ
- Google Workspace
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約4.2万トークン
- この巻物使用時
- 約4,200トークン
- 節約量
- 約3.8万トークン (約57円)
- 更新日
- 2026-09-24
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/google-ai-2/raw を読み込んで、この指示書どおりに実装して"
中身
大きい Google スプレッドシートを AI に「全件」読ませる(自然言語書き出しは途中で切れる)
これは何の指示書か
AI アシスタント(Claude / ChatGPT など)に Google ドライブ連携を付けて「この表を読んで」と頼むと、 行数の多いシートでは途中までしか返らない。しかも AI は「読めた」と報告するので、 不完全なデータで実装が進み、後工程で初めて破綻する。
この指示書は、その取りこぼしを起こさずに 全行を確実に取り込む手順を示す。 表計算ファイルを .xlsx のまま取得し、ZIP として自力で展開して読む。追加ライブラリは要らない。
対象読者: 業務スプレッドシートを参照するアプリ・自動化を AI に作らせる人。
1. まず知っておく失敗
失敗A: 自然言語の書き出しは黙って切られる
コネクタの「ファイル内容を読む」系 API は、表を人間が読みやすいテキストに変換して返す。 大きいファイルでは上限で打ち切られるが、打ち切られた旨が本文からは分からないことがある。
実測例: 4,190 行のシートで、取り込めたのは 570 件だけ(13%)。 AI はその 570 件で照合ロジックを実装し、テストで「引き当てられない」と出て初めて発覚した。
検知のしかた: 取り込み後に必ず 件数を数え、元の表の行数と突き合わせる。 「それらしいデータが返ってきた」を成功と見なさない。
失敗B: OAuth スコープ不足で export だけ 403
CLI ツール(例: Apps Script 用の認証)のトークンを流用すると、
メタデータ取得は 200 なのに、CSV/xlsx への書き出しだけ 403 になることがある。
drive.file(そのアプリが作ったファイルのみ)しか持っていないのが原因で、
drive.readonly が要る。トークンを使い回す前にスコープを確認する。
失敗C: ブラウザ自動化での取得も落とし穴が多い
ログイン済みプロファイルを使ったヘッドレス取得は、 別アカウントでログインしていると「ファイルを開くことができません」の HTML が返り、 それを CSV として保存してしまう。保存した中身の先頭数行を必ず目視する。
2. 正解の手順: .xlsx で取って自力で開く
2-1. .xlsx を base64 で取得する
コネクタの「ファイルをダウンロード」系 API に、書き出し形式を明示する。
exportMimeType: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
返ってくるのは { content: "<base64>", title, mimeType } の JSON。
巨大なので、AI の文脈に載せずファイルへ保存してから処理する(多くのツールは自動でファイルに退避してパスを教えてくれる)。
2-2. .xlsx は ZIP なので、そのまま開ける
追加ライブラリは不要。Python の標準ライブラリだけで読める。
import json, io, base64, zipfile, re
data = json.load(io.open("<ダウンロード結果のJSON>", encoding="utf-8"))
raw = base64.b64decode(data["content"])
open("book.xlsx", "wb").write(raw)
z = zipfile.ZipFile("book.xlsx")
print(z.namelist()[:10]) # xl/workbook.xml, xl/sharedStrings.xml, xl/worksheets/sheet1.xml ...
2-3. シート名から実体ファイルを特定する
xl/workbook.xml のシート名と xl/_rels/workbook.xml.rels の関係 ID を突き合わせる。
シート名の順番と sheetN.xml の番号は一致しないので、必ず rels 経由で引く。
wb = z.read('xl/workbook.xml').decode('utf-8')
rels = z.read('xl/_rels/workbook.xml.rels').decode('utf-8')
relmap = dict(re.findall(r'Id="(rId\d+)"[^>]*Target="([^"]+)"', rels))
sheets = re.findall(r'<sheet[^>]*name="([^"]+)"[^>]*r:id="(rId\d+)"', wb)
target = {name: relmap[rid] for name, rid in sheets}["<読みたいシート名>"]
2-4. 文字列は共有テーブルにある
セルの値が t="s" のとき、<v> の中身は xl/sharedStrings.xml の添字であって文字列ではない。
ここを読み飛ばすと全部が数字に見える。
ss = []
for si in re.finditer(r'<si>(.*?)</si>', z.read('xl/sharedStrings.xml').decode('utf-8'), re.S):
ss.append(''.join(re.findall(r'<t[^>]*>(.*?)</t>', si.group(1), re.S)))
2-5. 行とセルを列記号のまま拾う
列を数えるのではなく セルの r 属性(例 D12)から列記号を取る。
空セルは XML に現れないので、位置で数えるとズレる。
sheet = z.read('xl/' + target).decode('utf-8')
rows = {}
for r in re.finditer(r'<row[^>]*r="(\d+)"[^>]*>(.*?)</row>', sheet, re.S):
cells = {}
for c in re.finditer(r'<c r="([A-Z]+)\d+"([^>]*)>(.*?)</c>', r.group(2), re.S):
col, attrs, body = c.group(1), c.group(2), c.group(3)
v = re.search(r'<v>(.*?)</v>', body, re.S)
if 't="s"' in attrs and v:
val = ss[int(v.group(1))]
else:
t = re.search(r'<is>.*?<t[^>]*>(.*?)</t>', body, re.S)
val = t.group(1) if t else (v.group(1) if v else '')
cells[col] = val.strip()
rows[int(r.group(1))] = cells
print("取得行数:", len(rows)) # ← 元の表の行数と必ず突き合わせる
これで 「D 列の品名」「L 列の保管場所」 のように、人が表で見ているのと同じ列記号でアクセスできる。
3. 取り込んだ後に必ずやる 2 つの検算
- 件数の突き合わせ: 取得行数と、表の見た目の行数(またはフィルタ後の件数)を比べる。 桁が違えば取りこぼし。
- 列の分布を見る: 目的の列に入っている値を集計して出す。
例: 保管場所の列 →
A倉庫 1937 / B倉庫 430 / 所在不明 520 / 空 464。 「所在不明」「0」「空」のようなゴミが必ず混ざるので、採用する値を明示的に列挙して絞る (拾う値のホワイトリストを書く。捨てる値のブラックリストにしない)。
4. 部分一致で引き当てるときの必須ガード
取り込んだ表を「商品名 → 保管場所」のようなあいまい照合に使うと、 一般語で誤ヒットして、誰も気づかない誤った値を出力する。
実測した事故: 存在しない架空の商品名を渡したら、「商品」という 2 文字が 別アイテムの「…商品コード51315」に一致し、無関係な保管場所を自信満々に返した。 これがそのまま見積書に載れば、誤った発送元と送料を顧客に提示することになる。
必ず入れるガード:
- 一般語の除外リストを持つ(商品 / セット / 用品 / サイズ / タイプ / 本体 / 専用 / 一式 / 対応 / set / type …)
- 2 文字の語は原則使わない。使うならカタカナのみ・英数字のみに限る
- 候補が多すぎる語は捨てる(その語に 50 件以上ヒットするなら、その語では特定できていない)
- 引き当てられなかったときは null を返す。近いものを無理に返さない
- テストに「存在しない入力 → null」を必ず 1 件入れる(これが無いと誤ヒットに永遠に気づかない)
5. そのまま使える依頼文(AI に貼る)
<スプレッドシートのファイルID> の「<シート名>」シートを全件取り込みたい。
手順:
1. Drive コネクタの「ファイルをダウンロード」で
exportMimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
を指定し、結果はファイルへ保存すること(文脈に載せない)
2. base64 をデコードして .xlsx として保存し、zipfile で開く
3. workbook.xml と _rels/workbook.xml.rels からシート名→sheetN.xml を特定する
4. sharedStrings.xml を読み、t="s" のセルを文字列に戻す
5. セルの r 属性から列記号を取り、<列記号>=<意味> の対応で辞書化する
6. **取得行数と、値の分布(上位15件)を必ず出力する**
自然言語の書き出し(read_file_content 相当)は途中で切れるので使わないこと。
取得件数が想定より1桁少ない場合は、成功と報告せず原因を先に報告すること。
6. 効果
- 取りこぼし 13%(570/4,190)→ 全件
- 「読めたつもりで実装 → テストで破綻 → データ取り直し → 実装やり直し」の 1 往復を丸ごと削減
- 誤ヒットのガードにより、誤った値を顧客向け文書に出す事故を未然に防止
よくある質問
+「大きいGoogleスプレッドシートをAIに全件読ませる(自然言語の書き出しは黙って切られる)」とは何ですか?
行数の多いシートはコネクタの自然言語書き出しだと途中で切れ、AIは成功と報告する。xlsxをbase64で取りZIPとして自力で開いて全件取り込む手順と、部分一致の誤ヒットを止めるガードまで。
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約4.2万トークンかかりますが、この巻物を使えば約4,200トークンで済みます。差し引き約3.8万トークン(API料金換算で約57円)・90%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
GAS完全自動化テンプレ — Driveコマンドキュー方式
Google Apps Script の「毎回エディタで▶実行」を根絶。Drive 経由のコマンドキューで、初回1クリック以降は AI がすべての GAS 関数をリモート実行できるようになるテンプレート指示書。
人間の手入力台帳を壊さずに自動更新する — GAS Web App upsert 設計
各PC/各拠点の点検結果を、人間が手運用しているスプレッドシート台帳へ自動反映する。手入力列とコメントを絶対に壊さない突合設計、タブ/列の解決、並行POST対策、配布シークレットの落とし穴まで。
数式まみれの業務スプレッドシートを、Webアプリから壊さずに編集させる型
ArrayFormula と per-row 数式が混在する台帳を、セル単位 allowlist・dry-run 既定・適用前バックアップ・触っていないセルの数式不変検査で安全に書き換える設計手順。列ごとの数式復元と、テストが緑のまま壊れる典型例つき。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア