GASで離れた複数範囲を
一括操作する方法
飛び飛びのセルに同じ色や値をまとめて設定したいとき、getRangeList(離れた複数範囲を1つにまとめて扱う機能)を使うと、範囲ごとにgetRangeを呼ばずに1回で書けます。動くコードで解説します。
Table of Contents
getRangeListとは何か
getRangeは1つの連続した範囲しか扱えません。一方getRangeListは、A1記法(「A2:A5」のようなセル番地の書き方)の配列を渡すと、 離れた複数の範囲をまとめて1つのRangeListオブジェクトとして受け取れます。RangeListへの操作は、含まれるすべての範囲へ一括で適用されます。
たとえば「A列・C列・E列の2〜5行目だけを同じ色にしたい」ような、飛び飛びのセルへ同じ処理をしたい場面で威力を発揮します。 範囲ごとにgetRangeを何度も呼ぶより読みやすく、setBackgroundやclearContentの呼び出し回数も減ります。
できること
書式の一括設定
背景色・文字色・太字・罫線などを複数範囲へまとめて適用
できること
値のクリア・入力
clearContentで一括クリア、setValueで同じ値を一括入力
注意点
setValuesは無い
範囲ごとに違う配列を入れるときはgetRangesで個別処理
基本:複数範囲に一括で書式を設定する
まずは基本形です。sheet.getRangeList([...])にA1記法の配列を渡し、返ってきたRangeListへsetBackgroundなどを呼ぶだけです。1回の呼び出しで、指定した3つの範囲すべてが同じ書式になります。
function highlightRangeList() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 離れた3つの範囲をまとめて1つの RangeList として取得する
const rangeList = sheet.getRangeList(["A2:A5", "C2:C5", "E2:E5"]);
// RangeList への操作は、含まれるすべての範囲に一括で適用される
rangeList.setBackground("#FFF3C4"); // 3範囲すべてを同じ色で塗る
rangeList.setFontWeight("bold");
}RangeListにはsetFontColor・setFontWeight・setBorder・setNumberFormatなど、Rangeでおなじみの書式系メソッドが一通り用意されています。単一範囲への書式設定の詳細は背景色・文字色・罫線を設定する方法も参考にしてください。
setValueで同じ値を一括入力する
RangeListのsetValueは、含まれるすべての範囲に「同じ1つの値」を入れます。飛び飛びのセルへ一律で 「済」「対象外」などのフラグを立てたいときに便利です。
function markAsChecked() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 確認済みにしたいセルが飛び飛びにあるケース
const rangeList = sheet.getRangeList(["F2", "F5", "F9", "F14"]);
// setValue は「すべての範囲に同じ1つの値」を入れる
rangeList.setValue("済");
// 注意: 範囲ごとに違う値を入れる setValues は RangeList には無い
}ここで重要なのは、RangeListには二次元配列を範囲ごとに流し込むsetValuesが無いことです。あるのは「全範囲に同じ値」のsetValueだけです。範囲ごとに異なる値を入れたい場合は、次の05で紹介するgetRanges()で個別のRangeに分けて処理します。
clearContentで入力欄だけ一括クリアする
テンプレート化した入力シートでよくあるのが、「枠線や色は残したまま、入力値だけをリセットしたい」場面です。 入力欄が数ブロックに分かれていても、getRangeListでまとめて指定しclearContentを呼べば一発です。
function resetInputForm() {
const sheet = SpreadsheetApp.getSheetByName("入力フォーム");
if (!sheet) return;
// 入力欄だけをまとめて指定(見出しや枠線は触らない)
const inputs = sheet.getRangeList([
"B3:B8", // 基本情報
"B11:B14", // 連絡先
"D3:D8", // 補足
]);
// clearContent は値だけ消して、背景色・罫線などの書式は残す
inputs.clearContent();
// まっさらに戻したいときは clear()、書式だけ消すなら clearFormat()
}clearContent・clearFormat・clearの使い分け
clearContentは値だけ、clearFormatは書式だけ、clearは値・書式・入力規則をすべて消します。入力フォームのリセットはclearContent、 書式を初期化したいときはclearFormat、と目的で選びましょう。
getRangesで範囲ごとに個別処理する
範囲ごとに違う値や書式を入れたいときは、getRanges()で個々のRangeを配列として取り出します。あとは通常のRangeなので、setValuesで二次元配列を流し込めます。
function fillEachColumnDifferently() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const rangeList = sheet.getRangeList(["A2:A6", "B2:B6", "C2:C6"]);
// getRanges() で個々の Range を配列で取り出せる
const ranges = rangeList.getRanges();
const columnValues = [
[["未着手"], ["未着手"], ["未着手"], ["未着手"], ["未着手"]], // A列
[["-"], ["-"], ["-"], ["-"], ["-"]], // B列
[[0], [0], [0], [0], [0]], // C列
];
// 範囲ごとに違う二次元配列を流し込むときは setValues を各 Range に使う
ranges.forEach((range, i) => {
range.setValues(columnValues[i]);
});
}「一括でよい操作はRangeListのメソッド」「範囲ごとに変える操作はgetRangesで個別に」—— この2つを使い分けると、getRangeを何度も呼ぶ冗長なコードをすっきりまとめられます。 大量データを扱うときの一括読み書きの考え方は処理を高速化する方法も合わせて確認してください。
activateで複数セルを同時に選択する
RangeListのactivateを使うと、離れた複数のセルを同時に選択状態にできます。 「未入力の必須セルを強調して、開いた人にひと目で分からせたい」といった案内に向いています。
function selectImportantCells() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 入力が必要なセルを、開いた人にひと目で分からせたい
const required = sheet.getRangeList(["B3", "B5", "B8", "D3"]);
required.setBackground("#FDE0E0"); // 未入力っぽい薄い赤で強調
required.activate(); // 複数セルを同時に選択状態にする
}activateは「今シートを開いている人の選択位置」を動かす操作なので、カスタムメニューやボタンから実行して 「ここを入力してください」と誘導する使い方が現実的です。時間主導トリガーなど、 人が画面を見ていない実行では効果がない点に注意してください。
条件に一致するセルだけ動的に一括操作する
実務でよくあるのは「条件に合う行の特定列だけ色を付けたい」ケースです。 データを一度だけ読み込んで条件判定し、該当セルのA1記法を配列に組み立て、 最後に1回のgetRangeListでまとめて色付けします。1セルずつsetBackgroundするより高速です。
// 条件に一致する行のステータス列だけを、まとめて色付けする
function highlightOverdueRows() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const values = sheet.getDataRange().getValues();
const today = new Date();
// 1行目は見出し。C列(3列目)を期限、E列(5列目)をステータス列とする
const a1List = [];
for (let i = 1; i < values.length; i++) {
const due = values[i][2];
const status = values[i][4];
if (due instanceof Date && due < today && status !== "完了") {
// A1記法に組み立てる(行番号は i+1、E列は列5)
a1List.push("E" + (i + 1));
}
}
if (a1List.length === 0) return; // 空配列を渡すとエラーになるため必ずチェック
sheet.getRangeList(a1List).setBackground("#FFD5D5");
}ポイントは、getRangeListに空の配列を渡すとエラーになるため、 該当が0件のときは処理を抜けるチェックを必ず入れることです。 条件がもっと複雑で「見た目のルール」として持たせたい場合は、 コードではなく条件付き書式を検討する選択肢もあります。
まとめ
getRangeListは、離れた複数範囲へ同じ書式・値・クリアをまとめて適用するためのメソッドです。 一括でよい操作はRangeListのメソッドで短く書き、範囲ごとに変えたいときはgetRanges()で個別のRangeに分ける——この使い分けが基本です。 setValuesが無いこと、空配列を渡せないこと、activateは画面を見ている人向けであることの3点を押さえれば、 飛び飛びのセル操作を安全に自動化できます。
よくある質問
getRangeは1つの連続した範囲だけを扱います。getRangeListは「A2:A5」「C2:C5」のように離れた複数の範囲をまとめて1つのオブジェクト(RangeList)として扱えます。同じ書式やクリアを何箇所にも適用したいとき、範囲ごとにgetRangeを呼ぶ代わりに1回のgetRangeListで書けるので、コードが短くなり動作も安定します。
できません。RangeListにあるのはsetValue(すべての範囲に同じ1つの値を入れる)で、範囲ごとに違う二次元配列を流し込むsetValuesはありません。範囲ごとに別の値を入れたいときは、getRanges()で個々のRangeを取り出し、それぞれにsetValuesを使ってください。
clearContentは値だけを消し、背景色や罫線などの書式は残します。clearは値も書式も入力規則もすべて消します。書式(テンプレートの枠線や色)を保ったまま入力値だけリセットしたいフォーム用シートではclearContent、まっさらに戻したいときはclearを使い分けます。RangeListにはclearFormatやclearNoteもあります。
getRangeListに渡すA1記法の配列は、空でなければ複数指定できます。ただし数百・数千の範囲を1つのRangeListに詰め込むと生成に時間がかかることがあります。連続した範囲は「A2:A100」のようにまとめ、本当に離れている箇所だけを配列で列挙するのが効率的です。空の配列を渡すとエラーになる点にも注意してください。
getRangeListはシート単位のメソッドなので、1回の呼び出しで指定できるのはそのシート内の範囲だけです。複数シートにまたがって同じ操作をしたいときは、シートごとにgetRangeListを呼ぶか、getSheets()でシートを回してそれぞれに適用します。
GAS開発・業務Webシステムを
相談する。
複数範囲の一括処理以外にも、入力フォームの整備・帳票出力・スプレッドシート自動化など、日々の業務を軽くするGAS開発をご相談いただけます。