Googleスプレッドシートでセルからハイパーリンク(URL)だけを抽出して一括コピーする方法【GAS】

みなさん、こんにちは。

今や、Google スプレッドシートは仕事でもプライベートでも欠かせないツールになっています。みなさんも予定表やタスク管理、データ共有など、さまざまな用途で活用されているのではないでしょうか。

そんな中、シートを編集していて「ついついやってしまいがち」なのが、セルにハイパーリンク(URL)を直接埋め込むことです。

リンク埋め込み
ついついやってしまう「リンクの埋め込み」

リンクをクリックするだけで目的のページに飛べるのでとても便利なのですが……いざ後から「この埋め込まれたURLだけをまとめてコピーしたい!」と思った瞬間、絶望の淵にたたき落とされてしまいます。

なぜなら、Google スプレッドシートの標準関数(=HYPERLINK など)では、セルに埋め込まれた「URLだけ」を抽出することができない仕様になっているからです。

ネットで検索すると「独自関数(カスタム関数)を作る方法」や「特定の列に書き出す方法」がよく紹介されていますが、これらには以下のような致命的な弱点があります。

  • 元のリンクを更新しても、自動で反映されない
  • シートのレイアウト(構造)が変わると使えなくなる

そこで今回は、シートの構造を一切汚さず、元リンクの更新問題も完全にクリアできるスマートな方法をご紹介します!マウスで選択したセルのURLだけを、ボタン1つで一括抽出してクリップボードにコピーできるマクロ(GAS:Google Apps Script)を作ってみました。


従来のやり方が抱える「2つの限界」

よくあるネットの記事では、主に以下の2つの方法が推奨されています。しかし、実際に運用してみるとちょっとした壁にぶつかってしまうんですよね。

1. カスタム関数(=GETLINK(A1) など)を作る

  • 限界
    スプレッドシートの仕様上、元のセルのリンクだけを書き換えても、関数が再計算されないという挙動(古いURLのまま残ってしまう現象)に直面します。

2. 特定の列(例:A列のリンクをB列に抽出する)に自動で書き出す

  • 限界
    コード内で「A列」「B列」と場所を固定してしまうため、シートのレイアウトが変わった瞬間にコードを書き換える必要があり、汎用性がありません。

今回紹介するアプローチ – 何がスマートなの?

今回作成したスクリプトは、これらの制限をすべて突破できるように設計しています!

  • 元リンクの更新を100%反映!
    数式ではないため、実行した「その瞬間」の最新URLを確実に取得します。
  • 圧倒的な汎用性!
    特定の列に縛られません。画面上のどこをマウスで選択していても、その範囲のURLを狙い撃ちで抜き出せます。
  • セル内の「部分リンク」にも対応!
    1つのセルの中に長文が入っていて、その中の「特定の文字だけに貼られたリンク」も漏らさず抽出します。
  • シートを汚さない!
    URLをシートの別セルに書き出すのではなく、専用のポップアップ画面(ダイアログ)に表示して、一発でコピペできるようにしています。

実装手順(コピペ3分で完成!)

他の例と同様、Apps Scriptを使いますが、設定はとっても簡単。以下の手順通りにコードを貼り付けるだけです。

1. Apps Script エディタを開く

スプレッドシートの上部メニューから、[拡張機能] > [Apps Script] をクリックします。

App Scriptをクリック
App Scriptをクリック

2. コードを貼り付ける

最初から入っている function myFunction() {} をすべて消去し、以下のコードをそのまま貼り付けて保存(Ctrl + S、またはフロッピーのアイコンをクリック)してください。

// スプレッドシートを開いた時に、専用のカスタムメニューを追加する
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('🌟カスタム便利機能')
    .addItem('選択セルのリンクURLをコピー', 'copySelectedCellUrls')
    .addToUi();
}

// マウスで今選択しているセルのハイパーリンクURLだけを抽出し、ダイアログに表示する
function copySelectedCellUrls() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var richTextValues = range.getRichTextValues();
  
  var urls = [];
  
  // 選択された範囲のセルをループ処理
  for (var i = 0; i < richTextValues.length; i++) {
    for (var j = 0; j < richTextValues[i].length; j++) {
      var cellValue = richTextValues[i][j];
      if (cellValue) {
        // 単一リンク、またはテキスト内に埋め込まれた部分リンクをすべて抽出
        var url = cellValue.getLinkUrl();
        if (!url) {
          var runs = cellValue.getRuns();
          for (var k = 0; k < runs.length; k++) {
            var runUrl = runs[k].getLinkUrl();
            if (runUrl) { url = runUrl; break; }
          }
        }
        if (url) { urls.push(url); }
      }
    }
  }
  
  if (urls.length === 0) {
    SpreadsheetApp.getUi().alert('選択したセルにリンクが見つかりませんでした。');
    return;
  }
  
  // 抽出したURLを改行で結合してHTMLダイアログに表示(自動全選択)
  var urlString = urls.join('\n');
  var htmlOutput = HtmlService.createHtmlOutput(
    '<p style="font-family:sans-serif; font-size:14px; color:#333;">以下のURLをコピーしてください:</p>' +
    '<textarea id="urlArea" style="width:100%; height:150px; font-family:monospace; font-size:12px; padding:8px; border:1px solid #ccc; border-radius:4px; resize:none;" readonly>' + urlString + '</textarea>' +
    '<script>document.getElementById("urlArea").select();</script>'
  )
  .setWidth(450)
  .setHeight(250);
  
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, '🔗 リンクURLの抽出結果');
}
コードを貼り付け
コードを貼り付けて保存。デプロイはしなくて大丈夫

使い方

1. シートを再読み込みする

コードを保存したら、App Scriptの画面を閉じて、スプレッドシートに戻ってください。そして、開いているブラウザのタブを一度リフレッシュ(再読み込み)します。

2. メニューの出現を確認する

メニューバーの「ヘルプ」の右隣に、「🌟カスタム便利機能」 というメニューが新しく出現します。

カスタム便利機能のメニューが出現
カスタム便利機能のメニューが出現

3. セルを選択して実行する

リンクをコピーしたいセルをマウスで選択します(複数選択や、列ごとの選択もOKです!)。 選択した状態で、[🌟カスタム便利機能] > [選択セルのリンクURLをコピー] をクリックします。

選択セルのリンクURLをコピー
セルを選択した状態で、「選択セルのリンクURLをコピー」をクリック

💡 初回実行時の注意点
初めて実行する時だけ、「承認が必要です」というGoogleのセキュリティ警告ポップアップが出ます。

OKをクリックしても「このアプリはGoogleで確認されていません」という警告メッセージが表示されるはずです。驚かずに 「詳細を表示」>「〇〇(安全ではないページ)に移動」 をクリックします。

その後表示される画面の権限すべてにチェックを入れて続行してください。

4. コピペして完了!

画面中央にポップアップが表示され、抽出されたURLが最初から全選択された状態で現れます。あとは Ctrl + C(Macは Cmd + C)を押すだけで、クリップボードにURLだけが綺麗にコピーされます!

リンクがコピーされた
リンクがコピーされた状態で表示される

技術的な解説(ここがこだわりポイント!)

今回のコードには、実用性を極限まで高めるためのちょっとした「こだわり」が2つあります。

1 .getRuns() による部分リンクの完全回収

通常のGAS解説記事だと、getLinkUrl() を1回実行して終わるケースがほとんどです。しかし、これだと「1つのセルに長い文章が入っていて、その一部分のテキストだけにリンクが貼られているケース」に対応できません。

今回のコードでは .getRuns() を使い、セル内のテキストを細かく分解してスキャンしているため、そういった部分的なハイパーリンクも漏らさず100%抽出できます。

2 クリップボードの仕様制限をHTMLで突破

GASはサーバー側で動く仕組みのため、セキュリティの関係上、ユーザーの手元にあるパソコンのクリップボードへ直接データを書き込むことができません。

そこで今回は、一瞬だけ画面にHTMLの textarea(テキストエリア)をポップアップさせ、JavaScriptの .select() を使って自動で全選択状態に仕込みました。これにより、「実行したら Ctrl+C を押すだけ」という、極限まで手間の少ないサクサクな操作感を実現しています。


URLは関数で計算して表示ではなくコピーする

スプレッドシートの関数が再計算されない現象や、特定のレイアウトでしか動かないスクリプトにモヤモヤしていた方は、ぜひこの汎用的なアプローチを試してみてくださいね。一度設定しておけば、どんなシートでも使い回せて本当に快適になりますよ!

本日も最後までお読みいただきありがとうございました。

それでは、よいGoogleスプレッドシートライフを!

カテゴリ: Tips

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール