Google Apps Script (GAS) を用いてスプレッドシートを操作する際、単なるセル値だけでなく、文字の装飾、色、ハイパーリンクといった「リッチテキスト」情報をプログラムで取得・制御したい場面は多々あります。通常のgetValue()メソッドではこれらの書式情報は失われてしまいますが、getRichTextValue()メソッドを使えば、詳細なリッチテキスト情報を効率的に扱えます。
本記事では、GASのgetRichTextValue()メソッドを徹底解説します。基本的な使い方から、セルの特定部分のスタイル取得、複数のハイパーリンク解析、さらには注意点とパフォーマンス最適化のヒントまで、スプレッドシートの自動化とデータ処理を次のレベルへと引き上げるための実践的な知識を提供します。
GAS初心者の方から、より高度なスクリプト開発を目指す方まで、すべての方に役立つ情報が満載です。

リッチテキストとは?GASにおける書式付きテキストの概念
Googleスプレッドシートのセルに表示されるテキストは、単なる文字列だけではありません。ユーザーは、以下のような多様な書式を適用できます。
- 太字や斜体、下線などの文字スタイル
- 文字の色や背景色
- 埋め込みハイパーリンク
- フォントの種類やサイズ
このような書式情報を含んだテキストを**「リッチテキスト」**と呼びます。
GASでRange.getValue()メソッドを使用すると、これらの書式情報はすべて無視され、プレーンな文字列のみが返されます。しかし、Range.getRichTextValue()メソッドを用いることで、書式情報全体を保持するRichTextValueオブジェクトとしてセル値を取得し、詳細な解析や操作が可能になります。
getRichTextValue() の基本的な使い方:単一セルの情報取得
getRichTextValue()メソッドは、指定したRangeオブジェクト(単一セルである必要があります)からRichTextValueオブジェクトを取得します。このオブジェクトを介して、セル内のテキスト、スタイル、リンクといった情報を詳細に掘り下げてアクセスできます。
基本的な使用例:A1セルのリッチテキスト情報を解析する
以下のコードは、アクティブなシートのA1セルからリッチテキスト情報を取得し、そのプレーンテキスト、太字設定、フォントサイズをログに出力する基本的な例です。
/**
* アクティブなシートのA1セルからリッチテキスト情報を取得し、
* テキスト内容と基本スタイル情報をログに出力する関数。
*/
function getRichTextInfoBasic() {
const sheet = SpreadsheetApp.getActiveSheet(); // アクティブなシートを取得
const range = sheet.getRange("A1"); // 対象セルA1をRangeオブジェクトとして取得
const richTextValue = range.getRichTextValue(); // A1セルのRichTextValueオブジェクトを取得
// RichTextValueオブジェクトが存在するか確認
if (richTextValue) {
// プレーンテキスト(書式なしのテキスト)を取得
Logger.log(`A1セルのプレーンテキスト: "${richTextValue.getText()}"`);
// セル全体のテキストスタイルを取得
const textStyle = richTextValue.getTextStyle();
Logger.log(`A1セル全体が太字かどうか: ${textStyle.isBold() ? 'はい' : 'いいえ'}`);
Logger.log(`A1セル全体のフォントサイズ: ${textStyle.getFontSize()}pt`);
Logger.log(`A1セル全体のフォント色: ${textStyle.getForegroundColor()}`);
} else {
// リッチテキスト情報がない場合(例: 空白セル、数値/日付フォーマットのセル)
Logger.log(`A1セルにはリッチテキスト情報が見つかりませんでした。`);
}
}
このスクリプトを実行することで、A1セルの書式情報をプログラムで読み取り、活用する第一歩を踏み出せます。
RichTextValueオブジェクトの応用:部分的なスタイルとリンクの解析
getRichTextValue()で取得したRichTextValueオブジェクトは、セル全体だけでなく、テキストの特定部分に適用されたスタイルやハイパーリンクの情報を詳細に解析するための強力なメソッドを提供します。
1. テキストの一部分のスタイルを取得する:getTextStyle(offset, endOffset)
セル内のテキストのうち、一部だけが異なるスタイル(例: 特定の単語だけ太字)になっている場合、getTextStyle(offset, endOffset)メソッドを使うことで、その部分に適用されているスタイル情報を取得できます。
offset: スタイルを取得したいテキストの開始インデックス(0から始まる)endOffset: スタイルを取得したいテキストの終了インデックス(排他的)
/**
* セル内のテキストの一部分に適用されたスタイルを取得する関数。
* 例: A1セルに「Hello **GAS** World!」と入力されている場合。
*/
function getPartialTextStyle() {
const sheet = SpreadsheetApp.getActiveSheet();
const richTextValue = sheet.getRange("A1").getRichTextValue(); // 例: A1に"Hello GAS World!"と入力されていると仮定
if (richTextValue) {
// テキスト"GAS" (インデックス6から9) のスタイルを取得
// "Hello GAS World!" -> H(0)e(1)l(2)l(3)o(4) (5)G(6)A(7)S(8) (9)W(10)...
const partialTextStyle = richTextValue.getTextStyle(6, 9);
Logger.log(`「GAS」部分が太字かどうか: ${partialTextStyle.isBold() ? 'はい' : 'いいえ'}`);
Logger.log(`「GAS」部分のフォント色: ${partialTextStyle.getForegroundColor()}`);
}
}
2. セル内のハイパーリンク情報を取得する
セルにハイパーリンクが設定されている場合、そのURLをプログラムで取得できます。
単一のハイパーリンクの場合:getLinkUrl()
セル全体に一つのハイパーリンクが設定されている場合、getLinkUrl()メソッドで直接URLを取得できます。
/**
* 単一のハイパーリンクが設定されたセルのURLを取得する関数。
* 例: A1セルに「[Google](https://www.google.com/)」とリンクが設定されている場合。
*/
function getSingleLinkUrl() {
const sheet = SpreadsheetApp.getActiveSheet();
const richTextValue = sheet.getRange("A1").getRichTextValue();
if (richTextValue) {
const linkUrl = richTextValue.getLinkUrl();
if (linkUrl) {
Logger.log(`A1セルのリンク先URL: ${linkUrl}`);
} else {
Logger.log(`A1セルには単一のリンクが見つかりませんでした。`);
}
}
}
複数のハイパーリンクを解析する:getRuns()
一つのセル内に「GoogleとYahoo」のように複数のハイパーリンクや、太字・色などのスタイルが複数存在する複雑なリッチテキストの場合、getLinkUrl()はnullを返します。
このような場合は、getRuns()メソッドが非常に強力です。getRuns()は、テキスト内のスタイルが変化する境界でテキストを複数のRichTextValueオブジェクト(「ラン」と呼びます)に分割して返します。これにより、各ランに適用されている個別のスタイルやリンク情報を詳細に解析できます。
/**
* 複数リンクを含むセルのリッチテキスト情報をgetRuns()で解析する関数。
* 例: A1セルに「[Google](https://www.google.com/) と [Yahoo](https://www.yahoo.com/)」と入力されている場合。
*/
function getMultipleLinksWithRuns() {
const sheet = SpreadsheetApp.getActiveSheet();
const richTextValue = sheet.getRange("A1").getRichTextValue();
if (richTextValue) {
const runs = richTextValue.getRuns(); // スタイルが異なる部分ごとにRichTextValueオブジェクトの配列を取得
Logger.log(`A1セルのリッチテキストは ${runs.length} つのランに分割されました。`);
runs.forEach((run, index) => {
const runText = run.getText(); // 各ランのテキスト部分
const runLinkUrl = run.getLinkUrl(); // 各ランに設定されているリンクURL
const runStyle = run.getTextStyle(); // 各ランに設定されているスタイル
Logger.log(`--- ラン ${index + 1} ---`);
Logger.log(` テキスト: "${runText}"`);
if (runLinkUrl) {
Logger.log(` リンク先URL: ${runLinkUrl}`);
}
Logger.log(` 太字: ${runStyle.isBold() ? 'はい' : 'いいえ'}`);
// 他にもフォントサイズ、色などのスタイル情報を取得可能
});
} else {
Logger.log(`A1セルにはリッチテキスト情報が見つかりませんでした。`);
}
}
getRuns()を使えば、複雑なリッチテキスト構造を持つセルでも、その内部情報を詳細にプログラムで制御できるようになります。
getRichTextValue() 使用時の注意点とパフォーマンス最適化
getRichTextValue()は非常に強力ですが、その特性を理解し、適切に扱うことが重要です。
1. 日付や数値フォーマットのセルではnullを返す
重要な注意点として、getRichTextValue()は、セルの表示形式が日付や数値である場合、リッチテキスト情報がないものとみなしnullを返します。これは、GASが日付や数値をリッチテキストとは区別して扱うためです。
もし日付や数値が入力されたセルからリッチテキスト情報を取得したい場合は、一時的にセルの表示形式を文字列(@)に変更してからgetRichTextValue()を呼び出す必要があります。
/**
* 日付や数値フォーマットのセルからリッチテキストを取得する際の注意点と対策。
*/
function handleFormattedCellForRichText() {
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getRange("A1"); // 例: A1に日付が入力されていると仮定
const originalFormat = range.getNumberFormat(); // 元の表示形式を保存
try {
range.setNumberFormat('@'); // 一時的に文字列フォーマットに変更
SpreadsheetApp.flush(); // 変更を即時反映 (重要)
const richTextValue = range.getRichTextValue();
if (richTextValue) {
Logger.log(`文字列として取得したテキスト: ${richTextValue.getText()}`);
// ここでリッチテキストの解析処理を行う
} else {
Logger.log(`A1セルにリッチテキスト情報が見つかりませんでした(フォーマット変更後)。`);
}
} finally {
// 処理後、必ず元の表示形式に戻す
range.setNumberFormat(originalFormat);
Logger.log(`A1セルの表示形式を元の "${originalFormat}" に戻しました。`);
}
}
SpreadsheetApp.flush()を呼び出すことで、表示形式の変更をすぐにシートに反映させ、正確なRichTextValueを取得できるようにすることが重要です。
2. パフォーマンスの最適化:getRichTextValues()の活用
GASのベストプラクティスとして、API呼び出し回数を減らすことがスクリプトの高速化に繋がります。多数のセルを一つずつgetRichTextValue()で処理すると、API呼び出しが頻発し、スクリプトの実行が著しく遅くなる可能性があります。
大量のリッチテキストデータを扱う場合は、Range.getRichTextValues()(複数形)メソッドを使用し、**一度の呼び出しで範囲内のすべてのRichTextValueオブジェクトを二次元配列として取得する「バッチ処理」**を強く推奨します。
/**
* 複数セルのリッチテキスト情報をgetRichTextValues()で一括取得し、処理する関数。
*/
function getAllRichTextValuesBatch() {
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getRange("A1:C5"); // 処理対象範囲
// 指定範囲のRichTextValueオブジェクトを二次元配列として一括取得
const richTextValues = range.getRichTextValues();
richTextValues.forEach((row, rowIndex) => {
row.forEach((richTextValue, colIndex) => {
const cellAddress = sheet.getRange(rowIndex + 1, colIndex + 1).getA1Notation();
if (richTextValue) {
Logger.log(`セル ${cellAddress} のテキスト: ${richTextValue.getText()}`);
// さらにgetTextStyle(), getLinkUrl(), getRuns()などで詳細解析
} else {
Logger.log(`セル ${cellAddress} にはリッチテキスト情報がありません。`);
}
});
});
}
このバッチ処理を用いることで、スクリプトの実行時間を大幅に短縮し、より効率的なスプレッドシート操作が可能になります。
まとめ:getRichTextValue() でGASスプレッドシートの可能性を広げる
Google Apps ScriptのgetRichTextValue()メソッドは、スプレッドシートのセル内に秘められた詳細な書式情報(リッチテキスト)をプログラムで扱うための強力な鍵です。
- テキストとスタイルの詳細解析:
getText()でプレーンテキストを、getTextStyle()で全体または部分的なスタイル(太字、色、フォントサイズなど)を取得できます。 - ハイパーリンクの効率的な処理:
getLinkUrl()で単一リンクを、getRuns()で複数リンクや複雑な書式を持つテキストを効果的に解析できます。 - 堅牢なスクリプト作成の注意点: 日付/数値フォーマットのセルでは
nullを返す点、およびパフォーマンス最適化のためにgetRichTextValues()を使ったバッチ処理を検討することが重要です。
これらの機能を活用することで、自動レポート生成、コンテンツの自動校正、リンク情報の抽出と管理、特定の書式を持つデータのフィルタリングなど、GASによるスプレッドシート自動化の可能性をさらに広げることができます。
本記事で紹介した知識と実践例を参考に、あなたのGASスクリプトをより高度で効率的なものへと進化させてください。

以前 Google SpreadSheet: ハイパーリンクを一括抽出する という記事を書いたのですが、これではうまくいかないケースがあったので、ちょっと調べて別の手段を講じましたので、紹介しておきます。 SpreadSheet でセル全体に対してリンクを設定すると、そのセ...
I can't get a text value from RichTextValue which is from a date cell. The target sheet looks like this: | date | string | string | I want to get a text value from first cell. So I write this co...