ADVERTISEMENT

【Googleスプレッドシート】Apps Scriptでセルの背景色を条件付きで変える!setBackgroundの活用

【Googleスプレッドシート】Apps Scriptでセルの背景色を条件付きで変える!setBackgroundの活用
🛡️ 超解決

スプレッドシートでセルの背景色を条件に応じて自動で変えたいと思ったことはありませんか。条件付き書式でもある程度はできますが、複雑な条件や外部データとの連携が必要な場合はApps Scriptが便利です。この記事では、Apps ScriptのsetBackgroundメソッドを使ってセルの背景色を自在に変更する方法を解説します。具体的なコード例や実践的な応用例を通じて、あなたのシートをより見やすくするためのノウハウをお伝えします。

【要点】Apps ScriptのsetBackgroundで条件付き色付けを実現する3つのステップ

  • setBackground(色): 単一のセルまたは範囲全体に指定した色を一括で適用します。色はカラーコードまたは色名で指定します。
  • if文やswitch文による条件分岐: セルの値や他のシートのデータに応じて異なる色を設定できるため、柔軟な条件付き書式を実現します。
  • トリガーによる自動実行: 編集時や時間指定でスクリプトを自動起動することで、手動操作なしに常に最新の状態に色を反映できます。

ADVERTISEMENT

Apps ScriptのsetBackgroundでできることと前提知識

setBackgroundメソッドは、GoogleスプレッドシートのApps Scriptでセルの背景色を設定するための基本的なメソッドです。このメソッドを使うと、特定のセルや範囲に対して任意の色をプログラムで割り当てられます。単純な色変更だけでなく、条件分岐やループと組み合わせることで、値に応じて色を変える動的なシートを作成できます。

使用する前に、スクリプトエディタを開く方法を知っておきましょう。スプレッドシートのメニューから「拡張機能」→「Apps Script」を選択すると、スクリプトエディタが開きます。ここにコードを記述し、実行します。初めてスクリプトを実行するときは、権限の承認が必要です。必要な権限は現在のスプレッドシートへのアクセス権限です。

setBackgroundを使って背景色を変更する基本的な手順

ここからは、実際にコードを書きながらsetBackgroundの使い方を学びます。まずは最もシンプルな単一セルの色変更から始めましょう。

単一セルの背景色を変更する

  1. スクリプトエディタを開く
    スプレッドシートを開き、メニューから「拡張機能」→「Apps Script」をクリックします。
  2. 新しい関数を作成する
    エディタに以下のコードを記述します。function setSingleCellColor() { … } という名前の関数を作成します。
  3. コードを記述する
    function setSingleCellColor() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange(“A1”).setBackground(“#FF0000”); } これでA1セルの背景色が赤色になります。
  4. 関数を実行する
    エディタのツールバーで「実行」ボタンをクリックします。初回は権限承認画面が表示されるので、「許可」をクリックします。
  5. 結果を確認する
    スプレッドシートに戻ると、A1セルの背景が赤色に変わっているはずです。

範囲全体の背景色を一括変更する

  1. 範囲を指定する
    getRangeメソッドで複数セルを指定します。例: sheet.getRange(“A1:C10”) はA1からC10までの範囲です。
  2. setBackgroundを呼び出す
    sheet.getRange(“A1:C10”).setBackground(“#00FF00”); と記述すると、その範囲全体が緑色になります。
  3. 異なる色を個別に設定するには
    setBackgroundsメソッドを使うと、範囲内の各セルに異なる色を二次元配列で指定できます。例: sheet.getRange(“A1:C10”).setBackgrounds(colorsArray); ただし、配列のサイズは範囲と同じにする必要があります。

条件分岐を使って値に応じて色を変える方法

setBackgroundの真価は、条件分岐と組み合わせたときに発揮されます。セルの値に応じて色を変える典型的なパターンを見てみましょう。

  1. データを取得する
    var values = sheet.getRange(“A1:A10”).getValues(); でA1からA10の値を二次元配列として取得します。
  2. ループで各セルを処理する
    for (var i = 0; i < values.length; i++) { var cellValue = values[i][0]; if (cellValue > 100) { sheet.getRange(i+1, 1).setBackground(“#FF0000”); } else if (cellValue > 50) { sheet.getRange(i+1, 1).setBackground(“#FFFF00”); } else { sheet.getRange(i+1, 1).setBackground(“#00FF00”); } } これで、100より大きい値は赤、50より大きい値は黄色、それ以外は緑になります。
  3. 効率的な範囲の一括設定
    上の方法ではセルごとにsetBackgroundを呼び出すため、範囲が大きいと処理が遅くなります。代わりに、色の二次元配列を作成し、最後にsetBackgroundsで一括設定すると高速です。

ADVERTISEMENT

トリガーを使って自動化する

スクリプトを手動で実行するだけでは面倒です。編集時や定期的に自動実行するにはトリガーを設定します。

  1. スクリプトエディタでトリガーを開く
    左側のメニューから「トリガー」アイコン(時計のマーク)をクリックします。
  2. 新しいトリガーを追加する
    右下の「トリガーを追加」をクリックします。
  3. トリガーの種類を選択する
    「イベントの種類」で「編集時」を選択すると、シートが編集されるたびにスクリプトが実行されます。時間主導型も選べます。
  4. 実行する関数を選択する
    「実行する関数」に先ほど作成した関数名(例: setSingleCellColor)を指定します。
  5. 保存する
    「保存」をクリックすると、トリガーが有効になります。編集トリガーの場合は、シートを編集するたびに関数が実行されます。

setBackgroundを使う際の注意点とよくある誤り

色指定のフォーマットに注意する

setBackgroundに渡す色は、カラーコード(#RRGGBB形式)またはCSSの色名(“red”, “green”など)が使えます。カラーコードは必ず#で始まり、6桁の16進数である必要があります。色名は小文字で指定しても大丈夫ですが、スペルミスに注意してください。間違った色名を指定するとエラーにはならず、色が設定されないことがあります。

setBackgroundとsetBackgroundsの使い分け

setBackgroundは範囲全体に同じ色を設定します。範囲内のセルごとに異なる色を設定したい場合は、setBackgroundsメソッドを使います。setBackgroundsには二次元配列を渡し、各セルの色を個別に指定します。配列のサイズは範囲の行数×列数と一致させる必要があります。一致しない場合はエラーになります。

条件付き書式との優先順位

Apps Scriptで設定した背景色は、手動で設定した書式と同じ扱いになります。そのため、後から条件付き書式ルールが適用されると、条件付き書式の色が優先されて上書きされることがあります。両方を併用する場合は、スクリプトの実行タイミングや条件付き書式のルールの優先順位に注意してください。

実行時間制限に注意する

Apps Scriptには1回の実行で6分間という制限があります。大量のセルに対してループで色を設定する場合は、6分を超えないように処理を設計する必要があります。setBackgroundsで一括設定するなどの工夫をすると、実行時間を短縮できます。

まとめ

この記事では、Apps ScriptのsetBackgroundメソッドを使ってセルの背景色を条件付きで変更する方法を解説しました。基本的な使い方から条件分岐、トリガーによる自動化までを理解できたはずです。次は、実際の業務で使える応用例として、在庫管理シートで在庫数に応じて色を変えたり、タスク管理シートで期限に応じて色を変えるなど、さまざまな場面で活用してみてください。また、setFontColorで文字色を同時に変更するなど、他のメソッドと組み合わせるとさらに表現の幅が広がります。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。