フィルタ→コピペ→次の人 — 担当者別データの分割をワンクリックで
実際のビジネスシーンで使える自動化100例をGASで実装するシリーズ「GAS自働化100本ノック」。その記念すべき5本目
その手作業、放置されていませんか?
月末、チーム全員の売上データが1枚のシートにまとまっています。
上司から「担当者ごとのデータで渡して」と言われたとき、あなたはこうしていませんか?
フィルタで「田中」に絞る → 表示された行をコピー → 新しいシートに貼り付け。次に「佐藤」でフィルタ → コピー → 貼り付け。
担当者が5人いれば5回繰り返し、10人いれば10回。
毎月これをやっていると、仕分け作業だけで30分は消えます。
でも、まー、30分だし…
このやり方に慣れてるから…
フィルタ → コピー → 貼り付け
この作業は、難しい知識がなくても誰でもできてしまうだけに、自動化するほどではない、と放置されがちです。
しかし、見方を変えれば、誰でもできるシンプルな作業だけに、DX(業務効率化)の第一歩としては、好材料とも言えます。
「今のやり方で回ってるから」に、ちょっとだけ違う風を吹かせましょう。
ワンクリックで担当者別にシート作成
GASなら、ワンクリックで、担当者ごとに自動でシートを作成して、データを振り分けることが可能です。
担当者名はデータから自動で検出するので、名簿を用意する必要はありません。人が増えても減っても、ボタン1つで分割完了です。
コード.gs
// コード.gs
/**
* アクティブシートのデータを担当者別にシート分割する
* ヘッダー行の「担当者」列を基準にグループ分けし、担当者名のシートを自動生成
*/
const SPLIT_COL_NAME = '担当者';
function splitByPerson() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ui = SpreadsheetApp.getUi();
const source = ss.getActiveSheet();
const data = source.getDataRange().getValues();
if (data.length < 2) {
ui.alert('データが2行以上必要です(1行目=ヘッダー + データ行)。');
return;
}
const header = data[0];
const colIndex = header.indexOf(SPLIT_COL_NAME);
if (colIndex === -1) {
ui.alert(
'「' + SPLIT_COL_NAME + '」列が見つかりません。\n' +
'分割したいデータがあるシートを開いてから実行してください。'
);
return;
}
const rows = data.slice(1);
const groups = {};
rows.forEach(function(row) {
const key = String(row[colIndex]).trim();
if (!key) return;
if (!groups[key]) groups[key] = [];
groups[key].push(row);
});
const keys = Object.keys(groups).sort();
if (keys.length === 0) {
ui.alert('「' + SPLIT_COL_NAME + '」列にデータがありません。');
return;
}
const sourceName = source.getName();
let sheetCount = 0;
let totalRows = 0;
keys.forEach(function(key) {
if (key === sourceName) return;
let sheet = ss.getSheetByName(key);
if (sheet) {
sheet.clear();
} else {
sheet = ss.insertSheet(key);
}
const groupRows = groups[key];
sheet.getRange(1, 1, 1, header.length).setValues([header]);
sheet.getRange(2, 1, groupRows.length, header.length).setValues(groupRows);
sheet.getRange(1, 1, 1, header.length)
.setBackground('#f3f3f3')
.setFontWeight('bold')
.setHorizontalAlignment('center');
sheetCount++;
totalRows += groupRows.length;
});
SpreadsheetApp.flush();
let msg = '分割完了。\n\n' +
'シート数: ' + sheetCount + '\n' +
'データ行数: ' + totalRows + '\n\n';
keys.forEach(function(key) {
if (key === sourceName) return;
msg += key + ': ' + groups[key].length + ' 行\n';
});
ui.alert(msg);
}
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('自動ボタン')
.addItem('担当者別にシート分割', 'splitByPerson')
.addToUi();
}使い方
① 新規または既存のスプレッドシートを用意
分割したいデータがあるスプレッドシートを開きます。
ヘッダー行に「担当者」という列名が必要です。
② 拡張機能 → Apps Script にコードを貼り付けて保存
③ スプレッドシートをリロード
メニューバーに「自動ボタン」が追加されます。
④ 分割したいデータがあるシートを開いた状態で「自動ボタン」→「担当者別にシート分割」を実行
初めて実行すると承認ダイアログが表示されます。承認手順は第1回と同じです。
⑤ 実行結果を確認
担当者ごとにシートが自動生成され、各シートにはその担当者のデータだけが入っています。処理した人数と行数がポップアップで表示されます。

来月、新しい担当者が加わっても、データに名前があればシートが自動で増えます。
ワンポイント・レッスン
insertSheet() — シートを自動で増やす
コードの中にあるこの部分を見てください。
let sheet = ss.getSheetByName(key);
if (sheet) {
sheet.clear();
} else {
sheet = ss.insertSheet(key);
}GASでは、シートの作成・取得・削除をプログラムから行えます。
-
`getSheetByName(name)` — 名前でシートを探す。見つからなければ `null` を返す
-
`insertSheet(name)` — 指定した名前で新しいシートを作成する
-
`sheet.clear()` — シートの内容をすべて消す(シート自体は残る)
ss (スプレッドシート)
├ getSheetByName('田中') → 見つかった → clear() でリセット
├ getSheetByName('佐藤') → null(ない)→ insertSheet('佐藤') で新規作成
└ getSheetByName('鈴木') → null(ない)→ insertSheet('鈴木') で新規作成`getSheetByName()` で「あるかどうか確認」→ `insertSheet()` で「なければ作る」。この組み合わせは、GASで複数のシートを自動生成するときの定番パターンです。
手作業で5人分のシートを作る代わりに、ループの中で `insertSheet()` を呼ぶだけ。人数が増えても減っても、コードは一切変わりません。
まとめ
データの中の担当者名を自動検出し、1人ずつシートを作ってデータを振り分けます。
フィルタ→コピペの繰り返し作業がワンクリックで完了。
担当者が増減してもコード変更は不要で、毎月の仕分け作業がまるごと消えます。
「担当者」以外の項目でも分割したい
分割する項目(列)を固定ではなく、自由に選べたら更に便利ですね。
日付別、商品別、部署別…
拡張コードでこれを実現しましょう。
拡張コードでできること
① 設定シートで分割列を指定することで、項目を自由に変更できます。
② 出力先フォルダを指定することで、独立したファイルで指定のフォルダに保存します。
③ フォルダに保存されたファイルを一括削除できます。
この記事の続きはnoteで公開しています。
