メインコンテンツへ移動 / Skip to main content

Google Sheets Looks Huge Even Though Chrome Says 100%Fixing a Ghost Zoom Entry in Chrome Preferences on macOS

Diagnose and repair a macOS Chrome profile where Google Sheets and Docs render at an apparent 125% scale even though Chrome and the editor both report 100%. Includes devicePixelRatio comparison, read-only Preferences inspection, a backup-first Python repair, and rollback commands.

A spreadsheet UI enlarged by a hidden Chrome profile preference and restored through a targeted repair
Technology
Published on: July 30, 2026
Read time: 11 min
Author: Pochang Lab
Read time: 11 min

1. The short answer: this was not the Sheets zoom—it was a saved per-site zoom in the Chrome profile

On macOS, Google Sheets, Docs, Slides, and related editors can occasionally look abnormally large in one particular Chrome profile. Chrome's menu says 100%. The editor's own zoom says 100%. Other websites look normal, yet reducing Chrome to 80–90% makes Google editors look right. When those clues line up, inspect the profile's Preferences file for a saved zoom entry for docs.google.com.

In the case documented here, this entry remained on disk:

json
{
  "partition": {
    "per_host_zoom_levels": {
      "x": {
        "docs.google.com": {
          "zoom_level": 1.2239010857415449
        }
      }
    }
  }
}

That number does not mean 122.39%. Chromium converts an internal zoom level L to a display factor with 1.2^L. Therefore, 1.2^1.2239010857415449 = 1.25: exactly 125%. Chromium's current source lists 125% among its preset browser zoom factors and implements this conversion directly. [9]

The successful fix was narrow: while Chrome was no longer using the affected profile, back up Preferences and remove only the docs.google.com item below partition.per_host_zoom_levels. There is no need to erase cookies, browsing history, bookmarks, or passwords.

Comparison of the same spreadsheet-style web app at normal scale in one Chrome profile and enlarged scale in another

Figure 1: The same Mac and site can render at different scales because site zoom is stored per Chrome profile. If both the toolbar and grid are enlarged, the editor's internal zoom is not the whole story.

Symptom checklist

CheckState consistent with this issue
ScopeSheets is affected, and Docs or Slides may be affected too
Chrome profileOne profile is broken while another is normal
Chrome displayThe menu appears to report 100%
Editor displayThe Sheets or Docs zoom control also reports 100%
WorkaroundReducing Chrome to roughly 80–90% makes the editor look normal
Failed fixesCommand+0, cookie deletion, font settings, and the site-zoom settings UI

This article is a second-line repair for cases where the normal reset has failed. Run the read-only checks in Section 2 first. Delete the entry only after you confirm that it exists.

2. Diagnose it: separate the three meanings of 100%, then inspect DPR and the saved value

Google editors expose more than one kind of zoom. Treating them as one setting hides the cause.

LayerWhat it changesTypical control
Chrome page zoomThe whole page, including toolbars, menus, and gridCommand+Plus / Command+Minus / Command+0
Docs or Sheets zoomThe document page or sheet content, independently of ChromeThe editor's 100% menu
macOS display scaleThe display's logical resolution and pixel densitySystem Settings → Displays

Google's official documentation describes Chrome's per-site page zoom and the separate 50–200% view control in Docs and Sheets. [1][2]

2.1 Compare devicePixelRatio in DevTools

Open the affected spreadsheet. On macOS, press Option+Command+I (or F12 where configured), select Console, and run:

javascript
console.log('devicePixelRatio:', window.devicePixelRatio)

If Chrome blocks pasting the first time, read the warning and type allow pasting yourself only after you understand the command. Chrome's DevTools team documents this as protection against self-XSS attacks that trick users into executing malicious code. [3] The line above only prints a browser value; it neither changes settings nor sends data.

Now run the same command in a normal Chrome profile while keeping the Mac, physical display, and display settings unchanged.

Display baselineNormal profileAffected profile with 125% page zoom
Standard-density example11.25
Retina example22.5

The useful signal is not an absolute value of 1.25. It is whether affected ÷ normal is approximately 1.25. devicePixelRatio describes the relationship between physical and CSS pixels and increases with page zoom. MDN also notes that ordinary pinch zoom does not change this value. [4] Moving the window to a different display can change the baseline, so compare under identical conditions.

2.2 Find the ghost entry without changing anything

In the affected profile, open chrome://version and copy the Profile Path. Chromium's own documentation recommends this field as the authoritative way to locate the profile directory. Chrome Stable on macOS normally stores profiles below ~/Library/Application Support/Google/Chrome, with folders such as Default, Profile 1, and Profile 2. [5]

Change only this line to match the path shown on your Mac. Use the folder from chrome://version, not the friendly profile name shown in Chrome's avatar menu.

bash
CHROME_PROFILE_DIR="$HOME/Library/Application Support/Google/Chrome/Profile 1"

Then run this read-only inspection:

bash
python3 - "$CHROME_PROFILE_DIR/Preferences" <<'PY'
import json, sys
from pathlib import Path

path = Path(sys.argv[1]).expanduser()
with path.open(encoding="utf-8") as f:
    data = json.load(f)

per_host = data.get("partition", {}).get("per_host_zoom_levels", {})
found = False

for partition_key, hosts in per_host.items():
    if not isinstance(hosts, dict) or "docs.google.com" not in hosts:
        continue
    entry = hosts["docs.google.com"]
    level = entry.get("zoom_level") if isinstance(entry, dict) else entry
    factor = 1.2 ** float(level)
    print(f"FOUND partition={partition_key!r}")
    print(f"zoom_level={level}")
    print(f"zoom_factor={factor:.6f} ({factor * 100:.0f}%)")
    found = True

if not found:
    print("No docs.google.com zoom entry found; do not run the repair yet.")
PY

This output matches the documented case:

text
FOUND partition='x'
zoom_level=1.2239010857415449
zoom_factor=1.250000 (125%)

If the script finds nothing, do not run the deletion step. Investigate extensions, Chrome policy, macOS accessibility zoom, display scaling, or a zoom entry for another host instead.

3. Root cause: a ghost entry restored into Chrome's HostZoomMap

Chromium stores host-specific zoom values in a dictionary named partition.per_host_zoom_levels. The current pref_names.h describes it as a dictionary mapping host names to zoom levels; hosts without an entry use the default zoom. [6]

At startup, ChromeZoomLevelPrefs reads that dictionary and initializes a HostZoomMap for each storage partition. The source also explains why the root profile partition commonly appears under the key x. When zoom changes, non-default values are written back to Preferences, while values equal to the default are supposed to remove the saved host. [7][8]

Flow from a Chrome profile Preferences file through HostZoomMap to the rendered scale of a Google editor page

Figure 2: Google Docs does not directly read the local Preferences file. Chrome restores the saved value into HostZoomMap, and the result appears in the page zoom and rendering environment, including devicePixelRatio.

It helps to separate observed facts from inference:

ConfidenceFinding
ObservedChrome's UI appeared to say 100%, while the affected profile still had a 125%-equivalent docs.google.com value in Preferences
ObservedRemoving that item with Chrome stopped returned the UI to normal
Confirmed in Chromium sourcePer-host values initialize HostZoomMap, and zoom level converts to a factor with 1.2^L
Strong inferenceThe UI reset state and persisted Preferences diverged, leaving a ghost entry that the UI no longer removed
Not establishedThe exact Chrome version and code path that created the divergence; no identical public Chromium bug was conclusively identified

Why Google Sheets and Docs make the problem so obvious

First, the key is docs.google.com. The host-specific zoom does not apply to unrelated sites. Sheets, Docs, and Slides editing surfaces broadly share that host, so one value can affect several services at once.

Second, Chrome page zoom sits outside the editor's own 100% setting. If Chrome applies 125% outside the app, setting Sheets to 100% cannot prevent the toolbar, formula bar, row and column headers, and cells from being enlarged. Google officially announced a migration of Google Docs document rendering from HTML to canvas. Canvas implementations commonly account for devicePixelRatio to stay sharp, and MDN demonstrates that pattern. [10][4] However, public documentation does not establish exactly which private Sheets or Docs scaling code participated in this incident.

The precise explanation is therefore not “Google Docs reads Preferences.” It is: Chrome's residual host zoom altered the page rendering scale, and the discrepancy became especially conspicuous in a complex editor UI.

4. Repair: safely delete only the docs.google.com entry, with a backup

The next command writes to disk. Continue only if the diagnostic found the target. The script adds several safeguards:

  • It creates a timestamped copy of the original Preferences file.
  • It removes no setting other than docs.google.com zoom.
  • It searches all partition buckets instead of assuming the key is always x.
  • It writes a temporary JSON file, validates it, then replaces the original.
  • It makes no change when the target is absent.
A backup-first repair removes only one host zoom item before the spreadsheet returns to normal proportions

Figure 3: The repair does not erase the whole Preferences file. It backs up the file and removes only the docs.google.com entry from the per-site zoom dictionary.

Step 1: set the exact profile path

Copy the affected Profile Path from chrome://version. For example:

bash
CHROME_PROFILE_DIR="$HOME/Library/Application Support/Google/Chrome/Profile 1"

Use Default if that is the folder shown. Chrome Beta, Dev, and Canary use different parent folders, so use the actual value rather than guessing.

Step 2: stop Chrome

At minimum, close every window belonging to the affected profile. To avoid a background app or shared browser process rewriting the old in-memory value, the safest option is to quit Chrome completely with Command+Q. This command should then print only the confirmation message:

bash
pgrep -x "Google Chrome" || echo "Google Chrome is not running"

Editing while Chrome is running can be undone when the browser later saves its in-memory preferences.

Step 3: run the backup-first repair

In the same Terminal session where CHROME_PROFILE_DIR is set, paste this block:

bash
python3 - "$CHROME_PROFILE_DIR/Preferences" <<'PY'
import json, os, shutil, sys, tempfile
from datetime import datetime
from pathlib import Path

path = Path(sys.argv[1]).expanduser()
if not path.is_file():
    raise SystemExit(f"Preferences not found: {path}")

with path.open(encoding="utf-8") as f:
    data = json.load(f)

per_host = data.get("partition", {}).get("per_host_zoom_levels", {})
removed = []

for partition_key, hosts in per_host.items():
    if isinstance(hosts, dict) and "docs.google.com" in hosts:
        removed.append((partition_key, hosts.pop("docs.google.com")))

if not removed:
    print("No docs.google.com zoom entry found. Nothing changed.")
    raise SystemExit(0)

stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
backup = path.with_name(f"Preferences.backup-{stamp}")
shutil.copy2(path, backup)

fd, temp_name = tempfile.mkstemp(prefix="Preferences.", suffix=".tmp", dir=path.parent)
try:
    with os.fdopen(fd, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, separators=(",", ":"))
        f.flush()
        os.fsync(f.fileno())
    shutil.copymode(path, temp_name)
    with open(temp_name, encoding="utf-8") as f:
        json.load(f)
    os.replace(temp_name, path)
except Exception:
    if os.path.exists(temp_name):
        os.unlink(temp_name)
    raise

for partition_key, old_value in removed:
    print(f"Removed docs.google.com from partition {partition_key!r}: {old_value}")
print(f"Backup: {backup}")
print("Done. Start Chrome and verify Google Sheets at 100%.")
PY

Step 4: restart and verify both 100% settings

Open Chrome and load the same spreadsheet in the affected profile. Confirm all four:

  1. Chrome's menu zoom is 100%.
  2. The Sheets toolbar zoom is 100%.
  3. window.devicePixelRatio matches the normal profile.
  4. Toolbars, formula bar, headers, and cells have normal proportions.

Roll back if necessary

If anything unexpected happens, quit Chrome completely and restore the timestamped backup printed by the script:

bash
cp "$CHROME_PROFILE_DIR/Preferences.backup-YYYYMMDD-HHMMSS"    "$CHROME_PROFILE_DIR/Preferences"

Replace the timestamp with the actual filename. List recent backups with:

bash
ls -lt "$CHROME_PROFILE_DIR"/Preferences.backup-* | head

5. Why Command+0, cookie deletion, and the zoom settings page did not work

Under normal conditions, Command+0 or Chrome's Zoom levels settings page should reset a site's page zoom, exactly as Google's Chrome help describes. [1] Their failure here was evidence that this was not the normal state.

AttemptWhy it did not address this case
Restart macOS or ChromeA persisted value is loaded again on the next launch
Command+0The UI appeared reset, but the residual saved entry remained divergent in this case
Remove it from chrome://settings/content/zoomLevelsThe item disappeared from the UI while the on-disk docs.google.com entry was still observed
Delete cookies or site dataHost zoom is stored in profile Preferences, not the site's cookies
Change font or minimum font sizeThis was whole-page UI scaling, not a text-only setting
Set Sheets to 100%The editor control cannot cancel Chrome page zoom outside the app

The “ghost entry” model is consistent with the evidence: the state reported by Chrome's UI diverged from the state persisted in Preferences. Chromium's code normally listens for HostZoomMap changes, writes non-default levels, and removes hosts that match the default. [7] A disruption in change notification, persistence, or profile shutdown could leave an old file entry behind.

This one case is not enough to claim a confirmed bug in a particular Chrome release. If you can reproduce the state where the UI entry is gone but the JSON item remains, capture the Chrome and macOS versions, exact steps, and the relevant pre-repair JSON before reporting it to the Chromium Issue Tracker.

If the entry returns after deletion

  1. Check chrome://policy for managed settings.
  2. Temporarily disable all extensions and test again.
  3. Open the same site in a new Chrome profile.
  4. Compare devicePixelRatio on the same physical display.
  5. Check macOS Accessibility → Zoom and display scaling.
  6. Re-run the read-only script before and after Chrome exits to see when the host is recreated.

If a fresh profile shows oversized content on every website, OS display scale or Chrome's global default zoom is more likely. If only docs.google.com in one profile is affected, the boundary closely matches this incident.

6. Windows, other Google editors, and prevention

Preferences path on Windows

Chromium's official user-data documentation gives %LOCALAPPDATA%\Google\Chrome\User Data as the Chrome Stable root on Windows. [5] Preferences is therefore typically one of:

text
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Preferences
%LOCALAPPDATA%\Google\Chrome\User Data\Profile 1\Preferences

The direct repair described here was tested on macOS. The JSON structure comes from Chromium and is expected to be shared, but the Windows procedure is not independently verified in this article. On Windows, treat chrome://version as authoritative, quit Chrome completely, back up the file, and only then apply equivalent Python logic. Ask your administrator before editing a managed corporate profile.

Why more than Sheets may be affected

The key names a host, not a product: docs.google.com. Editors commonly served from that host include:

  • Google Sheets
  • Google Docs
  • Google Slides
  • Google Drawings
  • Parts of Google Forms

Google Drive and Gmail use different hosts and may remain normal. The boundary “Google editor surfaces, but not every Google product” is therefore a useful diagnostic clue.

Prevention

  • Distinguish Chrome page zoom shortcuts from the zoom control inside Docs or Sheets.
  • If the UI suddenly grows, try Command+0 first. If it fails, compare DPR instead of permanently compensating with 80–90%.
  • For multiple profiles, record the Profile Path from chrome://version.
  • When directly editing Preferences, remove only the target host and always make a backup.
  • Trackpad pinch and browser page zoom are not identical. A persistent 125% value that changes DPR is more consistent with Chrome page zoom such as Command+Plus than with ordinary visual pinch zoom, but the triggering gesture was not established in this case.

Here is the shortest safe decision sequence:

OrderDecision
1Reset both Chrome and Sheets to 100%
2Compare DPR against a normal profile on the same display
3Get the exact Profile Path from chrome://version
4Use the read-only script to confirm docs.google.com and a 125%-equivalent value
5Quit Chrome and remove only that host with the backup-first script
6Re-check 100%, DPR, and actual UI proportions

The deceptive part of this failure was that the visible “100%” was not the end of the diagnosis. Observe the UI state, effective rendering scale, and persisted disk state separately. That lets you remove one ghost entry safely before resorting to reinstalling Chrome or deleting an entire profile.


References

References

  1. [1]Google Chrome Help, Change text, image & video sizes (zoom).
  2. [2]Google Docs Editors Help, Zoom or change your document view.
  3. [3]Chrome for Developers, How Chrome DevTools helps to defend against self-XSS attacks.
  4. [4]MDN Web Docs, Window: devicePixelRatio property.
  5. [5]Chromium Docs, User Data Directory.
  6. [6]Chromium source, chrome/common/pref_names.h.
  7. [7]Chromium source, chrome/browser/ui/zoom/chrome_zoom_level_prefs.cc.
  8. [8]Chromium source, content/public/browser/host_zoom_map.h.
  9. [9]Chromium source, third_party/blink/common/page/page_zoom.cc.
  10. [10]Google Workspace Updates, Google Docs will now use canvas based rendering.

Related Articles

April 4, 2026

Fixing Chronic macOS Dictation Failures Structurally: A Practical Runbook

This guide breaks down recurring macOS Dictation failures by daemon layer (corespeechd, DictationIM, coreaudiod), then provides fast recovery steps, preventive tuning, and long-term migration options.

TechnologyRead more
July 17, 2026

The 14GB ChatGPT.app That Froze My Mac Overnight: Hunting Down the Codex Memory Runaway and Making It Heal Itself

The macOS ChatGPT.app (Codex) ballooned to 14GB overnight and froze a 16GB MacBook Air. The cause was a combination of known app bugs and a single-thread Automations habit. This is a data-driven post-mortem, plus a fully automated three-layer fix: thread rotation, a memory watchdog, and history archiving.

TechnologyRead more
August 10, 2026

Why the Benchmark King Breaks Code in the Field: The Real Reason Google Antigravity Isn't Catching On

Why does Google Antigravity cause regressions in the field? We explore the overwhelming cost performance of its $20 monthly plan and the mystery of why Google is lagging behind in AI coding agents, separating model intelligence from product quality.

TechnologyRead more
August 10, 2026

OpenAI Reaches Pentagon Agreement While Anthropic Faces Exclusion? Verification and Implications (As of March 4, 2026)

A source-first analysis of OpenAI's Pentagon agreements, evidence behind the Anthropic exclusion narrative, unresolved legal questions, and policy implications.

TechnologyRead more
August 10, 2026

What I Learned from Trading FX with LLMs

A detailed log of building an AI-powered automated FX trading system and running it live for a month, revealing what LLMs are bad at and where they actually shine.

TechnologyRead more