フィルタ→コピペ→次の人 — 担当者別データの分割をワンクリックで

実際のビジネスシーンで使える自動化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で公開しています。

noteで続きを読む

GAS,自動化自動化

Posted by botw