在 Google Sheets 中移除空白字元,意思就是把多餘的空格、Tab、空白行,以及不可見的 Unicode 字元縮減掉,讓每個儲存格只保留它應該有的文字。最乾淨的做法,就是不要只依賴一個「移除空格」的想法,因為這個說法可以指壓縮多餘的空格、刪除空白列,或是刪除所有空白字元,而每個目標各自需要不同的模式。一份貼上來的姓名表格、一段匯出的散文段落、以及一串以逗號連接的代碼,當空白被錯誤地移除時,損壞的方式都不一樣。正確的解法是在一個瀏覽器型工具中挑選三種明確模式之一,先預覽完整的輸出結果,再把清理過的文字貼回試算表。
大多數多餘的空白,來自於從 PDF、電子郵件、網站以及 CSV 匯出內容的複製。Google Sheets 會透過 TRIM 與 SUBSTITUTE 等內建函式處理一部分,但這些公式會漏掉不中斷空格 (U+00A0)、Windows 與 Mac 複製之間的 CR/LF 差異,以及貼上時夾帶的 Tab。若要得到精確的結果,你需要一個會明確揭露「空白字元」定義的工具,而不是把定義藏在一顆按鈕後面。

為什麼貼上的資料總是帶著多餘的空白
貼上的試算表資料很少是乾淨的。當你從網頁、PDF 或 CRM 匯出複製一份表格時,每個儲存格都會夾帶來源所使用的分隔字元,而那個分隔字元常常是 Tab 字元、雙倍空格,或是用來讓文字視覺上保持在一起的不中斷空格。在 Google Sheets 儲存格裡,這些字元看起來都跟普通空格一模一樣,這也是為什麼在破壞下游公式之前,這種損壞的排版很難被察覺。
最常出現的三大元凶:
- 重複的空格,來自純文字匯出中的欄位對齊。
- Tab 字元,來自複製原本以分隔符號區隔的儲存格。
- 不中斷空格 (U+00A0),來自從文書處理器和 HTML 頁面複製出來的格式化文字。
- 空白行,來自貼上時遺失段落標記的段落。
每一種都需要不同的處理方式。要判斷你的資料中藏著哪一種,最快的做法是在清理前後,查看單一儲存格的字元數。如果數字下降了,但實際上沒有任何字元真的消失,那就是有看不見的空白字元。一旦知道元凶是誰,就可以挑選一個只處理它、卻不會動到你真正想保留的空格之模式。
三種空白模式,並排比較
瀏覽器版的 Whitespace Remover 提供了三種刻意不同的模式,而不是一顆模稜兩可的「移除空格」按鈕。每一種各自對應不同的下游格式,仔細閱讀模式名稱,能避免你不小心把字詞合併或把段落壓平。模式標籤和輸出預覽會把實際的轉換明確顯示出來,所以你在畫面上做的選擇,就是實際執行的選擇。
| 模式 | 它改變了什麼 | 它保留什麼不動 | 最適合 |
|---|---|---|---|
| 壓縮水平空白 | 每一行中,連續的空格、Tab 以及其他水平空白會變成單一空格。換行旁邊的空格會被刪除。CRLF 會標準化為 LF。整個結果會被去頭去尾。 | 段落之間的換行,以及刻意保留的空白行。 | 貼進單一儲存格的散文、段落、描述與長篇註記。 |
| 去除每行頭尾空白並移除空白行 | 每一行的頭尾都會被去除;空行會被刪除。剩下的行會以單一 LF 重新串接。 | 每個非空行的內部空白。 | 清單、複製來的表格、記錄檔,以及應該每行一個值的貼上註記。 |
| 移除所有空白字元 | 凡是符合 JavaScript 具備 Unicode 感知能力的空白字元類別的所有字元,都會被刪除,包括普通空格、Tab、換行字元以及不中斷空格。 | 沒有任何與空白相關的內容會留下來。 | 代碼、ID,以及任何空白都會破壞格式的嚴格機器輸入。 |
讀懂這張表,是把段落「清理乾淨」與把段落「撕成碎片」之間的差別。壓縮模式是散文的預設;去除行模式是清單的預設;全部移除模式只用於極少數「只要出現任何空白就是錯誤」的情況。選錯模式,是「清理過」的貼上內容看起來反而比原本更糟的最常見原因。
如何在 Google Sheets 中移除空白字元
Google Sheets 內建兩個原生選項:TRIM 函式,負責移除開頭、結尾以及重複的普通空格;以及一連串的 SUBSTITUTE 呼叫,可以指定要處理的字元。兩者都能運作,但當貼上的內容來自非 Google 來源時,各自都有重要的不足之處。
| Sheets 原生做法 | 它能抓到什麼 | 它會漏掉什麼 | 備註 |
|---|---|---|---|
| =TRIM(A1) | 開頭空格、結尾空格,以及重複的內部空格 (U+0020)。 | 不中斷空格 (U+00A0)、Tab (U+0009)、其他 Unicode 空白字元。 | 輸出結果保留在試算表內。最適合單一儲存格中的普通散文。 |
| =SUBSTITUTE(A1, CHAR(160), "") | 單一指定字元,例如 U+00A0。 | 除非再串接一層 SUBSTITUTE,否則其他所有空白字元都會漏掉。 | 適用於在 TRIM 之後、已知含有不中斷空格時的後續處理。 |
| 資料 → 移除空白字元 | 所選範圍內的開頭與結尾空格。 | 內部重複空格、Tab、不中斷空格、換行字元。 | 內建選單指令。比公式輕量,但涵蓋範圍仍然有限。 |
| 先透過 Whitespace Remover 貼上 | 視所選模式而定,可處理空格、Tab、換行字元、不中斷空格、CRLF、空白行。 | 所選模式本就不應處理的內容之外,不會漏掉任何東西。 | 在另一個分頁中執行,再把清理過的值貼回儲存格。當 TRIM 與 SUBSTITUTE 都還留下痕跡時特別有用。 |
當資料放在 Google Sheets 時,實際的工作流程是:
- 用 Ctrl+C(Mac 上用 Cmd+C)從 Google Sheets 複製混亂的儲存格。
- 在另一個瀏覽器分頁中開啟 Whitespace Remover。
- 把複製的文字貼進輸入區。
- 挑選符合資料呈現樣貌的模式:散文用壓縮、清單(每行一項)用去除行空白、代碼才用全部移除。
- 檢視清理後的輸出與結果下方顯示的長度計數。
- 複製清理過的文字,透過 編輯 → 選擇性貼上 → 僅貼上值 貼回原本的 Google Sheets 儲存格或範圍,以丟掉任何公式痕跡。
如果想進行另一項相關的 Google Sheets 清理工作(包含姓名順序調換),請參考 一鍵在 Google Sheets 中交換姓與名。當來源是 CRM 匯出時,這兩項任務常常一起出現,而同樣的「貼上 → 清理 → 貼回」模式就能同時處理兩者。
使用 Whitespace Remover 清理貼上內容
一旦決定哪種模式適合你的貼上內容,實際的清理步驟很短。整個工具都在你的瀏覽器分頁中執行,所以試算表的內容不會離開你的電腦,也不會有任何資料被送到伺服器。
- 把想要清理的純文字貼上或輸入到輸入框中。
- 選擇模式:散文用 壓縮水平空白,清單用 去除每行頭尾空白並移除空白行,代碼用 移除所有空白字元。
- 按下 清理文字,然後閱讀輸出面板以及旁邊顯示的 code-unit 計數。
- 如果輸出符合預期,按下 複製,把清理過的文字貼回試算表儲存格、範圍或下游檔案。
- 如果瀏覽器封鎖了剪貼簿動作,頁面會顯示該情況,並保留完整唯讀輸出供你手動選取與複製。
兩個小習慣能避免大多數錯誤。第一,在假設舊的結果仍然有效之前,先變更輸入或模式;只要任一項改變,工具就會清掉過時的輸出,所以切換後不會留下舊的預覽。第二,記住顯示的計數是 JavaScript UTF-16 code-unit 計數,而不是位元組或可見字元數;表情符號與某些古老文字系統會佔用一個以上的 code-unit,因此數字是確定性的,但並不等同於字素 (grapheme) 數。
安全地讀取計數與預覽
結果面板會回報兩個數字:本次轉換移除了多少 UTF-16 code-unit,以及最終輸出的長度。移除數是一個很好的合理性檢查。如果你貼了一段含有四個雙倍空格與一個結尾空格的段落,而面板顯示移除了五個 code-unit,你就會確切知道壓縮模式做了什麼、而且只做了這些。
如果數字與預期差很多,請不要把結果貼回 Sheets。重新檢查模式、輸入,以及確認你到底是想合併還是修剪。相同的輸入與模式永遠會產生相同的字串,所以出現意外的數字,就代表設定在你不注意的時候被改過了。
即使是空的清理結果,也會以長度為零的方式顯示,而不是被誤認為失敗。當貼上的內容本來就只有空白時,這一點很重要;零結果代表工具確實執行了該模式描述的動作,而不是當機或卡住。
想了解為什麼計數可能與預期不同,可以參考 MDN 的字元類別跳脫參考文件 中記錄的 JavaScript \s 字元類別,它涵蓋的範圍比多數試算表使用者預期的更廣,包括不中斷空格與換行字元。工具在「全部移除」模式中正是依賴這個類別,所以可見的行為與文件說明一致。
當空白是資料且應保持原樣時
並非每個空白字元都是垃圾。在原始碼、YAML、Python、由縮排驅動的設定檔、固定寬度資料表,以及大多數法律文件中,空白與換行都承載著意義。使用全部清除模式將其移除,會導致腳本編譯錯誤、YAML 解析錯誤,或破壞固定寬度匯出檔案的欄位對齊。即便是合併模式,也可能會壓平程式碼檔案所依賴的縮排。
對於這類輸入,請將預覽視為檢查點,而非通行許可。若輸出仍保有該格式所需的縮排與換行,請將其貼回。若輸出壓平了該格式所依賴的某些內容,請改用支援格式的編輯器,或參考 MDN 上記載的 String.replace 規則,自行撰寫更精準的轉換。
若唯一的問題在於換行本身,而周圍的空白應保持完整,本網站上的專屬換行工具是更狹窄的替代方案。它能標準化或移除換行符,卻不會修剪空白或合併定位字元,這更貼近承載語法格式的實際需求。
若您正在權衡各種選項,為文字加上行號:設定與輸出速查表對此有詳細說明。