複数シート間のデータ同期をGASで実装

GASスプレッドシートデータ管理
複数シート間のデータ同期をGASで実装のサムネイル

複数シート間のデータ同期をGASで実装

こんにちは、GASおじです。今回は「複数シートのデータを同期したい!」という中小企業の経営者やフリーランスの方に向けて、Google Apps Script(以下GAS)での安全かつ効率的な同期方法を解説するぞ。

複数のシート間でデータを同期する時、既存のデータを消して上書きする方法は便利だけど、誤って大事な情報を消してしまうリスクがある。おじさんはSaaSの課金に厳しいけど、Googleアカウントの利用枠内で追加料金なしで使えるGASはコストパフォーマンス抜群。しかも今回紹介する方法は批量書き込みや入力検証、バックアップまで含めて安心設計だ。


初期設定と必要権限

まず、スクリプトを実行するための初期設定と権限を確認しよう。今回のスクリプトは以下の権限が必要になる。

  • スプレッドシートの閲覧・編集権限
  • スプレッドシートの作成権限(新規日時付きシートを作成するため)

GASエディタ上で初回実行時に認可ダイアログが出るので、指示に従って許可を与えてほしい。個人情報の取り扱いについても、同期するデータに個人情報が含まれる場合はGoogleのポリシーに則り適切に管理すること。


データ同期の基本方針

今回のコードは、既存のシートのデータを直接消したり上書きしたりしない。代わりに「同期結果を新しく日時付きのシートに書き出す」方式を採用する。これにより元データはそのまま残り、もし失敗しても元に戻せる。復元手順は単に元のシートを使い続ければOKだ。

さらに、同期処理前にソースシートのデータをバックアップとして別シートにコピーし、何かあった時にスクリプトで復元できる仕組みも盛り込んだ。


実装例:複数シートの同期処理

以下は、メインシート(sourceSheet)から複数のターゲットシート(targetSheets)へデータを同期し、結果は新規の日時付きシートに書き出すコード例だ。バッチ書き込みを使って高速化し、入力検証も簡単に行う。

function syncSheets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheetName = '元データ'; // 元データシート名
  const targetSheetNames = ['営業', '在庫', '経理']; // 同期先シート名リスト(例)

  const sourceSheet = ss.getSheetByName(sourceSheetName);
  if (!sourceSheet) {
    Logger.log(`元データシート「${sourceSheetName}」が存在しません。`);
    return;
  }

  // バックアップ用の新規シート作成(日時付き)
  const backupSheetName = `backup_${new Date().toISOString().slice(0,19).replace(/[:T]/g, '-')}`;
  const backupSheet = ss.insertSheet(backupSheetName);
  const sourceData = sourceSheet.getDataRange().getValues();

  // バックアップに元データコピー
  backupSheet.getRange(1, 1, sourceData.length, sourceData[0].length).setValues(sourceData);

  // 入力検証例:第一列が空白の場合は同期処理をスキップ
  const validData = sourceData.filter(row => row[0] !== '' && row[0] != null);
  if (validData.length === 0) {
    Logger.log('有効なデータがありません。処理を中断します。');
    return;
  }

  // 各ターゲットシートに同期結果を新規シートとして出力
  targetSheetNames.forEach(targetName => {
    const newSheetName = `${targetName}_sync_${new Date().toISOString().slice(0,19).replace(/[:T]/g, '-')}`;
    const newSheet = ss.insertSheet(newSheetName);

    // ここで必要に応じてtargetNameごとのデータ加工ができる
    // 今回は元データの有効行のみをそのまま書き込む例
    newSheet.getRange(1, 1, validData.length, validData[0].length).setValues(validData);
  });

  Logger.log('同期処理が完了しました。');
}

installable trigger設定と復元手順

この同期処理はGASのinstallable trigger(時間主導型トリガー)で定期実行するのがおすすめだ。トリガー設定は以下の手順で行う。

  1. GASエディタの「時計」アイコンから「トリガー」を開く
  2. 「トリガーを追加」ボタンを押す
  3. 関数名に syncSheets を選択
  4. 実行のタイミングを「時間主導型」→「日付ベースのタイマー」や「分ベースのタイマー」から適宜選択
  5. 保存して完了

もし同期結果に問題があった場合は、バックアップシートのデータをコピーし、元のシートに貼り戻すことで復元できる。手動での復元だけでなく、別途復元用スクリプトを作ってもいいだろう。


コスト削減の目安と注意点

今回の方法で、外部SaaSを使った同期ツールを導入しなくても、Googleアカウントの利用枠内で追加の専用SaaS料金なしに自動同期できる。仮に外部サービスの月額費用が1万円だとすると、年間12万円のコスト削減になる計算だ。

年間コスト削減 = 月額SaaS料金 × 12ヶ月
               = 10,000円 × 12
               = 120,000円

ただし、Apps Scriptには1日の実行時間やAPI呼び出し回数などのquota制限がある。大量データや高頻度実行はこれらに抵触する恐れがあるので注意しよう。


まとめ

  • 既存データを消さずに新規シートへ同期結果を出力することで安全性アップ
  • バックアップシートを作成し、復元可能な仕組みを用意
  • installable triggerで定期自動実行が可能
  • Googleアカウントの利用枠内で追加料金なし(quota制限あり)
  • 中小企業やフリーランスのコスト削減に役立つ

GASは使いこなせば、手間もコストも大幅に削減できる強力なツールだ。ぜひ今回のサンプルを元に、自社やクライアントのスプレッドシート運用を効率化してほしい。


GASおじラボで500ツール使い放題 →