セルに「仕様書」と表示されていても、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の共有範囲と権限も合わせて確認すると、一覧を作った後の公開範囲を決めやすくなります。
