「画像を何枚か貼っただけなのに、スプレッドシートがフリーズして動かない……」そんな経験、ありませんか?商品カタログや在庫管理表に写真を入れたら、スクロールするたびにカクカクして、セルの入力すらまともにできなくなった。あの絶望感、本当にストレスですよね。
実はこの悩み、あなただけではありません。Googleの公式コミュニティでも「セル内画像を大量に入れたらシートが激重になった」「フリーズして開けなくなった」という報告が後を絶たず、世界中のユーザーが同じ壁にぶつかっています。Googleスプレッドシートはクラウドベースの表計算ツールとして非常に優秀ですが、画像の扱いに関してはまだまだ弱点を抱えているのが現実です。
この記事では、Googleスプレッドシートで画像挿入後に動作が極端に重くなる原因を根本から解き明かし、今すぐ実践できる具体的な解決策を7つ紹介します。2024年にGoogleが実施した計算速度2倍のアップデートや、2025年2月に発表されたペースト速度50%向上・読み込み速度30%改善といった最新の公式パフォーマンス改善情報も踏まえて、初心者から上級者まで段階的に使えるテクニックをまとめました。
- 画像挿入でスプレッドシートが重くなる5つの根本原因とメカニズムの解説
- IMAGE関数・直接挿入・リンク方式の使い分けによるパフォーマンス最適化の方法
- 2025年最新のGoogle公式アップデートを活かした速度改善テクニック
なぜ画像を入れるとスプレッドシートはここまで重くなるのか?
まず知っておいてほしいのは、Googleスプレッドシートはテキストと数値を処理するために設計されたツールだということです。画像の管理は、いわば「想定外の重労働」をスプレッドシートに押し付けているようなもの。だから重くなるのは、ある意味で当然の結果なのです。
でも、だからといって「画像は使うな」で終わらせてしまっては意味がありません。原因を正しく理解すれば、画像を使いながらもサクサク動くスプレッドシートは作れます。ここでは重くなる原因を5つに分解して、それぞれのメカニズムを掘り下げていきましょう。
画像データがファイルサイズを一気に膨張させる
テキストだけのスプレッドシートであれば、数万行のデータがあってもファイルサイズは数MBに収まることがほとんどです。ところが、高解像度の写真を1枚セルに直接挿入するだけで、数百KBから数MBが一気に追加されます。商品画像を50枚、100枚と貼り付けていけば、ファイルサイズは数十MBに膨れ上がり、ブラウザが処理しきれなくなります。
Googleスプレッドシートはクラウド上で動作するため、ファイルを開くたびにサーバーからデータをダウンロードして、ブラウザ上でレンダリング(描画)する必要があります。画像が増えれば増えるほど、このダウンロードと描画の負荷が大きくなり、読み込みに時間がかかるようになるのです。
ブラウザのメモリを画像レンダリングが圧迫する
意外と見落とされがちなのが、ブラウザのメモリ(RAM)消費の問題です。Googleスプレッドシートはブラウザ上で動くWebアプリケーションなので、パソコンのローカルリソースを使って画面を描画しています。画像が多いシートを開くと、ブラウザはそれぞれの画像をメモリに展開して表示しなければなりません。
特にChromeは「メモリを大量に使うブラウザ」として有名ですが、そこにスプレッドシートの画像処理が加わると、他のタブやアプリケーションまで巻き込んでパソコン全体が重くなることもあります。8GBのRAMを搭載したパソコンでも、画像100枚超のスプレッドシートを開くと、メモリ使用率が80%を超えてしまうケースは珍しくありません。
IMAGE関数は毎回外部サーバーに画像を取りに行く
=IMAGE("URL")
関数を使って画像を表示している場合、スプレッドシートを開くたびに、指定されたURLから画像データを取得しに行きます。つまり、100個のIMAGE関数があれば、ページを開くたびに100回の外部通信が発生するということです。
ネットワーク環境が安定していれば問題は小さいですが、画像のホスティング先のサーバーが遅かったり、Wi-Fiが不安定だったりすると、画像の読み込みがボトルネックになってシート全体がフリーズしたように見えることがあります。また、IMAGE関数は揮発性関数(Volatile Function)ではないものの、シートの再計算時に再評価されるため、他のセルを編集するたびに画像の読み込みが走ることもあります。
条件付き書式や関数との複合的な負荷
画像だけが原因ではなく、条件付き書式やVLOOKUP、ARRAYFORMULAなどの重い関数と組み合わさることで、負荷が指数関数的に増大するパターンもよくあります。たとえば、在庫管理表で画像列に加えて、在庫数に応じたセルの色分け(条件付き書式)と、別シートからのIMPORTRANGEによるデータ取得を同時に行っているようなケースです。
Googleの公式ヘルプでも、条件付き書式はデータ範囲全体に適用されるため、データが増えるほど計算量が膨大になると注意喚起されています。画像の描画負荷にこれらの計算負荷が加わると、シート全体のレスポンスが著しく低下します。
「見えない空白セル」がこっそり足を引っ張っている
もうひとつ盲点になりやすいのが、データ範囲外の空白セルです。実際に使っているのは100行目までなのに、スプレッドシートが内部的に10,000行目まで「アクティブなセル」として認識してしまっているケースがあります。これはデータを削除したときや、セルの書式だけが残っているときに起こります。
空白セルが大量にあると、スプレッドシートはそのぶんメモリを確保してしまい、画像の描画と合わせてダブルで重くなります。
Ctrl + End
キーを押してカーソルが飛ぶ先が、実際のデータ範囲よりも大幅に下や右に離れている場合は、この「ゴーストセル」が存在している証拠です。
今すぐ試せる7つの速攻解決術
原因がわかったところで、ここからは具体的な解決策を紹介していきます。簡単にできるものから順に並べているので、上から順番に試してみてください。一つ実行するだけでも体感速度が劇的に変わることがあります。
解決策1画像を圧縮してからアップロードする
最もシンプルかつ効果が大きいのが、画像のファイルサイズそのものを小さくすることです。スマートフォンで撮影した写真は1枚あたり3~5MBになることも珍しくありませんが、スプレッドシートに貼る用途であれば、そこまでの解像度は必要ありません。
画像圧縮のポイントは3つあります。まず、解像度を下げること。セル内で表示するサムネイル程度であれば、横幅300~500ピクセルもあれば十分です。次に、JPEG形式で保存する場合は画質を70~85%に設定すること。Googleの公式パフォーマンスガイドラインでも、画質85%を超えるとファイルサイズが急増する一方で視覚的な品質向上はほとんどないと指摘されています。最後に、可能であればWebP形式に変換すること。WebPはJPEGと比較して同等の画質で約25~35%小さいファイルサイズを実現できます。
解決策2IMAGE関数でURL参照に切り替える
セルに直接画像を挿入する代わりに、
=IMAGE("画像のURL")
関数を使う方法です。画像データをスプレッドシートのファイル内に保持しないため、ファイルサイズの膨張を防げます。
IMAGE関数には4つのモードがあり、用途に合わせて使い分けられます。
=IMAGE("URL", 1)
はセルに収まるようにアスペクト比を保ったままリサイズ、
=IMAGE("URL", 2)
はセルいっぱいに引き伸ばし、
=IMAGE("URL", 3)
は元のサイズのまま表示、
=IMAGE("URL", 4, 高さ, 幅)
はカスタムサイズで表示します。在庫管理や商品カタログのように同じサイズの画像を揃えたい場合は、モード4でサイズを統一するのがおすすめです。
ただし注意点があります。IMAGE関数で参照する画像は公開URLである必要があるため、Googleドライブの画像をそのまま指定することはできません。画像をGoogleドライブで公開設定にするか、別の画像ホスティングサービスにアップロードして使いましょう。
解決策3不要な行・列・シートを徹底的に削除する
先ほど説明した「ゴーストセル」を退治するステップです。やり方は簡単で、実際にデータが入っている最終行の次の行を選択し、
Ctrl + Shift + ↓
で最下部まで選択して右クリックから「行を削除」を実行します。列方向も同様に、使用している最終列の隣から
Ctrl + Shift + →
で最右部まで選択して削除しましょう。
加えて、使っていないシート(タブ)も削除対象です。「とりあえず作ったけど使っていないシート」が3つ4つと残っていると、ファイルを開くたびにそれらのデータも読み込まれます。タブの右クリックから「削除」を選ぶだけなので、不要なシートは思い切って消しましょう。
解決策4画像専用シートを分離して管理する
データの入力・集計を行うメインシートには画像を一切置かず、画像だけを集めた専用シートを別に作るという方法です。VLOOKUP関数やINDEX/MATCH関数を使えば、メインシートから商品コードを入力するだけで、画像シートから該当する画像を参照することもできます。
さらに効果的なのは、画像が多くなってきたらスプレッドシート自体を分割することです。メインの集計シートと画像管理用シートを別ファイルにして、IMPORTRANGEで必要なデータだけを連携すれば、どちらのファイルも軽量に保てます。
解決策5ブラウザ環境を最適化する
スプレッドシートの中身だけでなく、動作環境を整えることも重要です。ここでは見落としがちなブラウザ設定のポイントを紹介します。
まず、ハードウェアアクセラレーションの設定を確認してください。Chromeの場合、「設定」→「システム」→「グラフィックアクセラレーションが使用可能な場合は使用する」がオンになっているか確認しましょう。この設定がオフになっていると、画像の描画処理がCPUだけで行われるため、表示が極端に遅くなることがあります。逆に、オンの状態で不具合が出る場合はオフにすると改善することもあるため、両方試してみるのが得策です。
次に、不要なブラウザの拡張機能を無効化すること。特に広告ブロッカーやセキュリティ系の拡張機能は、スプレッドシートの通信をブロックして画像の読み込みを妨害することがあります。シークレットモード(
Ctrl + Shift + N
)でスプレッドシートを開いてみて、動作が改善するなら拡張機能が原因と特定できます。
そして、他のブラウザタブを閉じること。タブを20個も30個も開いていると、それだけでメモリが圧迫されます。重いスプレッドシートを扱うときは、なるべく開いているタブを5個以下に抑えるようにしましょう。
解決策6関数と書式を見直して計算負荷を減らす
画像と同時に走っている関数や書式設定が重さの原因になっているケースでは、こちらの見直しが劇的に効きます。
まず、計算が終わった関数は値に変換しましょう。セルを選択してコピーし、右クリック→「特殊貼り付け」→「値のみ貼り付け」(ショートカットは
Shift + Ctrl + V
)を実行すれば、関数の結果だけがテキストとして残ります。毎月の集計が終わったデータや、もう更新する必要のない計算結果は、どんどん値に変換してしまいましょう。
次に、SUM関数やVLOOKUPの範囲指定を限定すること。たとえば
=SUM(A:A)
と列全体を指定するのではなく、
=SUM(A1:A500)
のように実際にデータがある範囲だけを指定します。列全体を指定すると、スプレッドシートは何万行もの空白セルまで検索対象にしてしまうため、無駄な処理時間が発生します。
さらに、条件付き書式の数を最小限にすること。「メニュー」→「表示形式」→「条件付き書式」で設定済みのルールを確認し、不要なものは削除しましょう。特に、シート全体(A:Zなど)に適用されている条件付き書式は計算コストが非常に高いため、必要な範囲だけに限定するだけで体感速度が大幅に向上します。
解決策72024年~2025年の最新アップデートを活用する
ここまでの対策を実施してもまだ重い場合は、Googleが提供している最新のパフォーマンス改善の恩恵を受けているか確認しましょう。
2024年6月、GoogleはChromeチームと共同でWasmGCという新しいWeb技術を活用し、Googleスプレッドシートの計算速度を2倍に高速化したと発表しました。この改善はGoogle ChromeとMicrosoft Edgeで自動適用されるため、特別な設定は不要です。もしFirefoxやSafariを使っている場合は、ChromeかEdgeに切り替えるだけで速度が改善する可能性があります。
さらに2025年2月には、追加のパフォーマンス改善としてデータ貼り付け速度が50%向上、スプレッドシートの読み込みが30%高速化、フィルター設定速度が50%向上したことが公式ブログで発表されています。これらの改善はすべてのGoogleアカウントユーザーに無料で自動適用されています。ブラウザを最新版に更新することで、これらの恩恵を最大限に受けられます。
画像の挿入方法3つを徹底比較する
Googleスプレッドシートに画像を入れる方法は、大きく分けて3つあります。それぞれの特徴とパフォーマンスへの影響を理解しておけば、用途に合わせて最適な方法を選べるようになります。
| 挿入方法 | ファイルサイズへの影響 | 並べ替え・フィルターへの対応 | パフォーマンス | おすすめの用途 |
|---|---|---|---|---|
| セル内に直接挿入(メニューから) | 大きい(画像データがファイルに埋め込まれる) | 行と一緒に移動する | 画像が増えると重くなりやすい | 少数の画像を使う場合 |
| IMAGE関数でURL参照 | 小さい(URLテキストのみ保持) | 行と一緒に移動する | ネットワーク依存だがファイルは軽い | 大量の画像を扱うカタログや一覧表 |
| セルの上に画像を配置(フローティング) | 大きい(画像データがファイルに埋め込まれる) | 行と一緒に移動しない | 画像が増えると重くなりやすい | 装飾やロゴなど固定位置の画像 |
パフォーマンスだけを考えるなら、IMAGE関数によるURL参照が圧倒的に有利です。ファイルサイズが膨張しないため、画像が100枚、200枚と増えてもシートの読み込み速度への影響は最小限に抑えられます。一方で、画像の公開URLが必要になるという制約があるため、社内の機密画像には向きません。
機密性の高い画像を扱う場合は、セル内に直接挿入する方法を使いつつ、前述の圧縮テクニックを組み合わせましょう。サムネイルサイズ(横幅300ピクセル程度)に縮小してからアップロードするだけで、パフォーマンスの問題はかなり軽減できます。
上級者向けのパフォーマンスチューニング術
ここまでの基本対策で多くのケースは解決しますが、数百枚以上の画像を扱う業務用途や、複数人で同時編集する環境では、さらに踏み込んだ対策が必要になることもあります。
Google Apps Scriptで画像の遅延読み込みを実装する
Google Apps Script(GAS)を活用すると、画像の読み込みタイミングをコントロールできます。たとえば、特定のセルにカーソルが移動したときだけ画像を表示するスクリプトを組めば、シート全体の初期読み込みを大幅に軽量化できます。
具体的には、A列に商品コードが入力されたらB列にIMAGE関数を自動セットするOnEditトリガーを設定する方法があります。こうすることで、表示が必要な行だけに画像が読み込まれ、未使用行の画像処理をスキップできます。
Googleドライブとの連携でクラウド側に処理を分散する
画像ファイルをGoogleドライブの共有フォルダに保存し、スプレッドシートにはドライブ上の画像へのリンク(ハイパーリンク)だけを記載する方法も効果的です。画像そのものはスプレッドシート上に表示されませんが、リンクをクリックすればすぐにプレビューで確認できます。
この方法のメリットは、スプレッドシートのファイルサイズがほぼゼロに近いまま維持できることと、画像の差し替えがドライブ上で完結することです。商品画像を頻繁に更新する業務では、特に威力を発揮します。
スプレッドシートの再計算設定を調整する
「ファイル」→「設定」→「計算」タブで、再計算の頻度を確認できます。デフォルトでは「変更時」に設定されていますが、揮発性関数(NOW関数やTODAY関数など)を多用している場合は、「変更時と毎時間」に変更することで不要な再計算を減らせます。画像の読み込みと関数の再計算が同時に走ることで起きるフリーズを防ぐ効果が期待できます。
情シス歴10年超の現場で学んだ「画像入りスプレッドシート」の地雷と回避術
ここからは、私が情報システム部門で10年以上にわたって社内のGoogleWorkspace環境を管理してきた中で、実際に何度も遭遇した「画像入りスプレッドシートのトラブル」と、その現場対応をお話しします。ネット上の一般的なアドバイスとは違う、泥臭い実体験から得た知見です。
最初にやるべきは「犯人捜し」である
「スプレッドシートが重い」と言われたとき、いきなり最適化に走るのは実は悪手です。まず確認すべきは、本当にスプレッドシートが原因なのか、それともブラウザやネットワークが原因なのかという切り分けです。
私が最初に必ずやるのは、Chromeのシークレットモード(
Ctrl + Shift + N
)で対象のスプレッドシートを開くことです。これで速くなるなら、拡張機能かキャッシュが原因。変わらなければスプレッドシート自体の問題。次に、同じスプレッドシートを別のパソコンや別のネットワークから開いてみます。特定のマシンだけ遅いなら、そのパソコンのスペックかブラウザ設定の問題です。
さらに一歩踏み込んで、Chromeのデベロッパーツール(
F12
キーで開く)の「Performance」タブで、シートの読み込み過程を録画してみてください。どのタイミングでどれだけ時間がかかっているかが可視化されるので、「画像の読み込みに5秒かかっている」「関数の再計算に8秒かかっている」といった具体的なボトルネックが特定できます。原因がわからないまま闇雲に対処するのは、時間の無駄になりがちです。
ファイルサイズを数字で把握する方法を知っているか
意外なことに、Googleスプレッドシートのファイルサイズはドライブの一覧画面では表示されません。「重いと感じるけど、実際どのくらいのサイズなのかわからない」という方がほとんどです。確認方法は2つあります。
1つ目は、Googleドライブでファイルを右クリックして「詳細」を選ぶ方法。ファイルサイズが表示されます。ただし、これはスプレッドシート形式(.gsheet)のメタデータサイズであり、実際の内部データ量とは一致しないことがあります。
2つ目は、スプレッドシートを
.xlsx
形式でダウンロードして、そのファイルサイズを確認する方法です。「ファイル」→「ダウンロード」→「Microsoft Excel(.xlsx)」で保存し、プロパティからサイズを確認します。こちらのほうが画像データを含む実質的なデータ量に近い値が出ます。10MBを超えていたら黄色信号、30MBを超えていたら赤信号と覚えてください。
また、セル数の確認にはGASで簡単なスクリプトを書く方法がおすすめです。次のコードをスクリプトエディタに貼り付けて実行するだけで、現在のシートの総セル数がダイアログで表示されます。
function checkSheetSize() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var totalCells = 0;
var report = "";
for (var i = 0; i < sheets.length; i++) {
var sheet = sheets;
var rows = sheet.getMaxRows();
var cols = sheet.getMaxColumns();
var cells = rows * cols;
totalCells += cells;
report += sheet.getName() + ": " + cells.toLocaleString() + "セル(" + rows + "行×" + cols + "列)\n";
}
report += "\n合計: " + totalCells.toLocaleString() + "セル(上限1,000万セル)";
SpreadsheetApp.getUi().alert(report);
}
Googleスプレッドシートの上限は1ブック合計1,000万セルです。画像を多用しているシートは、空白行や空白列が放置されがちなので、このスクリプトで定期的にチェックする習慣をつけると、重くなる前に手を打てます。
現場で本当に使えるGASプログラム集
ここからは、画像入りスプレッドシートの管理で実際に私が使っているGoogle Apps Scriptのコードを紹介します。コピー&ペーストでそのまま使えるように書いていますので、プログラミング経験がない方もぜひ試してみてください。スクリプトエディタは「拡張機能」→「Apps Script」から開けます。
GAS①全シートの不要な空白行・空白列を一括削除するスクリプト
画像の重さ以前に、まずシートを「痩せさせる」ことが先決です。手動で1シートずつ削除するのは面倒なので、全シートをまとめて掃除するスクリプトを使います。
function trimAllSheets() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
var sheet = sheets;
var lastRow = sheet.getLastRow();
var lastCol = sheet.getLastColumn();
var maxRow = sheet.getMaxRows();
var maxCol = sheet.getMaxColumns();
// データがない完全に空のシートはスキップ
if (lastRow === 0 || lastCol === 0) continue;
// 余分な行を削除
if (maxRow > lastRow + 1) {
sheet.deleteRows(lastRow + 1, maxRow - lastRow - 1);
}
// 余分な列を削除
if (maxCol > lastCol + 1) {
sheet.deleteColumns(lastCol + 1, maxCol - lastCol - 1);
}
}
SpreadsheetApp.getUi().alert("全シートの不要な行・列を削除しました。");
}
このスクリプトは、各シートのデータが入っている最終行・最終列を検出し、それより下と右の空白領域をまとめて削除します。実行後にスプレッドシートのサイズが目に見えて小さくなるケースが非常に多く、私の経験ではこれだけで体感速度が2~3倍改善したこともあります。月に1回くらいの頻度で実行するのがおすすめです。
GAS②IMAGE関数を一括生成して画像URLから自動挿入するスクリプト
直接貼り付けた画像をIMAGE関数に置き換えたいけど、100行以上あって手作業でやるのは無理、という場面で使うスクリプトです。C列に画像のURLが入っていて、D列にIMAGE関数を自動セットする例です。
function generateImageFormulas() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = sheet.getLastRow();
// C列にURLが入っている前提(C2から開始)
var urlRange = sheet.getRange(2, 3, lastRow - 1, 1);
var urls = urlRange.getValues();
var formulas = ;
for (var i = 0; i < urls.length; i++) {
if (urls !== "") {
// モード1:セルに収まるようリサイズ
formulas.push + '", 1)']);
} else {
formulas.push);
}
}
// D列にIMAGE関数を一括書き込み
sheet.getRange(2, 4, formulas.length, 1).setValues(formulas);
SpreadsheetApp.getUi().alert(formulas.length + "行のIMAGE関数を生成しました。");
}
ポイントは、
setValues()
で一括書き込みしている点です。1セルずつ
setValue()
を呼び出すと、100行程度でも実行に数十秒かかりますが、配列にまとめて一発で書き込めば1~2秒で完了します。GASでは「ループ内でシートへの読み書きをしない」が鉄則で、これを守るだけで処理速度が10倍以上変わります。
GAS③シートの「健康診断」レポートを自動生成するスクリプト
重くなりそうなシートを早期発見するための「健康診断」スクリプトです。各シートのセル数、関数の数、IMAGE関数の数、条件付き書式の数をまとめてレポートしてくれます。
function sheetHealthCheck() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var report = "=== シート健康診断レポート ===\n\n";
var totalImageCount = 0;
for (var i = 0; i < sheets.length; i++) {
var sheet = sheets;
var name = sheet.getName();
var maxRows = sheet.getMaxRows();
var maxCols = sheet.getMaxColumns();
var totalCells = maxRows * maxCols;
var lastRow = sheet.getLastRow();
var lastCol = sheet.getLastColumn();
// 条件付き書式の数
var cfRules = sheet.getConditionalFormatRules().length;
// IMAGE関数の数を集計
var imageCount = 0;
if (lastRow > 0 && lastCol > 0) {
var formulas = sheet.getRange(1, 1, lastRow, lastCol).getFormulas();
for (var r = 0; r < formulas.length; r++) {
for (var c = 0; c < formulas.length; c++) {
if (formulas.toUpperCase().indexOf("IMAGE") !== -1) {
imageCount++;
}
}
}
}
totalImageCount += imageCount;
report += "【" + name + "】\n";
report += " 総セル数: " + totalCells.toLocaleString() + "\n";
report += " データ範囲: " + lastRow + "行×" + lastCol + "列\n";
report += " 空白セル率: " + (totalCells > 0 ? Math.round((1 - (lastRow * lastCol) / totalCells) * 100) : 0) + "%\n";
report += " IMAGE関数: " + imageCount + "個\n";
report += " 条件付き書式: " + cfRules + "ルール\n\n";
}
report += "IMAGE関数合計: " + totalImageCount + "個\n";
report += (totalImageCount > 50 ? "⚠ IMAGE関数が50個超です。パフォーマンス低下の可能性があります。" : "✓ IMAGE関数の数は適正範囲です。");
SpreadsheetApp.getUi().alert(report);
}
このスクリプトを定期的に実行するだけで、「どのシートが太っているのか」「IMAGE関数が集中しているシートはどれか」がひと目でわかります。情シスの立場からすると、ユーザーから「重い」と言われる前に先手を打てるのが最大のメリットです。私は月初にトリガーで自動実行して、結果をSlackに通知するようにしています。
GAS④Googleドライブの画像をサムネイルとしてセルに自動挿入するスクリプト
「社内の画像はGoogleドライブにあるけど、IMAGE関数では使えない」という問題を解決するスクリプトです。Drive APIのサムネイル機能を利用して、ドライブの画像をセル内に挿入します。
function insertDriveThumbnails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = sheet.getLastRow();
// A列にGoogleドライブのファイルIDが入っている前提(A2から開始)
for (var i = 2; i <= lastRow; i++) {
var fileId = sheet.getRange(i, 1).getValue();
if (fileId === "") continue;
try {
var file = DriveApp.getFileById(fileId);
var base64 = Utilities.base64Encode(file.getBlob().getBytes());
var mimeType = file.getMimeType();
var cellImage = SpreadsheetApp.newCellImage()
.setSourceUrl("data:" + mimeType + ";base64," + base64)
.setAltTextTitle(file.getName())
.build();
sheet.getRange(i, 2).setValue(cellImage);
} catch (e) {
sheet.getRange(i, 2).setValue("エラー: " + e.message);
}
}
}
注意点が2つあります。まず、GASの実行時間制限は6分間です。画像が100枚を超える場合は、処理対象を分割するか、バッチ処理にする必要があります。次に、base64エンコードした画像はファイルサイズが約1.37倍に膨張するため、元画像はあらかじめ小さくしておくのが望ましいです。横幅300ピクセル程度にリサイズしたサムネイルを使うのがベストプラクティスです。
現場あるある!画像トラブルの実践的な解決シナリオ
ここからは、私が実際に現場で何度も出くわした「あるあるトラブル」と、そのときの解決手順を具体的に書きます。同じ状況に陥っている方は、そのまま真似してみてください。
シナリオ1商品画像を200枚貼ったら開くのに30秒以上かかるようになった
これは物販やEC業務のチームで特に多いパターンです。ある日突然ではなく、画像を追加するたびにじわじわ遅くなり、気づいたときには30秒待っても開かないレベルになっています。
私がこのケースで実際にやった手順はこうです。まず、xlsx形式でダウンロードしてファイルサイズを確認したら45MBでした。次に、画像をすべて選択して削除し、スプレッドシートの動作速度を確認。画像を消したら2秒で開いたので、原因は完全に画像でした。
対処として、商品画像をすべてGoogleドライブの共有フォルダに移動し、スプレッドシート側はIMAGE関数で参照する方式に全面切り替えしました。ただし、ドライブの画像を直接IMAGE関数では使えないため、ドライブの画像を「リンクを知っている全員が閲覧可」に設定し、共有リンクのURLをIMAGE関数用に加工して使うという手順を踏みました。具体的には、共有リンクの
https://drive.google.com/file/d/ファイルID/view
を
https://drive.google.com/thumbnail?id=ファイルID&sz=w400
の形式に変換します。
sz=w400
の部分で横幅400ピクセルのサムネイルを指定でき、これでファイルサイズを大幅に抑えられます。
結果、xlsx形式でのファイルサイズは45MBから800KBまで激減し、開くのにかかる時間も2秒以下に戻りました。
シナリオ2共同編集中にフリーズして「ページが応答しません」が頻発する
5人以上で同時に画像入りスプレッドシートを編集しているチームから、「午前中のミーティング中に必ずフリーズする」という報告を受けたケースです。
調査してみると、問題は画像だけではありませんでした。ミーティング中はZoomとスプレッドシートとSlackを同時に開いており、さらにChrome上で20以上のタブが開いている状態。その上、スプレッドシートには画像50枚とARRAYFORMULAが30個、条件付き書式が15ルール設定されていました。つまり、複数の原因が複合的に重なって閾値を超えていたのです。
対処は3段階で行いました。第一に、ミーティング中に参照するデータだけを抜き出した「閲覧専用の軽量シート」を別ファイルで作成し、ミーティング中はそちらを使ってもらいました。第二に、ARRAYFORMULA30個のうち、集計が終わった過去月分の関数を値に変換。第三に、画像はハイパーリンク方式に切り替え、必要なときだけクリックして確認する運用に変更しました。
結果、フリーズの報告はゼロになり、ミーティングの質も上がったとフィードバックをもらいました。
シナリオ3スマートフォンで在庫確認ができないほど重い
倉庫の現場スタッフが「スマホで在庫表を開くと画像が表示されるまでに1分以上かかる」というケースです。パソコンでは問題なく開けるのに、スマホだけ異常に遅い。
原因は明確で、スマートフォンのブラウザにはパソコンほどのメモリもCPUパワーもありません。特にAndroidの低価格帯モデル(RAM 3~4GB)では、画像入りスプレッドシートはほぼ使い物になりません。
このときの解決策として、「モバイル用ビュー」を作るというアプローチを取りました。具体的には、同じスプレッドシート内にモバイル専用のシートを1枚追加し、IMPORTRANGE関数で本体シートから画像以外のデータだけを取得して表示するようにしました。商品を確認したいときは、品番をタップするとGoogleドライブ上の画像がブラウザの新しいタブで開くように、HYPERLINK関数で画像のリンクを埋め込みました。
これでスマホからでも3秒以内に在庫情報にアクセスでき、画像も必要なときだけ個別に確認できるようになりました。
誰も教えてくれない「やってはいけない」落とし穴3選
最後に、ネット記事やヘルプページにはまず書かれていない、でも実務で確実にハマる落とし穴を3つ紹介します。
落とし穴1画像を消しても実はファイルが軽くならないことがある
スプレッドシートから画像を削除しても、Googleドライブ上のファイルサイズがすぐには減らないことがあります。これはGoogleの変更履歴(バージョン履歴)に過去のデータが残っているためです。
本当にファイルを軽くしたい場合は、画像を削除した後に「ファイル」→「コピーを作成」で新しいファイルとして保存してください。コピーしたファイルには過去のバージョン履歴が引き継がれないため、純粋に現在のデータサイズだけのファイルになります。私の経験では、この方法で100MB近かったファイルが5MBまで落ちたことがあります。
落とし穴2IMAGE関数のURLが突然無効になる
外部サーバーにホスティングした画像のURLをIMAGE関数で参照している場合、ホスティング先のサーバー設定が変わったり、URLの構造が変わったりすると、ある日突然すべての画像が表示されなくなります。
対策は2つ。1つ目は、画像のホスティング先を自社で管理できるサービス(Googleドライブ、Firebase Storageなど)にすること。2つ目は、重要な画像については定期的にURLの有効性を確認するGASスクリプトを走らせることです。以下のスクリプトは、IMAGE関数のURLにアクセスして、レスポンスコードが200以外ならエラーとしてマークします。
function checkImageUrls() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = sheet.getLastRow();
var errorCount = 0;
// C列にURLが入っている前提
for (var i = 2; i <= lastRow; i++) {
var url = sheet.getRange(i, 3).getValue();
if (url === "") continue;
try {
var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
if (response.getResponseCode() !== 200) {
sheet.getRange(i, 5).setValue("⚠ リンク切れ(" + response.getResponseCode() + ")");
errorCount++;
} else {
sheet.getRange(i, 5).setValue("✓ 正常");
}
} catch (e) {
sheet.getRange(i, 5).setValue("⚠ 接続エラー");
errorCount++;
}
}
if (errorCount > 0) {
SpreadsheetApp.getUi().alert(errorCount + "件のリンク切れが見つかりました。E列を確認してください。");
} else {
SpreadsheetApp.getUi().alert("すべての画像URLは正常です。");
}
}
このスクリプトを週1回のトリガーで自動実行しておけば、リンク切れが発生してもすぐに気づけます。商品カタログや在庫管理では、画像のリンク切れは信頼性に直結するので、地味ですが非常に重要な運用作業です。
落とし穴3「セルの上に画像を配置」は並べ替えで大事故になる
「挿入」→「画像」→「セルの上に画像を挿入」を使うと、画像はセルの上にフローティング(浮いた状態)で配置されます。この方式は見た目が綺麗なのですが、行の並べ替えやフィルタをかけたときに画像が一緒に移動しないという致命的な問題があります。
実際に起きた事故を紹介します。ある営業チームが商品一覧表に「セルの上に画像を配置」方式で商品写真を300枚貼っていました。ある日、誰かが金額順に並べ替えをかけたところ、データは並べ替わったのに画像は元の位置に残り、商品名と写真が全部ずれた状態になりました。しかも、気づかないまま取引先に共有してしまい、大問題になりました。
教訓は明確です。データと画像を紐づけて管理したい場合は、必ず「セル内に画像を挿入」するか、IMAGE関数を使ってください。セル内挿入とIMAGE関数なら、並べ替えやフィルタをかけても画像がデータと一緒に移動します。「セルの上に画像を配置」は、ロゴや装飾など固定位置の画像にのみ使うべきです。
パフォーマンス改善の効果を数字で確認する方法
対策を実施したら、効果を「なんとなく速くなった気がする」ではなく、数字で確認する習慣をつけましょう。感覚だけに頼ると、本当に改善できたのか、追加の対策が必要なのかが判断できません。
読み込み速度をChromeのデベロッパーツールで計測する
具体的な手順として、Chromeのデベロッパーツール(
F12
)を開き、「Network」タブを選択した状態でスプレッドシートを再読み込み(
Ctrl + Shift + R
)します。画面下部に表示される「Finish」の横の数字が、ページの完全読み込みにかかった時間です。
対策前と対策後でこの数字を記録しておけば、「画像を圧縮したら12秒が4秒に短縮された」「空白行を削除したら8秒が3秒になった」といった形で、施策ごとの効果を定量的に把握できます。
GASで「体重測定スクリプト」を定期実行する
先ほど紹介したセル数チェックのスクリプトに、結果をログシートに記録する機能を追加すれば、スプレッドシートの「体重変動」を時系列で追跡できます。
function logSheetWeight() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var totalCells = 0;
for (var i = 0; i < sheets.length; i++) {
totalCells += sheets.getMaxRows() * sheets.getMaxColumns();
}
// ログシートに記録
var logSheet = ss.getSheetByName("パフォーマンスログ");
if (!logSheet) {
logSheet = ss.insertSheet("パフォーマンスログ");
logSheet.appendRow);
}
logSheet.appendRow);
}
これを週1回のトリガーで自動実行するように設定しておけば、「先月は50万セルだったのに今月は120万セルに膨れている」といった異変に早期に気づけます。スプレッドシートの肥大化は、放置すればするほど後の対処が大変になります。定期的な計測は、将来の「重い!動かない!」を未然に防ぐ保険のようなものです。
ぶっちゃけこうした方がいい!
ここまで長々と技術的な対策を書いてきましたが、情シスとして10年以上この手のトラブルに向き合ってきた人間の本音を言わせてください。
ぶっちゃけ、Googleスプレッドシートに画像を大量に直接貼るのは、設計思想として間違っているんです。これは「スプレッドシートが悪い」のではなく、「表計算ツールに画像管理をやらせること自体が筋違い」ということです。包丁で釘を打つようなもので、やれなくはないけど、道具の使い方として間違っている。
じゃあどうするのがベストかというと、個人的にはこうした方がぶっちゃけ楽だし効率的です。画像はGoogleドライブの専用フォルダに一元管理して、スプレッドシート側にはファイルIDかハイパーリンクだけを持たせる。たったこれだけで、ファイルサイズの問題も、並べ替え事故の問題も、共同編集のフリーズも、スマホでの表示遅延も、ほぼすべてが解決します。
「でも、一覧表で画像がパッと見えないと不便じゃないか」という声は当然あると思います。確かにその通りです。だからこそ、IMAGE関数で
https://drive.google.com/thumbnail?id=ファイルID&sz=w200
のようにサムネイルサイズを指定して軽い画像を表示させるのがベストな妥協点です。横幅200ピクセルもあればパッと見で何の商品かは判別できますし、ファイルサイズへの影響はほぼゼロです。
もう一つ大事なのは、「運用ルール」を最初に決めることです。チームでスプレッドシートを使うなら、「画像は直接貼らない」「IMAGE関数のサムネイルサイズはw300以下」「空白行は月末に削除する」といったルールを3行くらいのメモにして、シートの先頭に書いておくだけでいい。仕組みで防げるものは仕組みで防いで、仕組みで防げないものはルールで防ぐ。情シスの仕事の9割は、実はこのシンプルな原則に集約されます。
重いスプレッドシートに毎日ストレスを感じているなら、今日この記事を読んだことをきっかけに、まずは先ほどの「全シートの空白行一括削除スクリプト」をひとつ実行してみてください。それだけで「あれ、こんなに違うの?」と実感できるはずです。小さな一歩が、快適なスプレッドシート生活への最短ルートです。
このサイトをチップで応援
画像入りスプレッドシートが重くなることに関するよくある質問
画像を何枚くらい入れると重くなりますか?
明確な上限はありませんが、経験則としてセル内に直接挿入した画像が50枚を超えるあたりから動作が目に見えて遅くなるケースが多いです。ただしこれは画像の解像度やファイルサイズ、シート内の関数量によっても大きく変わります。1枚5MBの写真なら10枚でも重くなりますし、1枚50KBのサムネイルなら200枚でも比較的スムーズに動きます。IMAGE関数によるURL参照方式であれば、数百枚でも実用的な速度を維持できることが多いです。
IMAGE関数とセルへの直接挿入ではどちらが軽いですか?
ファイルサイズの観点ではIMAGE関数のほうが圧倒的に軽いです。直接挿入は画像データがファイルに埋め込まれるため、枚数が増えるほどファイルが重くなります。一方、IMAGE関数はURLテキストだけを保持するので、ファイルサイズへの影響はごくわずかです。ただし、IMAGE関数は画像を表示するたびに外部サーバーへ通信が発生するため、ネットワーク環境が悪い場合は表示が遅れることがあります。安定したインターネット環境であれば、IMAGE関数を選ぶのが賢明です。
スマートフォンで画像入りスプレッドシートを見ると特に重いのはなぜですか?
スマートフォンはパソコンと比べて搭載メモリが少なく、ブラウザで使えるリソースも限られているためです。さらに、モバイル回線はWi-Fiと比べて不安定になりやすく、画像の読み込みに時間がかかります。スマートフォンで確認する必要がある場合は、画像を極力圧縮するか、画像なしの閲覧用ビュー(フィルターで画像列を非表示にするなど)を別途作っておくと便利です。Googleスプレッドシートの公式アプリを使うことで、ブラウザよりも安定した表示が期待できます。
Excelに変換すれば軽くなりますか?
一概にそうとは言えません。Excelはローカル環境で動作するためネットワーク遅延の問題はなくなりますが、画像が埋め込まれたファイルの重さ自体は変わりません。むしろ、ExcelとGoogleスプレッドシートで画像の扱い方が異なるため、変換時にレイアウトが崩れたり、IMAGE関数が動作しなくなったりすることがあります。根本的な解決策としては、画像の圧縮や参照方式の変更を先に検討するほうが確実です。
共同編集時に特に重くなるのは画像が原因ですか?
画像だけが原因とは限りませんが、大きな要因の一つです。共同編集では複数のユーザーの変更がリアルタイムで同期されるため、画像の再読み込みや再描画が頻繁に発生します。5人以上で同時編集する大規模なシートでは、画像をハイパーリンク方式に切り替えるか、閲覧専用のユーザーには「フィルタ表示」機能で画像列を非表示にした状態で見てもらうなどの工夫が効果的です。
今すぐパソコンやスマホの悩みを解決したい!どうしたらいい?
いま、あなたを悩ませているITの問題を解決します!
「エラーメッセージ、フリーズ、接続不良…もうイライラしない!」
あなたはこんな経験はありませんか?
✅ ExcelやWordの使い方がわからない💦
✅ 仕事の締め切り直前にパソコンがフリーズ💦
✅ 家族との大切な写真が突然見られなくなった💦
✅ オンライン会議に参加できずに焦った💦
✅ スマホの重くて重要な連絡ができなかった💦
平均的な人は、こうしたパソコンやスマホ関連の問題で年間73時間(約9日分の働く時間!)を無駄にしています。あなたの大切な時間が今この悩んでいる瞬間も失われています。
LINEでメッセージを送れば即時解決!
すでに多くの方が私の公式LINEからお悩みを解決しています。
最新のAIを使った自動応答機能を活用していますので、24時間いつでも即返信いたします。
誰でも無料で使えますので、安心して使えます。
問題は先のばしにするほど深刻化します。
小さなエラーがデータ消失や重大なシステム障害につながることも。解決できずに大切な機会を逃すリスクは、あなたが思う以上に高いのです。
あなたが今困っていて、すぐにでも解決したいのであれば下のボタンをクリックして、LINEからあなたのお困りごとを送って下さい。
ぜひ、あなたの悩みを私に解決させてください。
まとめ
Googleスプレッドシートで画像挿入後に動作が極端に重くなる問題は、原因を正しく理解して適切な対策を取れば、ほとんどのケースで解決できます。
最も手軽で効果的なのは、画像を圧縮してからアップロードすることと、IMAGE関数によるURL参照方式に切り替えることの2つです。この2つだけで体感速度が劇的に改善するケースが非常に多いので、まずはここから試してみてください。
それに加えて、不要な空白セルの削除、関数の値変換、条件付き書式の最適化といった基本的なメンテナンスを定期的に行うことで、画像を含むスプレッドシートでもストレスなく使い続けられます。2024年以降のGoogleの大幅なパフォーマンス改善アップデートも追い風になっていますので、ブラウザを常に最新の状態に保つことも忘れないようにしましょう。
画像があることで視認性が格段に上がり、在庫管理や商品カタログの実用性は大きく高まります。「重いから画像は使わない」ではなく、「軽くする工夫をして画像を活かす」という発想で、ぜひ快適なスプレッドシート運用を実現してください。






コメント