MENU

GASでセル内のリンクURLを読み取る

当ページのリンクには広告(PR)が含まれていることがあります。
GASでセル内のリンクURLを読み取る。リンク付きセル、文字とURLを分離、リンク先を取得の処理例。

セルに「仕様書」と表示されていても、getValueで取り出せるのは表示されている文字で、設定されたリンク先とは別です。資料一覧からURLを集めたい場合は、セル内の文字と書式を持つRichTextValueを調べます。

注意したいのは、getLinkUrl()がnullでもリンクなしとは限らないことです。公式資料では、複数の異なるリンクがある場合もnullになると説明されています。1セルに2つの資料へのリンクを置く表では、文字の範囲を分けて調べる必要があります。

目次

文字全体と一部分のリンク

例として、B2に「資料A・資料B」と書き、「資料A」と「資料B」に別々のURLを設定します。セル全体のリンク先は1つに決められませんが、文字ごとの位置を指定すれば、それぞれのリンクを取り出せます。

公式のRichTextValueは、位置を指定するgetLinkUrl(startOffset, endOffset)を提供しています。開始位置を含み、終了位置は含まない指定です。たとえば0から3なら、先頭の「資料A」を対象にします。

getRunsは文字のスタイルが同じ区間を返すメソッドです。リンクの境界とスタイルの境界を同じものだと決めず、この例では文字の位置からURLを確認します。空の部分やリンクなしの文字は結果へ入れません。

連続した同じURLをまとめるコード

同じURLが付いた隣り合う文字を1つにまとめます。表示文字とURLを組にして返すので、どの資料名から取得したリンクかも残ります。

function extractLinkParts(rich) {
  if (!rich) return [];
  const text = rich.getText();
  const parts = [];
  for (let i = 0; i < text.length; i++) {
    const url = rich.getLinkUrl(i, i + 1);
    if (!url) continue;
    const previous = parts[parts.length - 1];
    if (previous && previous.url === url && previous.end === i) {
      previous.end = i + 1;
      previous.text += text[i];
    } else {
      parts.push({start: i, end: i + 1, text: text[i], url: url});
    }
  }
  return parts;
}

function previewCellLinks() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('リンク練習');
  if (!sheet) throw new Error('リンク練習シートがありません');
  const rich = sheet.getRange('B2').getRichTextValue();
  console.log(JSON.stringify(extractLinkParts(rich)));
}

B2の「資料A」にhttps://example.com/a、「資料B」にhttps://example.com/bを付けた場合、結果は2件になる想定です。先頭はstart:0,end:3,text:"資料A"となり、「・」はリンクがなければ除外されます。例のURLは説明用で、実際の資料を示していません。

空欄と数式を区別する

RichTextValueが取得できない場合は空配列を返します。これを、元のセルにデータがないという判断へ直結させないでください。数値など文字のリッチテキストとして扱えない値もあるため、必要ならセルの値と数式も別に控えます。

HYPERLINK関数で作ったセルと、文字に直接リンクを付けたセルも、入力方法が違います。数式の引数を単純なカンマ分割で取り出すと、式や引用符を誤って解釈する可能性があります。対象の入力形式をそろえられない場合は、取得結果を元のセルと照合してから利用します。

表全体へ広げる場合は、必要な範囲だけをgetRichTextValuesで取得し、行番号と列番号を結果に添えます。配列の基本はスプレッドシートの読み書きにまとめています。

URLを取得した後の扱い

取得したURLが正しい資料へつながるかは、リンクを取り出す処理だけでは分かりません。権限が必要な資料のURLや、個人名を含むURLを一覧ログへ出してよいかも確認します。出力先を増やすと、元の表とは別に閲覧範囲を管理する必要があります。

ローカルでは、文字位置ごとのURLを返す代用オブジェクトで、2リンク、リンクなし、同じURLの連続と分離、空の値を確認しました。Google上のリッチテキストや特殊文字を含む表示は未確認です。最初は短い練習セルを使い、元のリンクを画面で開いた結果と照合してください。

資料を外部へ共有する判断は、URL取得とは分けます。GASの共有範囲と権限も合わせて確認すると、一覧を作った後の公開範囲を決めやすくなります。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次