GASでスプレッドシートのセルに
リンクや文字装飾を設定する方法
「会社名をクリックしたらその会社のサイトへ飛ばしたい」「セルの一部だけ赤い太字で強調したい」。こうした見た目はRichTextValue(リッチテキスト値)を使えばコードで設定できます。表示する文字とリンク先を分けたり、文字の一部だけ装飾したりと、setValueでは届かない表現を、動くコードで解説します。
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開発をまとめてご相談いただけます。要件整理から運用設計までお手伝いします。