ご訪問ありがとうございます。
Googleシートマスターのひろしです。
今回は、とっても価値の高い方法をお伝えします。

これを知ることであなたは、
- 動静表が簡単に作れてしまいます。
- 動静表に限らずマスタシートのコピーや集計する表が簡単に作成できます。
なので、サクッとマスターして

と答えてあげてください。
動画はこちら
シートはこちら
*クリックすることでシートが開きます。(コピーしてお使いください)
スクリプト
/**
* マスタシートをコピーして各シートを追加する(新規追加)
*/
function copyMasterBySettingsNew() {
const ss = SpreadsheetApp.getActive();
const setSheet = ss.getSheetByName('設定');
const master = ss.getSheetByName('マスタ');
if (!setSheet || !master) throw new Error('「設定」または「マスタ」シートが見つかりません。');
// 設定シート B2:D のデータ取得(下まで)
const lastRow = setSheet.getLastRow();
if (lastRow < 2) return; // データなし
const data = setSheet.getRange(2, 2, lastRow - 2 + 1, 3).getValues(); // B2:D
data.forEach(row => {
const [sheetName, title, fullName] = row; // B, C, D
// 空白・未設定はスキップ
if (!sheetName || String(sheetName).trim() === '') return;
// 既存同名シートがあれば削除
const old = ss.getSheetByName(String(sheetName));
if (old) ss.deleteSheet(old);
// マスタ複製 → 名前変更
const newSheet = master.copyTo(ss);
newSheet.setName(String(sheetName));
// 必要なら位置を末尾へ
ss.moveActiveSheet(ss.getSheets().length);
console.log(sheetName+" シート作成")
// H4 と I4 を設定
newSheet.getRange('H4').setValue(title || '');
newSheet.getRange('I4').setValue(fullName || '');
});
// 「マスタ」シートを2番めに
ss.setActiveSheet(master);
ss.moveActiveSheet(1);
// 「設定」シートを先頭へ
ss.setActiveSheet(setSheet);
ss.moveActiveSheet(1);
}
/**
* 集約シートに項目を追加する
*/
function copyAggregateBySettings() {
const ss = SpreadsheetApp.getActive();
const wsAgg = ss.getSheetByName('集約');
const wsSet = ss.getSheetByName('設定');
if (!wsAgg || !wsSet) throw new Error('「集約」または「設定」シートが見つかりません。');
// コピー元範囲(固定)
const srcRange = wsAgg.getRange('E2:F19');
// 設定シートのB列(B3以降)を読み込む
const startRow = 3; // B3開始
const nameCol = 2; // B列 = 2
const lastRow = wsSet.getLastRow();
if (lastRow < startRow) return; // データなし
// 貼り付け開始列(G=7)
let destCol = 7;
for (let r = startRow; r <= lastRow; r++) {
const sheetName = String(wsSet.getRange(r, nameCol).getValue()).trim();
if (!sheetName) break; // 空行で終了
// 貼り付け先(2列×18行の枠:G2:H19 → I2:J19 → K2:L19 …)
const destRange = wsAgg.getRange(2, destCol, srcRange.getNumRows(), srcRange.getNumColumns());
// 範囲コピー(書式も含めてコピーしたい場合は contentsOnly:false)
srcRange.copyTo(destRange, { contentsOnly: false });
// 左上セルにシート名を入れる(例:G2, I2, K2…)
wsAgg.getRange(2, destCol).setValue(sheetName);
// 次の枠へ(2列分右へ)
destCol += 2;
// シートの右端対策(列オーバーで終了)
if (destCol > wsAgg.getMaxColumns()) break;
}
}
/**
* シートのタブに色をつける
*/
function syncTabColorsFromSettings() {
const SETTINGS_SHEET = '設定';
const START_ROW = 2; // B2開始(動画作成時は3でした)
const NAME_COL = 2; // B列(2)
const ss = SpreadsheetApp.getActive();
const setSheet = ss.getSheetByName(SETTINGS_SHEET);
if (!setSheet) throw new Error('「設定」シートが見つかりません。');
const lastRow = setSheet.getLastRow();
if (lastRow < START_ROW) return;
// B3:B の値と背景色(#RRGGBB)をまとめて取得
const names = setSheet.getRange(START_ROW, NAME_COL, lastRow - START_ROW + 1, 1).getValues();
const bgs = setSheet.getRange(START_ROW, NAME_COL, lastRow - START_ROW + 1, 1).getBackgrounds();
for (let i = 0; i < names.length; i++) {
const name = String(names[i][0]).trim();
if (!name) break; // 空行で終了
const colorHex = String(bgs[i][0]).trim(); // 例: "#ff0000"
const target = ss.getSheetByName(name);
if (!target) continue; // 該当シート無しはスキップ
// 背景が「白」や未設定相当ならタブ色を解除、それ以外は同色を設定
if (colorHex === '' || colorHex.toLowerCase() === '#ffffff') {
target.setTabColor(null); // 解除
} else {
target.setTabColor(colorHex); // 反映
}
}
}
/**
* マスタシートをコピーして各シートを追加する(既にある場合はスルー)
*/
function copyMasterBySettings() {
const ss = SpreadsheetApp.getActive();
const setSheet = ss.getSheetByName('設定');
const master = ss.getSheetByName('マスタ');
if (!setSheet || !master) throw new Error('「設定」または「マスタ」シートが見つかりません。');
// 設定シート B2:D のデータ取得(下まで)
const lastRow = setSheet.getLastRow();
if (lastRow < 2) return; // データなし
const data = setSheet.getRange(2, 2, lastRow - 2 + 1, 3).getValues(); // B2:D
data.forEach(row => {
const [sheetName, title, fullName] = row; // B, C, D
// 空白・未設定はスキップ
if (!sheetName || String(sheetName).trim() === '') return;
// 既存同名シートがあればスキップ
if (ss.getSheetByName(String(sheetName))) return;
// マスタ複製 → 名前変更
const newSheet = master.copyTo(ss);
newSheet.setName(String(sheetName));
// 末尾に移動(アクティブ化してから移動)
ss.setActiveSheet(newSheet);
ss.moveActiveSheet(ss.getSheets().length);
console.log(sheetName+" シート作成")
// H4 と I4 を設定
newSheet.getRange('H4').setValue(title || '');
newSheet.getRange('I4').setValue(fullName || '');
});
// 「マスタ」シートを2番めに
ss.setActiveSheet(master);
ss.moveActiveSheet(1);
// 「設定」シートを先頭へ
ss.setActiveSheet(setSheet);
ss.moveActiveSheet(1);
}
※動画作成時にタブの色が正しく変更されていませんでしたが修正済みです。
const START_ROW = 2; // B2開始(動画作成時は3でした)
雑感
今回のGASはすべてCopilotで作成しました。
Copilotへのプロンプト
以下にCopilotとの実際のやり取りです。
私のイマイチ荒いプロンプトでもいい感じで読み取ってくれています。
あまりに的確な答えのため最後には自然と「ありがとう」と言ってしまします。

「マスタ」シートコピーしてシート名:「設定」シートのシート名(B2:B)H4:「設定」シートの職名(C2:C)I4:「設定」シートの氏名(D2:D)を入れるGASを作って
以下の Google Apps Script を貼り付けて実行してください。
- 「設定」シート B2:D を上から順に読み、空白行はスキップ。
- 各行について「マスタ」を複製→新シート名を B列(シート名) に設定。
- 新シートの H4 に職名(C列), I4 に氏名(D列) をセット。
- 既に同名シートがある場合は 上書き防止のため削除してから作り直します。
<<スクリプト>>
補足
- 「設定」シートの列は B=シート名, C=職名, D=氏名 を想定。
- 既存シートを残したい場合は、削除部分をコメントアウトし、
setName前に重複回避用の連番付与(例:sheetName + ' (2)')に変えてください。

GASを作って ・「集約」シートE2:F19をG2:H19にコピーする ・G2セルに「設定」シートのシート名B3を入れる 以降、「設定」シートのシート名がなくなるまで繰り返す2回め ・「集約」シートE2:F19をI2:J19にコピーする ・I2セルに「設定」シートのシート名B4を入れる
「設定」シートの B3 から下方向にシート名を読み、なくなるまで繰り返して、
「集約」シートの E2:F19 を G→I→K… と2列ずつ右へコピーし、各ブロック左上(G2、I2、K2…)に対応するシート名を入れます。
<<スクリプト>>
ポイント
- 1回目:B3 → G2:H19、
G2にシート名(B3)。 - 2回目:B4 → I2:J19、
I2にシート名(B4)。 - 以降、B列が空になるまで 2列ずつ右へ同様に処理します。
必要なら、開始セルや範囲(E2:F19 / G2)を変数化して調整できます。

「設定」シート のシート名(B列)の背景色に合わせて 該当するシート名のタグの色を変更するGASを作れる?
<<スクリプト>>
補足
- Apps Scriptでは、シートのタブ色は
Sheet#setTabColor(hex)、セル背景はRange#getBackground()/getBackgrounds()で取得できます。背景色なしはしばしば**白(#ffffff)**として返るため、上記では白を「タブ色解除」扱いにしています。 - 必要なら「解除条件」を別の色(例:
#ffffffと#000000)に拡張できます。 - 開始行や列、設定シート名は定数で変更可能です。

ありがとう。
どういたしまして!
次にやることの候補を1つだけ:
- 開始行・対象列の定数を変更した版もGASに入れておく(例:
START_ROW=3,NAME_COL=2)。
他にも「職名ごとに自動で背景色付け」「シート名の並び替え」なども作れます。必要ならどれを1つだけ作るか指示ください。
雑感
いやー、どえらい時代になりましたね。
最近は、GAS、Excelのマクロ、PythonなどほとんどCopilotに
作ってもらっています。特にPythonはほとんど自分で組んだ事がないので、
出来上がったものの内容が理解できていないので、ちょっとした
修正すらできないほどです。
このサイトで紹介したGASもほとんど一瞬でできそうで、ちょっと
複雑な気持ちです。
これからは、どうやって使っていくかが鍵ですね。
最後までご覧いただきありがとうございます。
つぎはこちら




コメント