Googleスプレッドシート 「特定セルへの」ハイパーリンクの作り方
Googleスプレッドシートの ハイパーリンク機能、HYPERLINK関数について掘り下げる note 第2段です。
前回は いわゆる Webサイトへのハイパーリンクを対象として書きました。
図形やセル上画像にハイパーリンクが付与できないといった、Excelに比べ不満な部分もありましたが、「もっとも簡単な」ハイパーリンク生成方法 や 「検索と置換」でURLの一括ハイパーリンク化、リンク先のプレビュー機能など、Googleスプレッドシート独自の便利な機能も多く、「これ使える!」って発見があった回だったんじゃないでしょうか?
ハイパーリンク関連で「やりたいこと」があって、その方法を知りたい場合は、前回の最後のまとめから 探すと良いかもしれません。
スプレッドシート内リンクを理解する
今回はスプレッドシートファイル内、いわゆる ブック内の別のシートや特定のセルにジャンプできるハイパーリンクについて書いていきます。
まずは基本の「リンクを挿入」機能で特定セルへのリンクを作成する方法と、シート内のハイパーリンクの挙動を理解していきましょう。
リンクを挿入で シートや 特定セルをリンクに指定する
前回紹介した Webサイトを開くハイパーリンク生成方法「リンクを挿入」機能は、 スプレッドシート内ハイパーリンクを作成する時にも使えます。
こちらは ハイパーリンクを作成したいセル、つまりジャンプ先ではなくジャンプ元のセルを選択し、
メニューバーの「クリップのような」リンクアイコンを選択
メニュー から 挿入 > リンク を選択
セルを 右クリック > リンクを挿入
ショートカット Ctrl + K
これら、どの方法でも同じように使えます。(どれも一緒です)
上の画像のような表示が出るので、「テキスト」には セルに表示させる文字(リンクラベル)を入れて、今回はその下の検索ボックスは使わず、一番下の「シートと名前付き範囲」をクリックします。
先にセルにテキストが入力されている場合は、この「テキスト」欄には自動でセル内の文字列が入ります。
↑ こんな感じの画面になるので、ここから ジャンプ先のシートや 名前付き範囲を選択します。
特定のセルをジャンプ先に指定したい場合は、一番下の「リンクを追加するセルの範囲を選択」をクリックして
このようにセルクリックで指定、または直接入力することで、特定のセルへジャンプするハイパーリンクが作成できます。
作成したハイパーリンクをテストしてみましょう。
もちろん別シートの特定セルを指定して、シートをまたいでジャンプすることも可能。
ちなみにジャンプした先のセルが選択状態(アクティブ)になった瞬間(といってもタイムラグがありますが)、わかりやすいようにセルをハイライト表示させています。
こちらについて興味がある方は、セルのハイライト表示をGASで行う方法を書いた 過去noteを参照ください。
ハイパーリンクでジャンプした場合も シンプルトリガー onSelectionChange(e) が作動するんですね。
リンク先のセルのテキストがプレビューできる
前回書きましたが、Googleスプレッドシートのハイパーリンクは Webサイトの場合は トップ画像やサイトのタイトルがプレビューできて便利です。
これは特定セルへのハイパーリンクの場合も有効で、ジャンプ先のセル内のテキストがプレビューできるので便利だったりします。
もちろんリンク先のセルのテキストが変更されたら、即時反映されます。
残念ながら、リンク先のセルにセル内画像があっても画像プレビューは出来ません。セルへのハイパーリンクでプレビューできるのはテキストのみです。
リンク先はセル範囲も指定可能
ここまでリンク先に単体セルを指定してきましたが、リンク先をセル範囲とすることも可能です。
先ほどの リンクを挿入で「リンクを追加するセルの範囲を選択」から、セル範囲(たとえば シート1の E11:I20)を指定すると
このようにハイパーリンクでジャンプすると、指定したセル範囲が選択状態(アクティブ状態)となり、まとめてコピー(Ctrl + C)したり、事前にコピーしていたセルを貼り付け(Ctrl + V)したり出来ます。
ジャンプしたセルでそのまま入力したい場合は 一度 Escが必要
ハイパーリンクで特定セルに飛んだ後、そのまま編集(入力)したいって場合も多いと思います。しかし、なぜかそのまま入力ができません。
矢印キーによる上下左右のセルへの移動も出来ません。
もちろん、マウスで再度セルをクリックすれば編集や操作できますが、出来ればキーボードだけで対処したいところ。
一応これは対処法があります。
一度 Escキーを押すことで、ジャンプ先のセルに入力が出来るようになります。
たぶんフォーカスしているレイヤーが違うとかなんでしょうが、とりあえず理由は置いといて、そういう仕様になってると思いましょう。
キーボードショートカットでは特定セルへのジャンプが「基本的には」できない
リンク先(ジャンプ先)のセル操作はキーボードのみで対処できました。
それでは逆にリンク元のセルで、マウスでクリックしなくてもハイパーリンク先のセルにジャンプすることは出来るのでしょうか?
Googleスプレッドシートはキーボードで 特定セルへのハイパーリンクでジャンプする「いい方法」がありません。(たぶん)
前回、複数のハイパーリンクを一気に開く方法として紹介した右クリックから セルでの他の操作項目を表示 > リンクを開く 、このショートカットキー Alt + Enter が使えそうに思えますが、
このように、同じシート内であろうと Alt + Enterでリンクを開くと、ジャンプではなく別タブでもう一つ同じスプレッドシートを開いてしまいます。
逆にマウスからのクリックだと、特定セルへのハイパーリンクはジャンプになってしまうので、別でもう一つ開きたい場合には このAlt + Enter が活用できます。
で、「いい方法」が無いと書いたのは 「出来ない」というわけでは無いからです。
方法はあります!!(おススメではないですが)
わかりましたでしょうか?
ハイパーリンクのセルを選択した状態で、一旦
Ctrl+Alt+Shift+M スプレッドシートからフォーカスを外す
というショートカットを使います。
そうすると一つ上のレイヤーで Tab移動ができるので、上のメニューを経由して ハイパーリンクの選択までたどり着いて Enterという方法です。
ちなみに上はわかりやすくゆっくり操作していますが、Tabを何度も押す必要はなくて、Tab移動の最後は 選択セルのハイパーリンクメニューをループするだけなんで、Tab押しっぱなしが使えますw
この方法だと Escなしで リンク先のセルをすぐに編集できます。
一応マウスを使わないキーボードのみで操作できるハックネタと言えますが、なんか無理やり感があってキーボードショートカットとしては微妙なんですよね。
mir的にはおススメはしません。。(自分も知ってるけど使ってないです)
ここまでが「リンクを挿入」を使ったスプレッドシート内で特定のセル、シートへジャンプするハイパーリンクの基本となります。
シート内リンクのURLを理解する
それでは、同じスプレッドシート内で特定セルにジャンプするリンクではなく、他のスプレッドシート(別のブック)やGoogleドキュメントに貼り付けたリンく、もしくは チャットやメールで 送ったリンクから、スプレッドシートの 特定のセルを直接開いてもらいたい時は、どうすればよいでしょうか?
これには Googleスプレッドシートの URLの構成を理解する必要があります。
「このセルへのリンクを取得する」を使う方法
スプレッドシートの ここを見て欲しい、開いた時にここに飛んで欲しいといった場合、「このセルへのリンクを取得」という機能が使えます。
右クリックから セルでの他の操作項目を表示 > このセルへのリンクを取得
これを選択すると、リンクがクリップボードにコピーされます。
ここで取得できる リンクURLは
こんな感じになっています。
このシートIDで、シートの指定、セル位置のA1表記で セル指定ができます。
このままシートの適当なセルに貼れば
このようにスプレッドシート内で指定セルにジャンプするリンクとなります。
もちろんこのURLを Googleドキュメントや メールに貼ったり、ブックマートして登録すれば、リンクを開いた瞬間に
このように スプレッドシートが開いた時に、指定セルをフォーカスした状態となります。
「〇〇ってシートの 23行目の E列のセルに書いてある~」とセル位置を説明しなくても 見て欲しい場所、作業して欲しい箇所を直で開けるので、結構便利な機能です。
この スプレッドシートID、シートID、セル位置という 直接指定シートの指定セルを開けるリンクのURL構成が理解できていれば、
たとえば開いたシートのURLをコピーして、最後に
&range=セル位置(A1表記)
を付与することで 手作業でも簡単に 指定セルへの直リンクが作成できますね。
セル指定URLは、セル内に貼り付けたその時だけ チップ変換が可能
GoogleWorkspace は半角の @を使って スマートチップとして、Googleドライブ内のファイルを検索し埋め込める機能がウリです。
実は「このセルへのリンクを取得する」で取得した セル指定のURLも スマートチップ化が出来ます。
ただし、このセル指定URLがスマートチップ化出来るのは、URLをセル内に貼り付けてEnterを押して確定する前の 一時だけです。
通常、他のスプレッドシートのURLであれば、前回のnoteで書いた通り 外部Webサイトと同じ扱いで、画像右のようにサイトの(スプレッドシートの)タイトル、プレビューが表示され、下部に チップに変換するか?という選択肢が表示されます。
しかし、同じスプレッドシート内の特定のセルへのURLの場合は、画像左のように、先ほどの「リンクを挿入」で作成したような リンク先のセルのテキストがプレビューされるシート内リンクの表示となり、後からはチップ化が出来ません。
これは 同じスプレッドシート内の特定セルへのリンクURLは、セル内で確定してしまうと、上のように リンクURLが簡略形 ( #gid=~ のみ)に変換されてしまう為と思われます。
つまり、同じスプレッドシート内のリンクの場合は、
このようにシートID情報とセル情報の簡略形で指定できるってことです。
シート内の特定セルへのリンクを HYPERLINK関数で生成する
この特定セルへのリンクの簡易版表記を活用して、機能ではなく 今度は HYPERLINK関数で 特定セルへジャンプするリンクを生成してみましょう。
先に紹介した「リンクを挿入」で指定セルへのリンクを作成する方が簡単ではありますが、HYPERLINK関数を使うことでより自由度高く 特定セルへのリンクを作成することが出来ます。
HYPERLINK関数で特定セルへのリンクを生成する
HYPERLINK関数を使う場合は
このように作成します。シートIDはスプレッドシートの該当のシートを開いた状態でURLから取得できます。(#gid= の後ろの連続する数字、または 0)
セル位置はE8セルへジャンプしたいなら range =E8 とします。
HYPERLINK関数で作成した特定セルへのハイパーリンクは、機能で作成したものと同じ挙動となります。
ポイントとなるのはシートID です。
Googleスプレッドシートの場合は、同じシート内の特定セルにジャンプさせる場合もシートIDが必要となります。
さらに残念ながら、シートIDは基本的には URLを確認してコピペする以外に取得する方法がありません。
一応シートIDには
このような規則性がありますが、シートIDは機能や標準のシート関数では取得する方法が用意されていないのです。
ちなみに 「それ以降に追加されたシート」は、新規作成だけではなくシートコピーで作成した場合も同様です。
つまり、シート内の特定セル(たとえば E8)へのリンクが設定されたシートをコピーした場合、コピーで生成されたシート(シート1のコピー)の特定セルへのハイパーリンクは、シート1のコピーの E8 ではなく、元シート(シート1)のE8にジャンプしてしまうってことです。
残念ながら 特定セルへのリンクはHYPERLINK関数、リンクを挿入機能、どちらもシート情報が紐づいており 相対参照的に リンク先は変化してくれません。
唯一、スプレッドシート(ファイル)をコピーした場合は シートIDが引き継がれるので、スプレッドシート内のハイパーリンクが、コピーしたスプレッドシートでもそのまま使えます。
Excelの場合は #で特定セルへのリンクを簡単に指定できる
この同じファイル(ブック)内の特定セルへのハイパーリンクは、Excel側は圧倒的に簡単です。
Web版も含め 同一シート内の特定セル(例えば E8)へのハイパーリンクなら
別シート(例えばSheet2)の特定セル(E8)へのハイパーリンクなら
と、このように #を シートや位置を示す文字列の頭に付けることで、リンク先として指定できます。
同じシート内のセルへのリンクだった場合は、HYPERLINK関数が入ったセルを他のシートにコピーしても、そのままコピー先のシート内で機能します。
シート内、ブック内の特定セルへのリンクは、Excelの方が作成しやすいなと感じます。
インストール版 Excelなら ハイパーリンクで特定セルにジャンプ後、戻ることができる
ちなみに Web版では無理ですが、インストール版のExcelなら ハイパーリンクで特定セルに移動した後で、「ジャンプ」で ハイパーリンク元のセルに戻ってくることが出来ます。
「ジャンプ機能」はGoogleスプレッドシートには無い 非常に優秀な Excelの機能の一つなんですが、これがハイパーリンクの移動先から戻ってくる際にも使えます。
よく使う機能なので、キーボードショートカット Ctrl + G で覚えておくと良いかも。
Web版Excelにもジャンプ機能自体はあるんですが、一つ前に選択していたセルが記憶されないようで、この使い方が出来ません。
Googleスプレッドシートの場合は、そもそも ジャンプ機能がない(Ctrl +Gを押すと、Ctrl + Fの時と同じ 簡易検索が表示となる)ですし、そもそもハイパーリンクをクリック時も ハイパーリンクの入ったセルが選択状態になるわけではありません。
Excelと同じようにやりたい!と思っても、残念ながら難しいと思われます。
シートID取得は GASのカスタム関数(自作関数)を活用
では、シートIDが常に必要となる Googleスプレッドシートにおいて、簡単に、汎用的に 特定セルへのハイパーリンクを HYPERLINK関数で作成する方法はないのか?
シートIDは基本は手動で取得するしかないと書きましたが、実はこれはGASを使うことで解決出来ます。
そして、GASを使ってシートIDを自動取得するカスタム関数(自作関数)を作成し、これをHYPERLINK関数と組み合わせることで、簡単に汎用的なシート内の特定セルへのハイパーリンクが作成できます。
式が入ってるシートのシートIDが自動で取得できれば、セルやシートをコピーした場合でも、相対参照的動きで常に同じシート内の特定セルにジャンプするハイパーリンク になりますね!
コードも簡単、カスタム関数なのでスクリプトの承認も不要ってことで、ここは GASを使って解決することをおススメします。
↑ 過去にnoteで紹介していますが、少しだけ触れておきます。
たとえばカスタム関数を入れたシート(アクティブシート)のシートIDを取得するだけなら
function sheetId(){
return SpreadsheetApp.getActiveSheet().getSheetId();
}
この1行コードで十分です。この関数名 sheetId() の頭に = をつけた
=sheetId() という関数をセルに入れればOK
このように シートIDが取得できました。
これをHYPERLINK関数と組み合わせて
こんな式を組んで使えば、どのシートに入れても 式を入れたシートの E8セルにジャンプする汎用的な 特定セルへのハイパーリンク の完成です。
リンクを挿入機能でこれは難しいので、HYPERLINK関数を使うメリットと言えるでしょう。
過去noteでは、これをさらに応用したリンク付き全シートインデックス(目次)の作成方法も紹介しています。
セル位置のA1表記を 数式で生成してジャンプ先を可変にする
もう1つ、HYPERLINK関数で特定セルへのリンクを生成するメリットが、セル位置の方も数式で生成し可変にすることが出来る点です。
これも過去のnoteで書いたネタと重複しますが、たとえばA列に日付がずらっとあった場合、今日(または直近の日付)にジャンプしたいといった場合、GASを使うよりも HYPERLINK関数でジャンプした方が簡単ですし、良い面があります。
シート内特定セルへのHYPERLINK関数 応用問題
せっかくなんで、以前書いた XMATCHとHYPERLINKの 日付ジャンプの式のアレンジ問題をやってみましょう。
割と簡単な問題、そこそこ難しい応用問題の2つです。
Q1. リンクをクリックしたら横に並んだ日付の今日の日付にジャンプしたい
上の画像のような 2行目に日付が横並びに入ったシフト表があるとします。このA1セルに 2行目の今日の日付のセルにジャンプするハイパーリンクを設定したい。
HYPERLINK関数の中身はどのような式にすればよいでしょうか?
縦方向じゃなくて 横方向へのジャンプです。考えてみましょう!
↓↓↓回答
A1. リンクをクリックしたら横に並んだ日付の今日の日付にジャンプする式
回答です。
割と簡単ですね。
MATCH関数、または XMATCH関数で 2:2(2行目全体)から、TODAY() つまり本日の日付 の位置を探索します。
Googleスプレッドシートなら全員が使える XMATCHを積極的に使っていきたいところですが、MATCHでも処理出来ちゃうケースが多いんで、なかなか使用頻度が上がりませんね。
MATCHの場合はVLOOKUPと同じく、初期設定が 完全一致検索ではなく近似値一致検索なので、第3引数を FALSE(または 0)として、完全一致検索を指定する必要があります。
一方、XMATCHは XLOOKUP同様に、初期値が完全一致検索となっています。
返ってくる結果は、範囲の中で検索ヒットした位置(〇番目)、これは列番号となるので、これを 行番号の 2と 合わせて ADDRESS関数 に渡し A1表記のセル番地の文字列を取得します。
ここで重要なのは、ADDRESS関数の第3引数 絶対相対モードで、ここを 4とすることで $の付いてない A1表記を取得しています。
これは特定セルへのリンクは A1表記の箇所に $が付いた状態だと機能しない為です。
他の関数と組み合わせたHYPERLINKの使い方、なんとなくわかってきたでしょうか?
もう1件、今度は難易度高めのお題いってみましょう。
Q2. 数式で範囲内のキーワードを含むセルのリンク一覧を出力したい
HYPERLINK関数の応用例です。
たとえば 上の画像のように、A2セルに入力したキーワードを含むセルを C3:Iのデータ範囲から検索して、クリックしたら そのセルにジャンプできるハイパーリンク状態で、ヒットした検索にセルを A5から下にずらっと表示させたい。
こんなことは出来そうでしょうか?
一応出だしは
このようにしていますが、違う方法で考えてもOKです。
ちょっと難しいですが、自信のある人はチャレンジしてみましょう!
↓↓↓回答
A2. 数式で範囲内のキーワードを含むセルのリンク一覧を出力する
回答です。(あくまでも回答の一例です。他の方法もあるかと思います)
A2が空だった時の考慮をすると以下の方がいいかもしれません。
特定の列や行の検索ではないので、ARRYFORMULAで全セルに対してIF関数でキーワードを含む場合は、ハイパーリンクを返す、含まない場合は空白セルを返すという処理をかけてます。(その為やや重い処理です)
含むは REGEXMATCHを使っていますが、ここは FINDでもOK。
ハイパーリンクの生成は、先ほどと同じくADDRESSを使っています。
HYPERLINK("#gid=シートID&range="&
ADDRESS(ROW(data),COLUMN(data),4),data)
最後に TOCOLで 空白セルを除外して上に詰めて A列に出力。
そのまま書いてもさほど冗長にはなりませんが、一応LET関数で変数化もしています。
データ量が多いと、かなり処理に時間かかるかも。
データ量が多く処理が重すぎる場合は「検索と置換」もしくは GASの TextFinderを使った方が良いかもしれません。
HYPERLINK関数の応用例でした。
これと似たようなSORT関数とHYPERLINK関数を組み合わせた活用例も過去に紹介しています。
行や列が追加されても 相対的に対応できる ハイパーリンクを作る方法
HYPERLINK関数の応用例、ADDRESS関数と組み合わせた方法を理解していると、行や列が追加されても 相対参照的に追従できるリンクが作成できます。
相対的に追従できるハイパーリンクとは、どういうことか?
このように HYPERLINK関数で、「ココだよ!」のセル(この時点ではE8)へジャンプ出来るようにしても、その後で列や行の追加・削除があって「ココだよ!」のセルは F9に移動しても、リンクでジャンプするセルは E8 のままとなってしまいます。
これを相対参照的に 行、列の追加・削除があっても 「ココだよ!」へのリンクとしたいってケースがあるかと思います。
HYPERLINK関数とADDRESS関数で リンク先を追いかける
これは、リンクアドレス内の "E8"という文字列を、E8のセル参照から ADDRESS関数で "E8"という文字列を生成する式にアレンジすることで対応できます。
HYPERLINK関数の式を
このように ADDRESS(ROW(E8),COLUMN(E8),4) と、ADDRESS関数を組み合わせることで 行や列の追加・削除があって 「ココだよ!」のセル位置が変わった場合でも、リンクを追従させることが出来ました。
名前付き範囲を使って 相対的に特定セルへリンクする
上の式で出来るといっても、関数が苦手だったり、もっと簡単にやりたい!って人も多いかと思います。
この相対リンク作成は、HYPERLINK関数 + ADDRESS関数 の方法以外に、
名前付き範囲 + リンクを挿入
で作成する方法もあります。
名前付き範囲は、指定したセル範囲に名前をつけることが出来る機能です。
まずリンクで飛びたいセルを選択して、 データ > 名前付き範囲 で、
セルに名前を付けます。
その上で リンク元セルに「リンクの挿入」で名前付き範囲を指定します。
名前付き範囲へのリンクは、通常のセルへのリンクと違って
このように rangeid というものが設定され、rangeidで指定されたリンクとなっています。
そして名前付き範囲は、行や列の追加・削除に追従して、相対的に変化するので、追従型の特定セルへのリンクが出来ます。
こちらの方がシンプルで簡単かもしれません。
指定したセルにジャンプする ハイパーリンク以外の方法
最後にハイパーリンク以外の指定したセルにジャンプする方法を2つ紹介します。
名前ボックスでジャンプする
1つは「名前ボックス」を使う方法です。
シートや特定セル、名前付き範囲に一発でジャンプすることが出来ます。
この「名前ボックス」機能はキーボードショートカット Ctrl + J でも操作できるので
このようにキーボードだけで 名前付き範囲のセルにジャンプも可能です。
結構便利な機能です。
GASの activateメソッドを使う
他には GASのactivateを使う方法もあります。
たとえば
function jumpCell(){
const cellAddress = SpreadsheetApp.getActiveRange().getValue();
SpreadsheetApp.getActiveSpreadsheet().getRange(cellAddress).activate();
}
こんなコードを書いて、ボタンにスクリプトを割り当てることで、選択したセルの文字列で指定した シート、セルにジャンプすることが出来ます。
個人的には名前ボックスか、ハイパーリンクで十分なんで、わざわざGASを使う必要はないかなとかと思います。参考程度に。
次回ハイパーリンクシリーズの最後
今回はスプレッドシート内の特定セルへのハイパーリンクについて書きました。
HYPERLINK関数と他の関数を組み合わせたり、GASのカスタム関数でシートIDを取得したりと、思った以上に話が広がってしまいましたね。
次回は ハイパーリンクシリーズの最後。
ハイパーリンクの活用例ってことで、電話を発信できるハイパーリンク、住所からGoogleマップに飛べるハイパーリンク、検索結果を生成できるハイパーリンク、そしてGmailのひな形を生成できるハイパーリンクなどなど紹介したいと思います。
この記事が気に入ったらサポートをしてみませんか?