普段、スプレッドシートを使って顧客リストや売上データ、アンケートの回答結果などを管理していると、「あれ?このデータ、重複していないかな…」と不安になることはありませんか?データ量が多くなればなるほど、
目視で重複を見つけ出すのは困難になりますよね。
かといって、元のデータを不用意に削除してしまうのも怖いものです。作業のミスを防ぐためにも、元のリストには手を加えずに、重複しているデータだけを別のシートへ綺麗に抜き出したいと考えるのは当然のことです。
実は、Googleスプレッドシートには、このような重複データの抽出を自動化するための非常に便利な関数や標準機能が用意されています。
これらを組み合わせることで、手動でのコピペ作業から解放されるだけでなく、元のシートに新しいデータが追加された際にも自動的に別シートの重複リストが更新されるようなスマートな仕組みを作ることができるんですよ。
私自身も、大量のリスト処理で何度もこの方法に救われてきました。
この記事では、スプレッドシートの重複データを別シートに自動で抽出するためのさまざまなアプローチを、初心者の方でも迷わず実践できるようにステップ・バイ・ステップで詳しく解説していきます。
あなたの業務効率をアップさせるために、まずは知っておくべきポイントや全体像を整理してみましょうね。
- 元データを残したまま重複している行や特定の項目だけを別シートに自動抽出できる
- 関数を使用することでデータの更新に連動して抽出結果もリアルタイムに反映される
- 不要な改行や半角スペースなどの「データの汚れ」を事前に掃除することが成功のコツ
- 一回限りのクリーンアップか継続的な自動化かによって最適なアプローチが異なる
スプレッドシートで「重複データを抽出して別シートにコピーする方法」を行う基本概念とメリット

スプレッドシートで重複データを抽出し、さらにそれを「別のシート」に分けるという操作には、単にデータを整理するだけにとどまらない非常に重要な意味があります。
元のデータが存在するシート(マスターシート)で直接重複を削除してしまうと、どのデータが重複していたのか後から検証することが難しくなってしまいますよね。
まずは、この処理を行う基本的な考え方と、別シートに分けることで得られる具体的なメリットについて詳しく見ていきましょう。
1. スプレッドシートの「重複データを抽出して別シートにコピーする方法」処理の重要性
データ分析やリスト作成において、データの整合性を保つことは最も大切なルールの一つです。
例えば、メルマガの配信リストやセミナーの申込者リストで重複が発生していると、同じ相手に複数回メールを送ってしまったり、集計結果が狂ってしまったりする原因になります。
しかし、マスターデータを直接書き換えてしまうと、元のログが失われ、トラブルが起きた際の「原因究明」ができなくなってしまいます。
そこで必要になるのが、マスターデータはそのまま保護しつつ、重複していると疑われるデータだけを別のシートに退避させて抽出するという手法です。
ビジネスの現場では、マスターデータを汚さずに「元の状態」をキープしておくことが大前提とされています。
重複データを別シートに自動抽出する仕組みを構築しておけば、いつでも元の状態に戻せますし、どのレコードが二重登録されていたのかを一目で突き合わせて確認することができるため、安全性が格段に向上しますよ。
また、この処理を「関数」によって自動化しておくことの重要性も無視できません。
手動でフィルターをかけてコピペする方法だと、新しくデータが追加されるたびに同じ作業を繰り返さなければならず、抜け漏れや作業ミスの原因になってしまいます。
関数を使って別シートに自動で引っ張ってくるように設定しておけば、マスターシートに入力があった瞬間に、何の手間もなく別シート側にも自動で重複状況が反映されるようになります。
これにより、日々のルーティンワークを大幅に削減することができるのです。
なお、Googleスプレッドシート公式のサポート情報でも、データのクリーンアップや重複処理に関する基本的な操作手順が紹介されています。
公式の手順を詳しく確認したい方は、こちらのGoogle Docs Editors Help の UNIQUE 関数のヘルプページなども参考にしてみてくださいね。
一次情報に触れることで、スプレッドシートが持つデータ処理のポテンシャルをより深く理解できるはずです。
2. 改行や不要データがシートの動作や見た目に与える影響
重複の抽出や除外を試みる際、多くの人がつまずくポイントがあります。それは、「見た目は全く同じなのに、なぜか重複データとして認識されず、別シートにうまく抽出できない」という現象です。
この原因のほとんどは、セルの中に潜んでいる目に見えない改行や不要なスペース(空白)、全角・半角の表記揺れによるものです。
スプレッドシートの関数や標準機能は、テキストを非常に厳密に判定します。
例えば、「山田太郎」という文字の後ろに改行が入っているデータと、改行が入っていない「山田太郎」は、システム上「全く異なる別のデータ」として処理されてしまいます。
これにより、重複しているはずのデータが抽出から漏れてしまい、不完全なリストが出来上がってしまうのです。
このような不要データ(ゴミデータ)がシート内に大量に残っていると、抽出精度が下がるだけでなく、シートの動作自体が非常に重くなってしまう原因にもなります。
無駄なスペースや改行を含んだセルの計算処理は、システムに余計な負荷をかけます。スプレッドシートが重くなり、スクロールするだけでも動作がカクつくようになってしまっては日々の仕事で大きなストレスになってしまいますよね。
動作の重さに悩んでいる方は、こちらのスプレッドシートを軽くする解決策もあわせてチェックしてみると良いかもしれません。シート全体の軽量化テクニックを学ぶことで、重複抽出の処理スピードも格段に向上しますよ。
したがって、重複抽出の作業を行う前、あるいは抽出関数を組む際には、TRIM関数やCLEAN関数などを使ってセル内の余計なスペースや改行コードを取り除く「前処理」を行うことが極めて重要になります。
見た目を綺麗にするだけでなく、数式の計算ミスを防ぎ、スプレッドシート全体の動作パフォーマンスを最適化するためにも、不要な改行や空白のクリーンアップは避けて通れないプロセスなのです。
3. 関数と標準機能を使い分ける判断基準
Googleスプレッドシートで重複データを処理して別シートに展開する方法には、大きく分けて「関数を使用する方法」と「標準機能(メニューバーの機能)を使用する方法」の2種類があります。
どちらを使うべきかは、そのシートを今後ように運用していくかという「目的」によって明確に異なります。それぞれの特徴と使い分けの基準をまとめてみましたので、参考にしてみてくださいね。
| 手法 | メリット | デメリット | おすすめのユースケース |
|---|---|---|---|
| 関数(FILTER, UNIQUE, QUERY など) | データが追加されるとリアルタイムで自動更新される。元データを書き換えない。 | 数式の知識が必要。データ量が極端に多いと動作が遅くなる原因になることがある。 | 日常的にデータが追加され、常に最新の重複リストを別シートで確認したい場合。 |
| 標準機能(データクリーンアップ、フィルタなど) | 直感的に素早く処理できる。関数の知識がなくてもマウス操作だけで完結する。 | 一回限りの使い捨て処理になりがち。データ追加時に再実行する必要がある。 | 一時的な分析や、月1回などの頻度でまとまったデータを手動で整理・出力したい場合。 |
このように、「リアルタイムで自動連携・更新させたいかどうか」が一番の判断基準になります。
もし、フォームから送信されたデータが随時蓄積されていくような進行中のプロジェクトであれば、数式を一度組んでしまえば完全自動で動作し続ける「関数(FILTER関数など)」の導入がベストな選択肢です。
一方で、すでにクローズしたイベントのアンケート結果など、今後データが増えない既存のリストを一度だけ綺麗にしてレポートを作りたいというケースであれば、
メニューバーの「データ」にある標準のクリーンアップ機能を使ってサクッと処理してしまうのが最も手軽で時間もかかりません。
この2つのアプローチの違いをしっかりと頭に入れておくことで、目の前のタスクに対して最も無駄がなく、効率的な作業方法をスマートに選択できるようになりますよ。それでは、具体的な手順の解説に進んでいきましょう!
スプレッドシートで「重複データを抽出して別シートにコピーする方法」を一括で実行する具体的手順
スプレッドシートで元データを見やすく整理するために、重複データを別のシートに抽出する作業は本当によくありますよね。
元データが入力されているシートをそのままいじってしまうと、誤って大事なレコードを消してしまったり、数式が崩れてしまったりするリスクがあります。
だからこそ、安全にデータを処理するために「別シートへの抽出」を行うのが最もおすすめの方法なんですよ。
今回は、用途に合わせて使い分けられるように、3つのアプローチを具体的な手順とともに詳しく解説します。
リアルタイムに自動同期させたい場合は関数を使い、一時的な作業や動作の軽さを重視する場合は標準のメニュー機能を使うと便利ですので、あなたの目的に合わせて試してみてくださいね。

手順1:UNIQUE関数を使って重複していないユニークなデータのみを瞬時に抽出する
まずは、スプレッドシートで最も王道とも言えるUNIQUE(ユニーク)関数を使った手順から見ていきましょう。
この関数を使うと、指定したセル範囲の中から重複している行を取り除き、すべてユニーク(一意)なデータだけを抜き出したリストを自動で作成してくれます。
元データが更新されると、抽出先の別シートもリアルタイムで自動アップデートされるため、常に最新のユニークリストを維持できるのが最大のメリットですよ。
UNIQUE関数の基本構文:
=UNIQUE(範囲, [行の処理], [一意の行のみ])
※基本的には第1引数の「範囲」だけを指定すれば綺麗に動いてくれます。第2引数と第3引数は省略しても問題ありませんよ。
それでは、具体的な手順をステップバイステップで進めていきましょう。
- ステップ1:新しい空のシートを作成する
まずは、重複データを取り除いたユニークリストを流し込むための新しいシートを作成します。画面左下の「+」ボタンをクリックして新しいシートを追加し、シート名を「ユニークデータ抽出」など分かりやすい名前に変更しておきましょう。 - ステップ2:抽出を開始したいセルを選択する
作成した新シートの、データを展開したい左上のセル(例えばA1またはA2など)をクリックして選択します。 - ステップ3:UNIQUE関数を入力する
選択したセルに、以下のように数式を入力します。元データがあるシートの名前が「売上リスト」で、対象範囲がA列からC列まで(見出しを除く2行目以降)である場合の記述例です。
=UNIQUE(売上リスト!A2:C)
このように終点の行番号を省略して「C」とだけ指定しておくと、元データシートに後から行が追加された場合でも、自動的に新しいデータを取り込んでユニーク抽出を実行してくれます。 - ステップ4:「Enter」キーを押して確定する
数式を入力してEnterキーを押すと、一瞬で重複のない綺麗なリストが別シートに展開されます。隣や下のセルに手動でコピー&ペーストする必要はありません。1つのセルに入力するだけで、結果がザーッと流れるように表示される(スピルと呼ばれる挙動です)ので、とても簡単ですよね。
注意!展開先に文字が入力されているとエラーになります
UNIQUE関数を入力したセルの下や右側に、すでに自分で文字や別の数式を入力しているセルがあると、データの展開がブロックされてしまい、
「#REF!(展開された配列はセル A3 のデータを上書きするため、展開されませんでした)」というエラーが表示されてしまいます。
エラーが出たときは、展開先となる範囲に余計なデータが残っていないか確認して、邪魔な文字を消去してみてくださいね。
このUNIQUE関数は、Googleスプレッドシートで動的なマスタを作成する際の基本テクニックです。より詳しい関数の詳細な仕様については、Google 公式の UNIQUE 関数ヘルプページも参考にしてみてください。
手順2:FILTER関数とCOUNTIF関数を組み合わせて「重複しているデータのみ」を抽出する
次に、少し応用的なテクニックを紹介します。
先ほどのUNIQUE関数は「重複を取り除いたユニークリスト」を作るものでしたが、今度は逆に「重複しているデータそのもの(2回以上出現しているデータ)」だけを別シートに抽出する方法です。
例えば、会員登録の重複チェックや、売上データの多重計上ミスを探し出したいときなどに、この「重複データだけのリスト」が大活躍しますよ。ここでは、FILTER関数とCOUNTIF関数をタッグで組み合わせます。
重複のみを抽出する数式のイメージ:
=FILTER(元データ範囲, COUNTIF(キー列の範囲, キー列の個別セル) > 1)
「キー列(例えばメールアドレスや顧客IDなど)の中に、
その値が2回以上( > 1 )登場する行だけをフィルターして抜き出す」という命令文を作ります。
実際の操作手順を詳しく見ていきましょう。
- ステップ1:重複データ専用の別シートを用意する
先ほどと同様に、新しくシートを追加して「重複データ確認」などの名前に設定します。元のデータを保護するために、必ず別シートで作業を行うのがコツです。 - ステップ2:新シートのA2セルに組み合わせ数式を入力する
例えば、元データのシート名が「顧客リスト」で、A列からC列にデータがあり、A列に「メールアドレス」(重複を判定するキー)が入力されているとします。この場合、新シートのA2セルに以下の数式を記述します。
=FILTER(顧客リスト!A2:C, COUNTIF(顧客リスト!A2:A, 顧客リスト!A2:A) > 1)
この数式を分解して考えると、COUNTIF(顧客リスト!A2:A, 顧客リスト!A2:A)の部分で各行のメールアドレスがリスト全体の中に何個あるかを数えています。それが「> 1(1より大きい、つまり2つ以上存在する)」という条件に一致した行だけを、FILTER関数が別シートに引っ張ってきてくれる仕組みなんです。 - ステップ3:「Enter」キーで確定し、結果を確認する
数式を確定させると、重複している該当行だけがずらりと別シートに抽出されます。元のシートで新しくデータが追加され、それが重複データだった場合も、自動的にこちらの別シートにリアルタイムで追加されますよ。
さらに便利に!重複データをスッキリ整理したいとき
もし「重複している行をすべて抽出するのではなく、重複しているグループの代表者だけを1行ずつリスト化したい」という場合は、
FILTER関数の外側をさらにUNIQUE関数で囲んであげると良いですよ。
数式例:=UNIQUE(FILTER(顧客リスト!A2:C, COUNTIF(顧客リスト!A2:A, 顧客リスト!A2:A) > 1))
これで、重複が発生しているデータの一覧がすっきり整理された状態で手に入ります。
ぜひ試してみてくださいね。
手順3:スプレッドシートの重複機能(データクレンジング)を使って別シートに手動コピーする手順
最後に紹介するのは、関数を一切使わずに、スプレッドシートに標準で備わっているクレンジングツール「重複を削除」機能を使って手動で処理する手順です。
関数を使った抽出はリアルタイムでデータが更新されて非常に便利な反面、データ数が数万件など極端に多くなってくると、スプレッドシートの再計算処理に時間がかかり、全体の動作が重くなってしまうデメリットがあります。
もし、元データが重くてスプレッドシートの挙動にストレスを感じているなら、一度こちらの方法で静的なデータとして別シートにコピーしてから処理する方がスマートかもしれません。
なお、スプレッドシート自体の動作速度を改善する方法についてもっと知りたい方は、こちらのスプレッドシートを軽くする解決策をまとめた記事も合わせて参考にしてみてくださいね。
それでは、手動で別シートに重複を削除したリストを作成する手順を解説します。
- ステップ1:元データをコピーして、別シートにそのまま貼り付ける
まずは、元データがあるシートのデータ範囲全体(例:A1からC100など)をドラッグして選択し、Ctrl + C(MacはCmd + C)でコピーします。その後、あらかじめ用意しておいた別シート(例:「クレンジング済データ」)を開き、Ctrl + V(MacはCmd + V)でそのままペーストします。 - ステップ2:貼り付けたデータ全体を選択状態にする
別シートに貼り付けたデータの範囲(見出し行も含めるのがコツです)をドラッグして選択します。 - ステップ3:「重複を削除」機能を開く
上部のメニューバーにある「データ」をクリックし、表示されたメニューの中から「データクレンジング」 > 「重複を削除」の順に進みます。 - ステップ4:重複を判定する列を指定する
「重複を削除」の設定ダイアログが表示されます。
1. 「データにヘッダー行が含まれる」にチェックが入っていることを確認します(見出し行を重複チェックから除外するためです)。
2. 「重複を分析する列」の一覧から、どの列を基準にして重複を判断するか選択します。全体の行が完全に一致している場合のみ削除したいなら「すべて選択」のままでOKですが、「顧客IDの重複だけを基準に弾きたい」という場合は、顧客IDが入力されている特定の列だけにチェックを入れましょう。
3. 最後に、右下の「重複を削除」ボタンをクリックします。 - ステップ5:結果を確認して完了する
「〇個の重複する行が見つかり、削除されました。〇個の固有の行が残っています。」というポップアップメッセージが表示されたら成功です。「OK」を押してダイアログを閉じましょう。
手動コピーの強み:
この方法で作成された別シートのデータは数式が入っていない「値のみ」のデータになります。
そのため、元データを消去したり変更したりしても影響を受けず、スプレッドシートのメモリを消費しないため動作が非常に軽快です。
分析用のスナップショットとして残しておきたい場合は、この手動コピー手順が最も適していると言えますよ。
このデータクレンジング機能の使い方については、Google 公式の重複を削除するヘルプページでも画面の指示などが詳しく書かれていますので、不明な点があればぜひ確認してみてくださいね。
スプレッドシートの「重複データを抽出して別シートにコピーする方法」作業を効率化するプロのテクニック
スプレッドシートで重複データを別のシートに抽出する作業、普段どのように行っていますか?「簡単な関数を使って抽出できたけれど、
データが追加されるたびに関数をコピーするのが面倒だな…」「データの量が増えてきてシート全体の動作がすごく重くなってしまった…」といった悩みを抱えている方は、実はとても多いのですよ。
大量のデータを日常的に扱うビジネスの現場では、手作業をできるだけ減らして「自動化」することが効率アップの最大の鍵になります。
そこで今回は、単に重複を抜き出すだけでなく、作業効率を大幅に向上させる3つの応用テクニックを分かりやすく解説していきますね。あなたのシートや業務の状況に合わせて、一番使いやすい方法を見つけてみてください。

テクニック1:ARRAYFORMULA関数を使って行追加時に重複抽出をリアルタイム自動化する
まず最初にご紹介するのは、スプレッドシート独自の強力な関数であるARRAYFORMULA(アレイフォーミュラ)関数を組み合わせるテクニックです。
一般的な関数だと、新しく行(データ)が追加されるたびに、手動で数式を下に向かってドラッグしてコピーしなければなりませんよね。
この「数式をコピーする」というちょっとした一手間が、日々の業務の中では意外と面倒ですし、コピーし忘れて計算が合わないといったミスにも繋がってしまいます。
ARRAYFORMULA関数を使えば、数式を一番上の行に1つ入力しておくだけで、新しく追加されたデータに対してもリアルタイムで自動的に数式が適用されるようになりますよ。
これによって、データがどんどん増えていく名簿や売上ログなどの管理が驚くほど楽になります。
具体的に、別シートに重複データを自動抽出するために、FILTER関数やCOUNTIF関数とARRAYFORMULA関数をどのように組み合わせるかを見ていきましょう。
例えば、以下のような注文データが「シート1」にあるとします。
| A列(注文ID) | B列(商品名) | C列(購入者) |
|---|---|---|
| ID-001 | ノートPC | 山田さん |
| ID-002 | マウス | 佐藤さん |
| ID-001 | ノートPC | 鈴木さん |
| ID-003 | キーボード | 高橋さん |
この表では「ID-001」という注文IDが重複していますよね。A列のデータ(注文ID)に重複がある行全体を別シートに自動抽出したい場合、別シートのA2セルに以下のような数式を入力します。
=FILTER('シート1'!A2:C, ARRAYFORMULA(COUNTIF('シート1'!A2:A, 'シート1'!A2:A) & gt; 1))
この数式の仕組みを少し詳しく解説しますね。まず、内側のCOUNTIF('シート1'!A2:A, 'シート1'!A2:A)という部分がポイントです。
通常のCOUNTIF関数は「1つの検索条件」に対してカウントを行いますが、ここでは検索条件の部分にも範囲('シート1'!A2:A)を指定しています。
これをARRAYFORMULA関数で囲むことによって、A列にあるすべての値が「それぞれA列全体に何個存在するか」という件数のリストを配列として一気に計算してくれるのです。
そして、その件数が「1より大きい(> 1)」もの、つまり重複しているデータをFILTER関数が感知し、対応するA列からC列の行データをごっそり別シートに抽出してくれます。
これなら、シート1の最下行に新しくデータが追加されても、自動的に計算が行われて別シートの抽出結果もリアルタイムで更新されますよ。
ARRAYFORMULA関数を導入するメリット
- 新しくデータ(行)が追加されても、数式を下にドラッグしてコピーする必要がありません。
- 一番上のセルだけに数式が入っているため、「誤って途中の行の数式を消してしまった」というトラブルを防げます。
- 常に最新の重複データが別シートに反映されるため、手動での更新作業が一切不要になります。
なお、ARRAYFORMULA関数は非常に便利なのですが、スプレッドシート内の数千行・数万行に対して複雑な計算を繰り返すと、シート全体の読み込みが遅くなってしまうことがあります。
もしスプレッドシートの動きが重くなってしまった場合は、私のブログでも紹介しているスプレッドシートを軽くする解決策の記事を参考に、不要な計算を減らす工夫もしてみてくださいね。
テクニック2:QUERY関数を使って重複データを抽出・ソート・絞り込みする
次にご紹介するのは、データベースのような操作をスプレッドシート上で実現できるQUERY(クエリ)関数を使った応用テクニックです。
QUERY関数は、SQLというデータベース言語に似た記述方法を使って、データの抽出、並べ替え(ソート)、特定の条件による絞り込みを1つの数式で同時にこなせる万能な関数ですよ。
実は、QUERY関数単体では「重複しているデータだけを完全に抜き出す(COUNTIFのように2回以上登場する行だけを抽出する)」という記述を直接行うことはできません。
SQLでいう「HAVING句(グループ化した後の条件絞り込み)」が、スプレッドシートのQUERY関数ではサポートされていないためです。
しかし、少し工夫してQUERY関数を2重に重ねる(ネストする)ことで、重複しているキーとその出現回数をきれいに別シートに抽出できるようになります。
例えば、先ほどの注文データにおいて、重複している「注文ID」とその出現回数を抽出し、さらに出現回数が多い順番に並べ替えて表示したい場合は、別シートのA2セルに以下のような数式を入力します。
=QUERY(QUERY('シート1'!A2:C, "select A, count(A) where A is not null group by A label count(A) ''"), "s
elect Col1, Col2 where Col2 & gt; 1 order by Col2 desc")
少し難しそうに見える数式ですが、順を追って見ていくと理解しやすいですよ。
まず、内側のQUERY関数QUERY('シート1'!A2:C, "select A, count(A) where A is not null group by A label count(A) ''")を実行します。
ここでは、A列の値ごとにグループ化(group by A)し、それぞれのデータの件数(count(A))を数えています。
また、後で計算しやすいように件数の列ヘッダーを空白にする処理(label count(A) '')を行っています。
次に、外側のQUERY関数が、その内側の結果を受け取ります。内側で出力されたデータの一番目の列(Col1)が元の「注文ID」、二番目の列(Col2)が「出現回数」になります。
そこで、外側のクエリで「件数が1より大きいデータ(where Col2 & gt; 1)」を指定して抽出し、さらに件数が多い順番に並べ替える(order by Col2 desc)という処理を行っているのです。
これで、「どのデータが何回重複しているか」が一目で分かる一覧表が完成しますね。
また、もし重複しているキーだけではなく、重複がある元の行データをまるごと全部抽出したい場合は、FILTER関数とMATCH関数を組み合わせて、このQUERY関数の結果と突き合わせることで綺麗に抜き出すことも可能ですよ。
QUERY関数を使うときの豆知識
QUERY関数内で指定する列名(AやBなど)は、大文字で記述する必要がある点に注意しましょう。
また、QUERY関数にデータを渡す際、今回の例のようにQUERY関数をネスト(二重化)して別のQUERY関数の出力を参照する場合は、列の指定が「A, B」ではなく「Col1, Col2」という形式に変化します。
このルールさえ覚えておけば、複雑なデータ抽出も自由自在にコントロールできるようになりますよ。
QUERY関数は、指定する文字列(クエリ)の条件を書き換えるだけで、日付による範囲指定や特定のステータスの除外など、驚くほど細かな絞り込みを追加できます。
より詳しい構文や応用方法については、Googleの公式ヘルプセンター(QUERY関数)のページも併せて確認してみると、スプレッドシートの理解がさらに深まるかなと思います。
テクニック3:GAS(Google Apps Script)を用いて別シートへの重複データ抽出を自動マクロ化する
最後にご紹介するのは、Googleスプレッドシートの裏側で動くプログラミング言語GAS(Google Apps Script)を活用して、ボタン1つで重複データを別シートに抽出するマクロを作成する方法です。
「プログラミングなんて難しそう…」と感じるかもしれませんが、安心してくださいね。コードをそのままコピーして貼り付けるだけで使えるプログラムを用意しました。
関数を使った自動抽出は非常に便利ですが、データ数が何万行もある巨大なシートの場合、関数が常に再計算を繰り返すため動作が激しく重くなってしまう原因になります。
GASを使えば、「ボタンを押したときだけ処理を実行する」という形にできるため、シートの動作をいつでも軽く保つことができるという大きなメリットがあるのですよ。
まずは、以下のコードを使用します。
このプログラムは、「シート1」のA列をチェックして重複している行を探し、自動的に「重複データ」という名前の別シートを作成して、そこへ重複しているすべての行をヘッダー(見出し行)付きでコピーする処理を行います。
function extractDuplicates() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sourceSheet = ss.getSheetByName("シート1");
const targetSheetName = "重複データ";
let targetSheet = ss.getSheetByName(targetSheetName);
// 抽出先のシートがなければ新規作成し、あれば中身をきれいにクリアする
if (!targetSheet) {
targetSheet = ss.insertSheet(targetSheetName);
} else {
targetSheet.clear();
}
const lastRow = sourceSheet.getLastRow();
if (lastRow & lt; 2) {
SpreadsheetApp.getUi().alert("元シートにデータが見つかりませんでした。");
return;
}
// 元データの全範囲(ヘッダーを除く2行目以降)を取得
const lastColumn = sourceSheet.getLastColumn();
const data = sourceSheet.getRange(2, 1, lastRow - 1, lastColumn).getValues();
// A列(インデックス0)の値をキーにして出現回数を集計する
const countMap = {};
data.forEach(row => {
const key = row[0]; // 別の列を基準にする場合はここを変更します
if (key !== "") {
countMap[key] = (countMap[key] || 0) + 1;
}
});
// 2回以上登場する(重複している)行だけをフィルタリング
const duplicateRows = data.filter(row => {
const key = row[0];
return countMap[key] > 1;
});
if (duplicateRows.length & gt; 0) {
// 1行目のヘッダーを取得して抽出先シートの1行目に書き込む
const header = sourceSheet.getRange(1, 1, 1, lastColumn).getValues();
targetSheet.getRange(1, 1, 1, lastColumn).setValues(header);
// 重複データを2行目以降に一括で書き込む
targetSheet.getRange(2, 1, duplicateRows.length, lastColumn).setValues(duplicateRows);
SpreadsheetApp.getUi().alert("重複データの抽出が完了しました!「" + targetSheetName + "」シートを確認してくださいね。");
} else {
SpreadsheetApp.getUi().alert("重複しているデータは見つかりませんでした!");
}
}
このGASを使うための手順はとてもシンプルです。
- スプレッドシートの画面上部メニューから「拡張機能」>「Apps Script」をクリックします。
- もともと入っているコード(
myFunctionなど)をすべて消去し、上記のコードをそのまま貼り付けます。 - エディタ上部の「保存」アイコン(フロッピーディスクのマーク)をクリックして保存します。
- 「実行」ボタンを押すと、プログラムが走り始めます。
なお、初めて自分で作成したGASを実行する際には、Googleからアカウントへのアクセス権限を求められるポップアップ画面が表示されます。このセキュリティ警告をパスする方法も確認しておきましょう。
初回実行時の「承認」について
「承認が必要です」という画面が出たら、「権限を確認」ボタンを押します。
その後、自分のGoogleアカウントを選択すると「このアプリは Google で確認されていません」という警告画面が出ますが、慌てなくて大丈夫ですよ。
画面左下にある小さな文字の「詳細」をクリックし、その下に表示される「(無題のプロジェクト)に移動」をクリックします。最後に「許可」を選択すれば、プログラムが正常に実行できるようになります。
毎回エディタ画面を開いて実行するのは大変なので、シート上に「ボタン」を作って登録するのがおすすめですよ。スプレッドシートのメニューから「挿入」>「図形描画」を開き、簡単な四角いボタンを描いて保存します。
シート上に配置された図形の右上にある「縦の3点リーダー」をクリックし、「スクリプトを割り当て」を選択します。
そこに先ほどの関数名であるextractDuplicatesと入力してOKを押せば、次からはその図形をクリックするだけで一発で重複データが別シートに抽出されるようになります。非常に便利なので、ぜひ試してみてくださいね!
💡パソコン作業の効率をさらに高める便利ガジェット
Excelやスプレッドシートの入力作業スピードは、ソフトの設定だけでなく、使用する「マウスやキーボードなどの物理デバイス」を見直すことでも大幅に向上します。
手首の疲労をゼロにし、
データ入力を何倍も高速化するためのエルゴノミクスガジェット(トラックボールマウスや左手デバイスなど)を以下の記事でまとめて紹介しています。ぜひ参考にしてみてくださいね。
💡 あなたはどっちのタイプ?解決方法の選び方
スプレッドシートの特有の共有設定やマクロの仕様を学び、自動化スキルを高めたい方にはUdemyの動画学習が非常におすすめです。
一方で、
「GAS(Google Apps Script)の記述を代わりに作ってほしい」「複雑な共有管理シートを今すぐ構築してほしい」という場合は、ココナラで得意なプロに数千円で作成代行をお願いするのも賢い選択ですよ。
★ スプレッドシートを基礎から共有設定・自動化までマスター(30日間返金保証付き)
このような各種機能やショートカットキーを使いこなせるようになれば、日々のルーティンワークは劇的にスピードアップしますよ。
操作手順を一度身体で覚えてしまえば、マウスとキーボードの往復にかかる無駄な時間を何分もカットでき、よりスマートに仕事をこなすことができますね。
基本スキルを磨いて自力でどんどん作業を効率化させたい方は、実践的な操作方法を映像で体系的に学べるUdemyの仕事効率化講座をのぞいてみるのが非常におすすめです。
一方で、「複雑なマクロや関数が組み合わさった社内ツールを丸ごと綺麗に構築し直してほしい」「自分では手が出せない高度な自動化システムを作ってほしい」という場面もあるでしょう。
そのように自力で解決するには時間がかかりすぎる専門的なカスタマイズは、ココナラでエクセルやAIプロンプト開発のプロに設定や構築を代行してもらうのが賢い選択ですよ。
自分で学ぶべき基本スキルは動画で効率よく習得しつつ、専門性の高い開発は外部の頼れるプロにアウトソーシングしてしまえば、無駄な残業時間をゼロにして定時に気持ちよく退社できますね。
★ 会員登録無料!数千円からスプレッドシート・GAS開発をプロに依頼可能
スプレッドシートの「重複データを抽出して別シートにコピーする方法」に関するよくある質問(FAQ)
スプレッドシートで重複データを別シートに抽出する作業を進めていると、
「抽出した後のデータを編集したいけれどエラーが出てしまう」「元のデータを消したら抽出先はどうなるのだろう」といった疑問や不安が出てくることがありますよね。
実際、数式を使ったデータの自動抽出はとても便利な反面、スプレッドシートならではの仕様を理解していないと、予期せぬトラブルで作業が止まってしまうこともあります。
そこで、このセクションでは「重複データを抽出して別シートにコピーする方法」に関連して、読者の方から特によくいただく質問とその解決策を詳しくまとめました。作業中に困ったときの参考書として、ぜひ役立ててくださいね。
Q1:UNIQUE関数やFILTER関数で抽出した先でデータ編集(上書き)はできますか?

結論から言うと、UNIQUE関数やFILTER関数などの「数式で抽出したデータ」を、抽出先のセルで直接編集(上書き)することはできません。
これはスプレッドシートの仕様によるものです。これらの関数は、指定されたセル(数式を入力したセル)を起点として、自動的にデータを下方向や右方向のセルへ展開(スピル)する仕組みになっています。
もし、展開された先のセルに手動で文字や数値を直接入力してしまうと、関数が「展開しようとした場所に別のデータが邪魔をしている!」と判断してしまい、数式を入れたセルが「#REF!(参照エラー)」を表示してしまいます。
注意してくださいね!
エラーメッセージには「配列結果を展開できません。~のセルが空ではありません」といった内容が表示されます。この場合は、手動で上書きしたデータを消去すれば、エラーが消えて元通りに抽出データが表示されるようになりますよ。
「どうしても抽出したデータをその場で編集したい!」という場合は、以下の手順で数式を値に変換する(値貼り付けを行う)必要がありますよ。
抽出データを編集可能にする手順:
- UNIQUE関数やFILTER関数で抽出されたデータ範囲をすべて選択し、コピー(Ctrl + C)します。
- コピーした範囲の左上端のセルを右クリックします。
- メニューから「特殊貼り付け」>「値のみ貼り付け」を選択します(ショートカットキーは Ctrl + Shift + V です)。
この操作を行うことで、データが数式による自動抽出から「ただの静的なテキストデータ」に変わるため、自由にセルを書き換えることができるようになります。
ただし、値に変換した後は大元のデータが変更されても、抽出先には自動反映されなくなるので、その点だけは注意してくださいね。用途に合わせて使い分けるのがベストかなと思います。
Q2:大元のシートでデータが削除・変更された場合、抽出先の別シートはどうなりますか?
UNIQUE関数やFILTER関数を使って別シートにデータを抽出している場合、大元のシートでデータが削除されたり変更されたりすると、抽出先のシートのデータもリアルタイムで自動的に変更・削除されます。
スプレッドシートの数式は常に背後で再計算を行っているため、参照先である大元シートの最新状態を常に追いかけている状態です。
そのため、大元シートの間違いを修正したときは、わざわざ抽出先を修正しなくても自動で直るので非常に便利ですよ。
自動更新のメリットと注意点
「常に大元の最新状態を保ちたい」という業務であれば、この自動同期は最高の機能になります。
しかし、「ある特定の時点の重複データリストを履歴として保存しておきたい」という場合には、大元が書き換わると過去のリストが消えてしまうため不都合が生じますよね。
もし、「過去のデータをそのまま残しておきたい」という場合は、先ほどのQ1でも紹介した「値のみ貼り付け」を使って、データを固定化(静的データ化)しておくことをおすすめします。
そうすれば、大元シートがクリアされたり書き換えられたりしても、抽出先の別シートにコピーしたデータはそのまま残りますよ。
用途が「現在のリアルタイムな状況の確認」なのか「過去のログ・履歴としての保存」なのかを考えて、数式のままにするか、値貼り付けで残すかを決めるのがスマートな業務のコツですね。
まとめ:スプレッドシートの「重複データを抽出して別シートにコピーする方法」をマスターして業務を高速化しよう!
お疲れ様でした!今回は、スプレッドシートで重複データを別シートに自動で抽出する様々な方法について解説してきました。
おさらいとして、今回ご紹介した手法を整理してみましょう。
シンプルな一覧の作成ならUNIQUE関数、条件を細かく指定するならFILTER関数、抽出条件に件数を絡めるならCOUNTIF関数を組み合わせるのが非常に効果的です。
また、大量のデータを直感的に分析・整理したいときは、数式不要で使えるピボットテーブルが力を発揮してくれますし、業務の完全自動化を目指すならGoogle Apps Script (GAS)を構築するアプローチもありましたね。
それぞれの機能に得意分野があるので、あなたの目の前にある業務やデータの形式に合わせて、最適な方法を選んでみてくださいね。
データ処理のスピードが大幅にアップすれば、これまで手作業でのコピー&ペーストに費やしていた無駄な時間が丸ごと浮くことになります。ミスもなくなりますし、何より精神的な負担がぐっと軽くなりますよね。
スプレッドシートには、今回紹介した重複抽出のほかにも、業務効率を高めるための便利な小技がたくさんあります。
例えば、抽出したデータを扱う過程でフィルターや枠固定がズレて困ったことはありませんか?そんなときは、こちらの記事 スプレッドシート フィルター 枠固定 ずれるの解決策 もぜひ参考にしてみてくださいね。
作業のストレスがさらに解消されるはずです。
また、綺麗に整理したリストを会議資料や共有用の書類として印刷・PDF化したいときには、こちらの スプレッドシートの印刷範囲設定と1ページに収める方法の連携手順 で解説しているテクニックを組み合わせると、
さらに見栄えの良いアウトプットが作れるようになりますよ。
面倒なパソコン業務はできるだけスムーズに終わらせて、さっさと帰るのが一番だと私は思っています。
浮いた時間で、自分の好きなことをしたり、ゆっくり美味しいご飯を食べたり、大切な人と過ごしたりする時間をたっぷり作ってくださいね。
あなたのデスクワークが少しでも快適になるように、これからも「ツールポ」で実用的なアイデアを発信していきますので、一緒に楽しく学んでいきましょう!
なお、スプレッドシートの最新の仕様や各関数の詳細な動作については、公式の Google ドキュメント エディタ ヘルプ も合わせて確認しておくと安心ですよ。
最新の仕様については公式サイトもご確認ください。
KYOからのメッセージ:
「昔、数万件ある顧客リストの重複を目視で一つずつ探していた時期がありました。途中で集中力が切れて見落としが発生し、同じお客様にダイレクトメールを二重送信してしまって大叱責を受けた痛い過去があります。
あのミスから、重複データは目視に頼らず、関数を使って自動で別シートに弾き出す仕組みを徹底するようになりました。ミスを防ぐためにも、自動抽出の設定は最初に構築しておくのがおすすめですよ」。