メインコンテンツへ移動

Google SheetsにJSONをインポート

ブラウザでJSONをCSVに変換し、Google Sheetsのファイル → インポート → アップロードから読み込んで、区切り文字を出力に合わせて設定します。SheetsにはJSONインポーターがないため、CSVが実用的な経路です。ネストしたキーはcustomer.nameのような列パスで届き、列セットは最初のレコードのキーではなく、全レコードの和集合になります。

端末内で処理
ツールだけ使いたい方はJSONをCSVに変換へネストも含めてスプレッドシートの表に変換ツールを開く

Google SheetsにJSONをインポートとは

Google SheetsにはJSONインポーターがありません。APIレスポンスを受け取ってグリッドに並べるダイアログは存在せず、Apps Scriptの経路(UrlFetchApp、JSON.parse、setValues)は確かに本物の答えですが、ほとんどの人はそこまで書く必要がありません。Sheetsが受け付ける交換形式はCSVであり、だからこそ変換の工程が作業のすべてになります。

変換そのものは簡単な半分で、JSON→CSVコンバーターがアップロードなしで処理します。問題になるのはインポートの半分で、しかもExcelと共有ではなくSheets特有の形で起きます。Sheetsは尋ねずに最初の行から区切り文字を推測し、取り込みの際に独自の型変換を適用し、商品コードの列を喜んで数値に変えて、あなたが止める暇もなく先頭の0を落とします。

このページは、そうした問題を一切回避してJSONエクスポートをSheetsのグリッドに収めるためのレシピです。コンバーターが何を出力するか、どのインポート設定を使うか、型変換をどう止めるか、無料アカウントでぶつかる2つの上限。すべてブラウザ内で動きます。JSONエクスポートは大抵、実在の人物に関する実データであり、サーバーを経由する回り道をしてまで表計算にする必要はありません。

変換が行われるのはJSON→CSVコンバーターです。JSONを貼り付け、区切り文字を選び、結果をコピーまたはダウンロードします。

宛先がSheetsではなくExcelなら、Excel向けの経路を選びます。本物のワークブックは数値セルを数値のまま保ち、CSVインポートのダイアログを完全に回避します。

SheetsにJSONインポートがない理由と、代わりに使うもの

Google Sheetsが直接読み取れるのは3つ:CSV、TSV、貼り付けたグリッドです。IMPORTDATAでリモートのCSVを取得でき、公開済みGoogle SheetsのURL自体がCSVのエンドポイントにもなります。しかし、JSONドキュメントからセル範囲へ至る組み込みの道はありません。公式の答えはApps Scriptですが、一度きりの用途には労力が見合いません。

そこでCSVが経路です。まず変換、次にインポート、全体で1分ほど。重要な帰結は、CSVの制限がすべてSheetsの制限になることです。セルは文字列としての22201と数値としての22201を区別できず、空セルと、レコードに存在しなかったフィールドも区別できません。この2つの区別はJSONの中にはありますが、旅を生き残りません。元データを削除する前に知っておくべき点です。

インポートダイアログの各項目

ファイル → インポート → アップロードを選び、ファイルを選択します。表示されるダイアログで結果が決まり、そのうち2つの設定が効いてきます。

区切り文字のプルダウンは既定で「検出」になっており、最初の行を見て推測します。その推測は信じられる程度には当たり、上書きする価値がある程度には外れます。「カンマ」か「セミコロン」を明示的に選び、コンバーターが出力したものに合わせてください。開いたファイルがすべてA列に収まっていたら推測が外れた証拠です。列を後から分割しようとするのではなく、再インポートしてください。

「テキストを数値、日付、数式に変換」のトグルが、静かに損害を出すものです。有効のままにすると、Sheetsは独自のヒューリスティックを適用します。商品コードは数値になり先頭の0を失い、1.10のようなバージョン文字列は日付になり、長いIDは指数表記になります。オフにすれば、すべての値は書かれた通りにテキストとしてインポートされます。列を後から意図的に変換することはできますが、インポートで剥ぎ取られた先頭の0は取り戻せません。

ネストしたJSONをフラットな列へ

コンバーターはネストしたオブジェクトをドット区切りのパスへ、配列をブラケット付きのパスへ平坦化します。{"customer":{"name":"Ada"}}はcustomer.nameという列になり、tags配列はtags[0]、tags[1]になります。2つの記法は意図的に異なり、列名の由来が曖昧にならず、CSV経由でJSONへ戻す往復でもネストが再構成されます。

列のセットは、全レコードのフィールドを初出順に集めた和集合です。これはローカルの表計算以上にSheetsで効いてきます。インポートは一発勝負だからです。40番目のレコードにしか現れないフィールドでも、きちんと自分の列を得ます。一方、1番目のレコードからヘッダーを読むコンバーターはそれを静かに失い、フィルターが何も返さなくなり、数週間後に初めて気づくことになります。

JSON列備考
{"customer":{"name":"Ada"}}customer.nameオブジェクトのメンバーはドット区切りのパスになる
{"tags":["a","b"]}tags[0], tags[1]配列の要素はそれぞれ1つの列になる
{"vip":true}vipTRUEとしてインポートされる。「true」というテキストではない
{"note":null}note空セル。存在しないフィールドと区別がつかない

実際にぶつかる2つの上限

無料のGoogleアカウントでは、1つのスプレッドシートに10,000,000セルまでです。これは行数ではなく10,000,000値という意味です。50列のエクスポートなら200,000行で尽きる計算になり、上限を超えたインポートは途中で失敗します。しかも出るメッセージは上限ではなくファイルについてのものです。エクスポートがそれより大きいなら、日付範囲かIDの接頭辞で分割し、パーツを別々のシートにインポートしてください。

もう1つの上限はインポートダイアログのファイルサイズで、100 MBです。10万レコード×20列のCSVは約20 MBなので、こちらに当たる可能性は低めです。しかし、長いテキストフィールドを含むJSONエクスポートなら届きます。コンバーターはタブを固まらせる代わりに8 MBを超えるJSONを拒むので、実戦ではまずこの制限に当たり、しかも教えてくれます。

シートをソースの歩調に合わせ続ける

インポートした範囲はスナップショットです。JSONが変化するもの、注文テーブルやCRMやアナリティクスのダンプからのエクスポートなら、シートは着地した瞬間に古くなります。毎朝手動で再インポートするのは、まさに誰にも信頼されない壊れた表計算に化ける雑務です。

正直な選択肢は2つです。ソースがHTTP上でCSVを公開できるなら、IMPORTDATAがスケジュールに従って1つのセルへ取り込み、SPLITと配列数式で展開します。変換工程は一切不要ですが、代償としてデータがURLを知る全員に公開されます。そうでなければ、変換をローカルに保って繰り返します。ツールは貼り付けを受け付けるので、ループはエクスポート、貼り付け、ダウンロード、インポートで、1分もかかりません。やる価値がないのは、非公開のAPIキーをApps Scriptに結び付けて、シートに持たせるべきでない認証情報を保持させることです。

よくある質問

変換するとき、JSONはアップロードされますか?

いいえ。変換はブラウザのタブ内での関数呼び出しであり、ドキュメントを送り付ける先のAPIルートは存在しません。検証もできます。DevToolsを開き、Networkパネルを見ながらドキュメントを貼り付けると、それを運ぶリクエストは1つもありません。ページのContent-Security-Policyはconnect-src 'self'を設定しているため、ブラウザはいずれにせよ外向きのアップロードを拒否します。JSONエクスポートは大抵、実データのレコードです。それこそが変換をローカルに留める理由です。

SheetsでCSVを開くと全部が1列に収まるのはなぜですか?

ファイル内の区切り文字が、インポートダイアログが推測したものと一致していないためです。Sheetsは既定で「検出」を使い、最初の行から推測します。カンマ区切りのファイルを「セミコロン」を選んだままインポートすると、まるごとA列に入ります。ファイル → インポートで再インポートし、区切り文字をコンバーターの出力に合わせて明示的に設定してください。カンマ、セミコロン、タブ、縦棒。後から数式で列を分割することもできますが、再インポートのほうが常にましです。

商品コードの先頭の0が消えたのはなぜですか?

インポートダイアログの「テキストを数値、日付、数式に変換」オプションが、既定で有効だからです。Sheetsは数値の形をしたものを何でも再解釈します。00123は123になり、長いIDは指数表記になります。このオプションをオフにすれば、すべての値は書かれた通りにテキストとしてインポートされます。SheetsのCSVインポートで最も多い苦情がこれで、Excelと違ってダイアログには列ごとの例外設定がありません。全か無かです。

SheetsはJSONを直接インポートできますか?

組み込みのダイアログではできません。IMPORTDATAはHTTP越しにCSVとTSVを読むものでありJSONは読めず、ファイル → インポートにJSONインポートの選択肢もありません。Apps Scriptなら可能です。UrlFetchAppで取得し、JSON.parseで読み、setValuesで書き込む。API駆動の定期処理としてなら構築する価値があります。一度きりの変換なら、CSVに変換してインポートするほうが、はるかに手間が少なくて済みます。

何行までインポートできますか?

無料のGoogleアカウントで1000万セルです。行数ではなくセル数の話なので、50列のエクスポートなら約200,000行が上限になります。超えるとインポートは途中で失敗します。エクスポートがもっと大きいなら、分割して各パーツをそれぞれのシートにインポートするか、グリッドではなくスクリプトの入力として、コンバーターの範囲に縛られない出力を使ってください。

変換はネストしたオブジェクトや配列を扱えますか?

はい。オブジェクトはドット区切りの列パス(customer.name)に、配列はブラケット付きのパス(tags[0]、tags[1])になります。列のセットは全レコードを初出順に集めた和集合なので、任意のフィールドも捨てられず、列を受け取り、他の箇所は空セルになります。ExplodeモードはCSV→JSONコンバーターとの往復が可能です。Joinモードはスカラーの配列を1つのセルに詰め込み、設計上、情報を落とします。