GASでスプレッドシートのセルに
リンクや文字装飾を設定する方法

「会社名をクリックしたらその会社のサイトへ飛ばしたい」「セルの一部だけ赤い太字で強調したい」。こうした見た目はRichTextValue(リッチテキスト値)を使えばコードで設定できます。表示する文字とリンク先を分けたり、文字の一部だけ装飾したりと、setValueでは届かない表現を、動くコードで解説します。

|対象: GAS / スプレッドシート / 表の見た目づくり

Table of Contents

RichTextValueとは何ができるのか

RichTextValueは、セルの文字にリンクや装飾を持たせるための値です。ふつうのsetValueは「文字そのもの」を入れるだけですが、RichTextValueなら「どの文字に・どんなリンクや装飾を付けるか」まで指定できます。

表示文字とリンク先を分ける

「会社名」を見せつつ、クリックで会社サイトへ飛ばせる

文字の一部だけ装飾

セル内の特定の語だけを太字・色付き・下線にできる

1セルに複数リンク

同じセルの別々の文字に、別々のリンクを設定できる

一括で書き込める

二次元配列にまとめてsetRichTextValuesで高速に反映できる

作るときはSpreadsheetApp.newRichTextValue()から.build()で組み立て、range.setRichTextValue()でセルに書き込みます。この「ビルダー方式」が基本の流れです。

セルにハイパーリンクを設定する基本

まずは一番シンプルな、セル全体に1つのリンクを張る形です。setTextで表示する文字を、setLinkUrlでリンク先を指定します。URLをそのままセルに入れるのと違い、「Lustage公式サイト」という文字を見せながらリンクを張れるのがポイントです。

// セルに「表示文字」と「リンク先」を別々に設定する基本形。
// setValueでURLを入れるのと違い、見える文字とリンク先を分けられる。
function setCellLink() {
  const sheet = SpreadsheetApp.getActiveSheet();

  const richText = SpreadsheetApp.newRichTextValue()
    .setText("Lustage公式サイト")            // セルに表示する文字
    .setLinkUrl("https://lustage.jp")        // クリックで飛ぶ先
    .build();

  sheet.getRange("A1").setRichTextValue(richText);
}

セルには「Lustage公式サイト」と表示され、クリックすると指定したURLへ移動します。表の見出しやリスト項目に、説明ページへのリンクを埋め込むときに便利です。

文字の一部だけ太字・色・リンクにする

RichTextValueの強みは、文字の一部だけを狙って装飾できることです。位置は0始まりの文字インデックスで指定し、setTextStyle(開始, 終了, スタイル)の「終了」はその手前までを意味します(終了位置の文字は含まれません)。装飾の中身はnewTextStyle()で作ります。

// 文字の一部だけを装飾する。位置は0始まりの文字インデックスで、
// setTextStyle(開始, 終了, スタイル) の「終了」はその手前まで。
function setPartialStyle() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const text = "重要:詳細はこちら";
  //            重(0)要(1):(2)詳(3)細(4)は(5)こ(6)ち(7)ら(8)

  // 「重要」を赤い太字にするスタイル
  const warn = SpreadsheetApp.newTextStyle()
    .setBold(true)
    .setForegroundColor("#d93025")
    .build();

  const richText = SpreadsheetApp.newRichTextValue()
    .setText(text)
    .setTextStyle(0, 2, warn)                       // 「重要」= 0〜1文字目
    .setLinkUrl(3, 9, "https://example.com/detail") // 「詳細はこちら」にリンク
    .build();

  sheet.getRange("A1").setRichTextValue(richText);
}

この例では「重要」の2文字だけを赤い太字にし、「詳細はこちら」の部分にリンクを張っています。同じセル内で装飾とリンクを重ねられるので、注意書きや案内文を1セルで表現できます。setUnderline(true)setFontSizeなども同じ要領で追加できます。

既存の値を保ったままリンクだけ付ける

すでに文字が入っているセルに、あとからリンクだけを足したい場面はよくあります。ポイントは、getValue()で今の文字列を取り出し、それをsetTextに渡してからリンクを付けることです。RichTextValueは文字列も一緒に持つため、文字を渡し直さないと空になってしまいます。

// すでに入っている値を保ったまま、リンクだけ後付けする。
// getValue()で今の文字列を取り、それを表示文字にしてリンクを足す。
function linkifyExistingCell() {
  const range = SpreadsheetApp.getActiveSheet().getRange("A1");
  const current = String(range.getValue());  // 既存の表示文字

  const richText = SpreadsheetApp.newRichTextValue()
    .setText(current)                         // 文字はそのまま
    .setLinkUrl("https://lustage.jp")         // リンクだけ追加
    .build();

  range.setRichTextValue(richText);
}

これで、表示されている文字はそのままに、クリックでリンク先へ飛ぶようになります。数式の結果が入っているセルには使えない点に注意してください(setRichTextValueは数式を固定値で上書きします)。

複数セルに一括でリンクを設定する

実務で多いのが、「A列の会社名にB列のURLでリンクを付ける」ような一括処理です。1セルずつsetRichTextValueを呼ぶと行数ぶんアクセスが発生して遅くなります。RichTextValueの二次元配列を組み立て、setRichTextValues(複数形)でまとめて書き込むのが定石です。

// A列=会社名、B列=URL の表を、A列の会社名にリンクを付ける形へ一括変換。
// 1セルずつ書かず、RichTextValueの二次元配列を作って一括書き込みする。
function linkifyCompanyColumn() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("会社一覧");
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return; // データなし

  // 2行目以降を一括で読む(1回のアクセス)
  const names = sheet.getRange(2, 1, lastRow - 1, 1).getValues(); // A列
  const urls  = sheet.getRange(2, 2, lastRow - 1, 1).getValues(); // B列

  const richValues = names.map(function (row, i) {
    const name = String(row[0] || "");
    const url  = String(urls[i][0] || "");

    let builder = SpreadsheetApp.newRichTextValue().setText(name);
    if (url) builder = builder.setLinkUrl(url); // URLがある行だけリンク化
    return [builder.build()];                   // 1列ぶんなので要素1つの配列
  });

  // A列にまとめて書き戻す(1回のアクセス)
  sheet.getRange(2, 1, richValues.length, 1).setRichTextValues(richValues);
}

読み込みも書き込みも範囲まとめて1回ずつなので、行数が増えても高速です。一括読み書きの考え方はスプレッドシート処理の高速化でも解説しています。URLが空の行はリンクを付けずに文字だけ書き込むので、歯抜けのデータでも安全に回せます。

リンクを読み取る・解除する

設定したリンクはgetRichTextValue()で読み取れます。セル全体に1つのリンクが張られていればgetLinkUrl()でそのURLが取れます。文字ごとにリンクが違う場合はgetRuns()で、装飾やリンクが切り替わる「まとまり(ラン)」ごとに分けて調べます。

// リンクの読み取りと、装飾・リンクの解除。
function readAndClearLink() {
  const range = SpreadsheetApp.getActiveSheet().getRange("A1");
  const rich = range.getRichTextValue();

  // セル全体に1つのリンクが張られていればそのURL、
  // 部分リンクや無リンクなら null が返る
  const url = rich.getLinkUrl();
  Logger.log("リンク先: " + url);

  // 部分的なリンク・装飾を調べるなら getRuns()(まとまりごとに分割)
  rich.getRuns().forEach(function (run) {
    Logger.log(run.getText() + " -> " + run.getLinkUrl());
  });

  // リンクと装飾を消してプレーンな文字だけに戻す
  const plain = SpreadsheetApp.newRichTextValue()
    .setText(rich.getText())  // 文字列だけ引き継ぐ
    .build();
  range.setRichTextValue(plain);
}

リンクや装飾を消したいときは、getText()で文字だけを取り出し、それをsetTextしただけのRichTextValueを書き戻すのが確実です。clearFormat()では背景色などの書式は消えても、リンクが残ることがあるためです。

まとめ

RichTextValueを使えば、表示文字とリンク先を分けたり、文字の一部だけを装飾したりと、setValueでは届かない表現がコードでできます。押さえるべきは、newRichTextValue()からbuild()で組み立てる流れ、位置は0始まりで終了は手前までというインデックスの数え方、そして大量処理はsetRichTextValuesで一括書き込みする点です。会社リストのリンク化や案内文の強調など、表の見た目を一段わかりやすくするときに活躍します。

よくある質問

setValueでセルにURL文字列を入れると、多くの場合クリックできるリンクとして自動認識されますが、表示文字列とリンク先を分けられません。RichTextValueなら「会社名を表示しつつクリックで会社サイトへ飛ばす」のように、見える文字とリンク先を別々に設定できます。文字の一部だけリンクにしたり、太字や色を付けたりできるのもRichTextValueだけの機能です。

できます。setLinkUrl(開始位置, 終了位置, URL)を範囲を変えて複数回呼べば、同じセル内の別々の文字に別々のリンクを設定できます。位置は文字数で数える0始まりのインデックスで、終了位置は「その手前まで」を意味します。読み取るときはgetRuns()で、リンクや装飾が切り替わるまとまり(ラン)ごとに分けて取得できます。

同じ範囲に両方を書き込むと、あとから実行したほうで上書きされます。RichTextValueには文字列そのものも含まれるため、リンクや装飾を設定するならsetRichTextValuesだけで値も一緒に書き込むのが基本です。数値の計算結果などはsetValuesで書き、そのあと特定の列だけリンク化する、といった使い分けをすると混乱しません。

既存のRichTextValueからgetText()で文字列だけを取り出し、それをsetTextしただけの新しいRichTextValueをbuildしてセルに書き戻すと、リンクや装飾が消えてプレーンな文字だけになります。range.clearFormat()は背景色などの書式は消しますが、RichTextのリンクは残ることがあるため、確実に消すにはこの書き戻し方式が安全です。

1セルずつsetRichTextValueを呼ぶとスプレッドシートへのアクセスが行数ぶん発生して遅くなります。RichTextValueの二次元配列を組み立て、setRichTextValuesで範囲にまとめて一括書き込みすれば、アクセスが1回で済み大幅に速くなります。数百行を超えるときは一括書き込みを基本にしてください。

スプレッドシートの
自動化を相談する。

リンク付きの一覧作成から、集計・帳票・通知までの業務自動化まで、GAS開発をまとめてご相談いただけます。要件整理から運用設計までお手伝いします。

GAS開発を見る