A列の連続した同じ値をグループとして色分けします。
先頭行は見出しとして除き、元シートをコピーしてからコピーのA列だけを変更します。
最終確認は2026年10月2日です。
ローカルの模擬検証を行いましたが、Googleへの認可・実シートへの反映・Driveの実ファイル列挙・Webアプリの配備は未検証です。
練習用の入力と設定
ZIPを展開し、使う記事のarticle-22939.jsだけをApps Scriptへ保存します。
同名の関数を含むため、別の記事のコードを同じプロジェクトへ混ぜないでください。
| 設定名 | 設定する値 |
|---|---|
| SPREADSHEET_ID | 新しく作った練習用スプレッドシートのID |
| SHEET_NAME | 入力したシートの名前 |
プロジェクトの設定でスクリプトプロパティを入力します。
まず新規の練習データを使い、要求される認可範囲と操作内容を確認してください。
入力例と実行する関数
A、A、空欄、B、Aを入力し、連続するAは青、空欄は背景なし、Bはベージュ、最後のAは緑の配列になります。
実シートではA1を見出しにし、A2以降へ同じ例を入力してcopyColoredSheetを実行します。
// このコードは記事ごとに別のApps Scriptプロジェクトへ保存します。
function required_(key) {
const value=PropertiesService.getScriptProperties().getProperty(key);
if (!value) throw new Error(key+'を設定してください');
return value;
}
function safeCell_(value) {
const s=String(value);
return /^[=+@-]/.test(s) ? "'"+s : s;
}
function escapeHtml_(value) {
return String(value).replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
}
function https_(value) {
const s=String(value).trim();
if (!/^https:\/\/[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?(?::443)?(?:[/?#][^\s<>"'\\]*)?$/i.test(s)) throw new Error('HTTPS URLを確認してください');
return s;
}
function sourceSheet_() {
const sheet=SpreadsheetApp.openById(required_('SPREADSHEET_ID')).getSheetByName(required_('SHEET_NAME'));
if (!sheet) throw new Error('対象シートがありません');
return sheet;
}
function groupColors_(values) {
const palette=['#f0f8ff','#f5f5dc','#f0fff0'];
let previous=null,index=-1;
return values.map(row=>{
const v=row[0];
if(v==='') {previous=null;return [null];}
const key=v instanceof Date ? 'date:'+v.getTime() : typeof v+':'+String(v);
if(key!==previous) index++;
previous=key;return [palette[index%palette.length]];
});
}
function demoGroups(){return groupColors_([['A'],['A'],[''],['B'],['A']]);}
function copyColoredSheet() {
const sheet=sourceSheet_(),last=sheet.getLastRow();
if(last<2) throw new Error('見出し以外にデータがありません');
if(last>1001) throw new Error('練習対象は1000行以内にしてください');
const values=sheet.getRange(2,1,last-1,1).getValues(),colors=groupColors_(values);
const ss=sheet.getParent(),copy=sheet.copyTo(ss);
copy.setName('色分け練習_'+Utilities.getUuid().replace(/-/g,''));
copy.getRange(2,1,colors.length,1).setBackgrounds(colors);
return copy.getName();
}
確認結果と切り分け
| 条件 | 結果 |
|---|---|
| 見出し・同じ値 | 見出しを除外。同じ値が連続する間は同色 |
| 空欄・型・日付 | 空欄で区切る。数値1と文字1を区別。同時刻の日付は同グループ |
| 書込先 | コピーだけを変更。元シートの背景色は変更しない |
Node.jsの模擬検証は5記事合計69ケースです。
純粋関数の結果と、模擬のGoogleオブジェクトで対象選択・書込先・失敗時停止を確認した範囲であり、実サービスの成功を示すものではありません。
条件付き書式がコピーに残っていると、直接設定した背景色が見えない場合があります。
まず条件付き書式のない練習表で試し、既存の規則を変更する前に内容を確認します。
この例はA列だけを色分けし、行全体の着色は行いません。
コピーは数式や参照も含むため、独立した値だけの練習表から始めてください。
停止と戻し方
この例は定期トリガーを作成しません。
既存トリガーから呼ぶ変更を加える場合は、まず手動の1回を確認し、停止時にはそのトリガーを止めます。
元シートはそのまま残ります。
失敗したコピーや着色結果を完成扱いにせず、戻す際は元シートを参照してください。
コピーを取り除く操作はコードに含めていません。
公式資料
Driveフォルダの取得と列挙、シート範囲への反映、HTMLへの出力とエスケープ、Apps Scriptの利用上限を参照してください。
関連記事・旧実装の参考資料
従来のコードや外部の参考例は、本稿の練習ZIPと内容が異なる場合があります。
今回のコードは記事ごとに別のプロジェクトへ保存してください。


よくある質問:GASで連続データを色分けするときのチェックリスト
このスクリプトは、何をしますか?
A列の連続した同じ値をグループとして、色分けします。先頭行は見出しとして除き、元シートをコピーしてから、コピーのA列だけを変更します。
どんな色になりますか?
記事の例では、A、A、空欄、B、Aを入力すると、連続するAは青、空欄は背景なし、Bはベージュ、最後のAは緑になります。
空欄や、数値と文字は、どう扱われますか?
空欄・型・日付で区切ります。数値の1と、文字の1は区別します。同時刻の日付は、同グループとして扱います。
元のシートは、変わりますか?
変わりません。書き込み先は、コピーだけを変更します。元シートの背景色は変更しません。
色が見えないときは、どうしますか?
条件付き書式がコピーに残っていると、直接設定した背景色が見えない場合があります。まず条件付き書式のない練習表で試し、既存の規則を変更する前に、内容を確認します。
行全体も、色分けされますか?
されません。この例は、A列だけを色分けし、行全体の着色は行いません。
この記事のコードは、動作確認済みですか?
ローカルの模擬検証を行いましたが、Googleへの認可・実シートへの反映・Driveの実ファイル列挙・Webアプリの配備は、未検証です。最初は、新規の練習データで試してください。
