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

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

記事
IT・テクノロジー

■ 複数シート間のデータ同期を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(時間主導型トリガー)で定期実行するのがおすすめだ。トリガー設定は以下の手順で行う。

・GASエディタの「時計」アイコンから「トリガー」を開く
・「トリガーを追加」ボタンを押す
・関数名に syncSheets を選択
・実行のタイミングを「時間主導型」→「日付ベースのタイマー」や「分ベースのタイマー」から適宜選択
・保存して完了
もし同期結果に問題があった場合は、バックアップシートのデータをコピーし、元のシートに貼り戻すことで復元できる。手動での復元だけでなく、別途復元用スクリプトを作ってもいいだろう。


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

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

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

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


□ まとめ

・既存データを消さずに新規シートへ同期結果を出力することで安全性アップ
・バックアップシートを作成し、復元可能な仕組みを用意
・installable triggerで定期自動実行が可能
・Googleアカウントの利用枠内で追加料金なし(quota制限あり)
・中小企業やフリーランスのコスト削減に役立つ
GASは使いこなせば、手間もコストも大幅に削減できる強力なツールだ。ぜひ今回のサンプルを元に、自社やクライアントのスプレッドシート運用を効率化してほしい。

■ GASの相談や導入サポートを見たい方へ

この記事と近い作業をGoogleシートやGASで整えたい方は、Gasおじのココナラ出品一覧もご覧ください。

■ 関連サービス

GASおじのココナラ出品一覧
日々の記録、確認、通知、投稿準備などを、GoogleスプレッドシートとGASで無理なく自動化する相談ができます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す