Google Apps Script (GAS)でスプレッドシートを操作する際、「セルの色に応じて処理を分けたい」「ステータスごとに色を変えたい」といったニーズは頻繁に発生します。この記事では、セルの背景色を取得するgetBackground()とgetBackgrounds()メソッドの正しい使い方と、処理を高速化するための実践的なテクニックを解説します。

getBackground()とgetBackgrounds()の違い
GASでセルの背景色を取得するメソッドは2種類あり、対象となるセルの数によって使い分けます。
単一セルの色を取得する getBackground()
getBackground()は、単一のセルを対象とし、その背景色を16進数のカラーコード(例: #ffffff)で返します。
function getSingleCellColor() {
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getRange("A1");
const color = range.getBackground();
console.log(color); // 例: "#ff0000" (A1セルが赤色の場合)
}
注意点: "A1:B5"のような複数セル範囲に対してgetBackground()を使うと、範囲の左上のセル(この場合はA1)の色しか返されません。複数セルの色を知りたい場合は、このメソッドは不適切です。
複数セルの色をまとめて取得する getBackgrounds()
getBackgrounds()は、指定した範囲内のすべてのセルの背景色を二次元配列で一括取得します。
function getMultipleCellColors() {
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getRange("A1:B2");
const colors = range.getBackgrounds();
console.log(colors);
// [['#ff0000', '#00ff00'], ['#0000ff', '#ffffff']] のように出力される
}
このメソッドは、ループ処理と組み合わせることで、各セルの色を効率的に処理できます。
パフォーマンスの鍵は「バッチ処理」
数百、数千行のデータを扱う場合、forループの中で何度もgetBackground()を呼び出すのは最悪のアンチパターンです。APIの呼び出し回数が増え、スクリプトの実行時間が大幅に増加してしまいます。
パフォーマンスを最適化するなら、**バッチ処理(一括取得・一括書き込み)**が鉄則です。
function processColorsInBatch() {
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getRange("A1:C1000"); // 1000行3列の範囲
// ① 背景色を一括で取得(API呼び出しは1回)
const backgroundColors = range.getBackgrounds();
// ② メモリ上でデータを処理
for (let i = 0; i < backgroundColors.length; i++) {
for (let j = 0; j < backgroundColors[i].length; j++) {
// 背景色が特定の色(例: 警告色の#fff000)の場合に処理
if (backgroundColors[i][j] === '#fff000') {
console.log(`セル (${i + 1}, ${j + 1}) は警告色です`);
}
}
}
}
このように、最初にgetBackgrounds()で全データを取得し、その後ループ処理を行うことで、API呼び出しを最小限に抑え、処理速度を劇的に改善できます。
実践例:色をトリガーにした複雑な自動化
getBackgrounds()を使えば、標準の条件付き書式では難しい、より複雑なロジックを実装できます。
例えば、「タスクが完了(背景色が緑)なら、隣のセルに完了日時を自動入力する」といった処理も可能です。
function setCompletionDateByColor() {
const sheet = SpreadsheetApp.getActiveSheet();
const range = sheet.getRange("A2:A" + sheet.getLastRow()); // A列をステータス列とする
const backgrounds = range.getBackgrounds();
const values = range.getValues();
const completionColor = "#d9ead3"; // 薄い緑色
for (let i = 0; i < backgrounds.length; i++) {
// 背景色が緑で、隣のB列が空欄の場合
if (backgrounds[i][0] === completionColor && sheet.getRange(i + 2, 2).getValue() === "") {
// B列に現在の日時をセット
sheet.getRange(i + 2, 2).setValue(new Date());
}
}
}
まとめ
セルの背景色をGASで扱う際は、getBackground()とgetBackgrounds()の使い分けが重要です。
- 単一セルなら
getBackground() - 複数セルなら
getBackgrounds()でのバッチ処理が必須 - 大量のデータを扱う際は、ループ内でのAPI呼び出しを避け、パフォーマンスを意識する
これらのテクニックを活用すれば、スプレッドシート業務の自動化の幅が大きく広がります。ぜひ試してみてください。



Learn best practices to improve the performance of your Apps Script projects.