1. ホーム
  2. /
  3. [GAS]
  4. /
  5. GASで文字色を高速一括取得!getFontColorObjects()でパフォーマンスを改善する方法

GASで文字色を高速一括取得!getFontColorObjects()でパフォーマンスを改善する方法

GASで文字色を高速一括取得!getFontColorObjects()でパフォーマンスを改善する方法

Google Apps Script (GAS) で、広範囲のセルの文字色を一つずつチェックするスクリプトを書いた結果、「処理が遅すぎてタイムアウトしてしまう…」という経験はありませんか? その原因は、セルの情報を何度も取得するためにAPIを繰り返し呼び出していることにあります。

このパフォーマンス問題を解決する鍵が、getFontColorObjects() メソッドです。

この記事では、getFontColorObjects() を使って複数セルの文字色情報を一括で高速に取得し、効率的に処理する方法を、具体的なコード例と共に徹底的に解説します。

Google Apps Script 始め方 スプレッドシート 活用例
Google Apps Script 始め方 スプレッドシート 活用例 を各ショップで検索

なぜ getFontColorObjects() が速いのか? - 一括取得の重要性

多数のセルの文字色を取得する際、for ループの中で getFontColorObject() (単数形) を使うのは典型的なパフォーマンスのボトルネックです。

// 【非推奨】絶対に避けるべき遅いコード
function slowWay() {
  const range = SpreadsheetApp.getActiveSheet().getRange("A1:C100");
  const colors = [];
  for (let r = 1; r <= 100; r++) {
    const rowColors = [];
    for (let c = 1; c <= 3; c++) {
      // 100x3 = 300回のAPI呼び出しが発生!
      rowColors.push(range.getCell(r, c).getFontColorObject());
    }
    colors.push(rowColors);
  }
}

// 【推奨】一瞬で終わる高速なコード
function fastWay() {
  const range = SpreadsheetApp.getActiveSheet().getRange("A1:C100");
  // API呼び出しはたったの1回!
  const colors = range.getFontColorObjects();
}

スプレッドシートへのアクセス(API呼び出し)は時間のかかる処理です。getFontColorObjects() は、このAPI呼び出しを一度に集約することで、スクリプトの実行速度を劇的に向上させます。

getFontColorObjects() の基本的な使い方

getFontColorObjects() は、指定した範囲の文字色を Color オブジェクトの二次元配列として返します。この配列の構造は、スプレッドシートの行列と一致しているため、直感的に扱うことができます。

function fetchFontColorsInBulk() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("A1:B3");
  // Colorオブジェクトの二次元配列を取得
  const colorMatrix = range.getFontColorObjects();

  // 取得した配列をループ処理
  colorMatrix.forEach((row, rowIndex) => {
    row.forEach((color, colIndex) => {
      const cellAddress = String.fromCharCode(65 + colIndex) + (rowIndex + 1);
      const hex = color.asRgbColor().asHexString(); // Colorオブジェクトを16進数に変換
      console.log(`${cellAddress} の色は ${hex} です。`);
    });
  });
}

応用テクニック:取得した色の配列を効率的に加工・活用する

getFontColorObjects() で取得した二次元配列は、JavaScriptの配列メソッドと組み合わせることで、様々な処理に応用できます。

1. 特定の色のセルの情報を抽出する

範囲内から文字色が赤 (#ff0000) のセルだけを検出し、そのセルの値とアドレスをオブジェクト配列としてまとめます。

function findRedFontCells() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getDataRange();
  const colors = range.getFontColorObjects();
  const values = range.getValues(); // 値も一括取得しておくと効率的
  const redCells = [];

  colors.forEach((row, r) => {
    row.forEach((color, c) => {
      if (color.asRgbColor().asHexString() === '#ff0000') {
        redCells.push({
          address: range.getCell(r + 1, c + 1).getA1Notation(),
          value: values[r][c]
        });
      }
    });
  });
  console.log('赤文字のセル情報:', redCells);
}

2. 色を一括で置換する

map() メソッドを使って新しい色の二次元配列を効率的に作成し、setFontColorObjects() で一括更新します。これにより、シート上の色を高速に書き換えることができます。

function replaceColorsInBulk() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("A1:D10");
  const currentColorObjects = range.getFontColorObjects();

  // 新しいColorオブジェクトの二次元配列を生成
  const newColorObjects = currentColorObjects.map(row =>
    row.map(cellColor => {
      // 現在の色が赤なら、青に置き換える
      if (cellColor.asRgbColor().asHexString() === '#ff0000') {
        // 新しいColorオブジェクトをビルダーで作成
        return SpreadsheetApp.newColor().setRgbColor("#0000ff").build();
      }
      // それ以外の色はそのまま維持
      return cellColor;
    })
  );

  // setFontColorObjects()で一括更新
  range.setFontColorObjects(newColorObjects);
}

まとめ

getFontColorObjects() は、スプレッドシートの文字色を扱うスクリプトのパフォーマンスを飛躍的に向上させるための必須メソッドです。

  • パフォーマンス第一: forループでセルを一つずつ叩くのではなく、必ず一括取得する。
  • Colorオブジェクトの活用: 取得した二次元配列から、色情報の詳細な分析や加工が可能。
  • 書き込みも一括で: setFontColorObjects() と組み合わせることで、読み書き両方の処理を高速化できる。

大量のセルの書式を扱う際は、常に「一括処理」を意識することで、安定して高速に動作する堅牢なスクリ-プトを構築できます。

Google Apps Script 始め方 スプレッドシート 活用例
Google Apps Script 始め方 スプレッドシート 活用例 を各ショップで検索
Class Range | Apps Script | Google for Developers

関連記事

【GASスプレッドシート】getValues()で複数セルデータを高速一括取得・SEO最適化

【GASスプレッドシート】getValues()で複数セルデータを高速一括取得・SEO最適化

Google Apps Script (GAS) を用いてスプレッドシートのデータを操作する際、複数セルの値(データ)を効率的かつ高速に取得することは、自動化スクリプトのパフォーマンスと信頼性を決定づける最も重要な要素の一つです。getValues()メソッドは、このニーズに応えるための基本的ながら極めて強力な機能です。

本記事では、GASのRange.getValues()メソッドを徹底解説します。複数セルのデータを二次元配列として一括取得する基本から、getValue()getDisplayValues()との明確な違い、各データ型(数値、文字列、日付、真偽値)の挙動、さらには大規模データ処理のためのパフォーマンス最適化(チャンク処理)、そしてよくある「ハマりどころ」と対策まで、具体的なコード例を交えて分かりやすく紹介します。

【GAS高速化】getFontWeights()で太字を一括取得!API呼び出しを激減させる方法

【GAS高速化】getFontWeights()で太字を一括取得!API呼び出しを激減させる方法

Google Apps Script (GAS)で、スプレッドシートの大量のセルの中から「太字(bold)のセル」を探す処理を書いたとき、実行に時間がかかりすぎて困った経験はありませんか?その原因は、十中八九、ループの中でgetFontWeight()(単数形)を呼び出していることにあります。

この記事では、パフォーマンスを劇的に改善するための必須メソッド**getFontWeights()**に焦点を当て、その効果的な使い方と、取得した書式情報を他のデータと組み合わせて活用する、より高度なテクニックを解説します。