ray88’s diary

お仕事で困ったとき用の自分用の覚書

GAS 背景色のついたセルを判定する

GAS 目次 - ray88’s diary
各種目次 - ray88’s diary

以下は赤色の背景色をチェックするコードだが、別の色をチェックしたいときは「function isRed(color)」関数の「const target = '#ff0000';」の色コードを変更すればよい

/**
 * 指定したシートとセル範囲内の赤色セルのアドレスを配列で返します。
 *
 * @param {string} sheetName - チェック対象のシート名(例: "シート1")
 * @param {string} rangeA1 - チェック対象のセル範囲(A1記法、例: "C3:E10")
 * @returns {string[]} 赤色セルのA1形式のアドレス配列(例: ["C3", "D4"])
 * @throws {Error} 指定されたシートが存在しない場合にエラーをスローします。
 */
function getRedCellAddresses(sheetName, rangeA1) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  if (!sheet) {
    throw new Error(`シート「${sheetName}」が見つかりません`);
  }

  const range = sheet.getRange(rangeA1);
  const backgrounds = range.getBackgrounds();
  const numRows = range.getNumRows();
  const numCols = range.getNumColumns();
  const startRow = range.getRow();
  const startCol = range.getColumn();

  const redCells = [];

  for (let i = 0; i < numRows; i++) {
    for (let j = 0; j < numCols; j++) {
      const color = backgrounds[i][j];
      if (isRed(color)) {
        const cell = sheet.getRange(startRow + i, startCol + j);
        redCells.push(cell.getA1Notation());
      }
    }
  }

  Logger.log(`赤いセルのアドレス(${sheetName} - ${rangeA1}): ${JSON.stringify(redCells)}`);
  return redCells;
}
/**
 * 色コードが完全な赤色(#ff0000)かどうかを判定します。
 *
 * @param {string} color - 背景色の16進カラーコード(例: "#ff0000")
 * @returns {boolean} 赤色と一致する場合は true、それ以外は false
 */
// 🔴 完全な赤を判定(必要に応じて近似色に対応可能)
function isRed(color) {
  const target = '#ff0000';
  return color.toLowerCase() === target;
}

呼び出し例

function main(){
 let result = getRedCellAddresses('シート1','B2:C12')

 // 改行で結合されたメッセージ作成
  let message;
  if (result.length === 0) {
    message = '赤色のセルは見つかりませんでした。';
  } else {
    message = '以下のセルが赤色です:\n' + result.join('\n');
  }

  // UIにアラートを表示
  SpreadsheetApp.getUi().alert(message);

  //完了ログ出力
  Logger.log('完了')
}