複数シートの同期ずれを上書き前に発見|GASで注文データをdry-run監査

複数シートの同期ずれを上書き前に発見|GASで注文データをdry-run監査

ツールおじ|GoogleアカウントをAIエージェント化

ツールおじ|GoogleアカウントをAIエージェント化

注文一覧と発送一覧を別シートで管理していると、同じ注文IDなのに数量や状態が違うことがあります。いきなり同期すると正しい値まで上書きしかねません。この記事では、セルを変更せずに、追加候補・更新候補・確認が必要な行だけを洗い出す無料GAS例を紹介します。

このコードで確認すること

  • `注文一覧` と `発送一覧` の注文IDを照合します。
  • 同期先にない注文は追加候補、値が異なる注文は更新候補として数えます。
  • 空欄・重複・不正な数量があれば停止します。
  • 初期値は `DRY_RUN = true` で、セルの追加・更新・削除は行いません。

準備するシート

両方のシートを、A列「注文ID」、B列「商品コード」、C列「数量」、D列「状態」にします。1行目は見出し、2行目以降には必ずテスト用データを入れてください。

コピーして使える最小コード

const DRY_RUN = true;
const SOURCE_SHEET = '注文一覧';
const TARGET_SHEET = '発送一覧';
const MAX_ROWS = 200;

function auditMultiSheetSyncPlanFree() {
  const book = SpreadsheetApp.getActiveSpreadsheet();
  const source = book.getSheetByName(SOURCE_SHEET);
  const target = book.getSheetByName(TARGET_SHEET);
  if (!source || !target) throw new Error('注文一覧または発送一覧が見つかりません');

  const sourceRows = readRows_(source);
  const targetRows = readRows_(target);
  const sourceMap = indexRows_(sourceRows, SOURCE_SHEET);
  const targetMap = indexRows_(targetRows, TARGET_SHEET);
  const additions = [];
  const updates = [];

  sourceMap.forEach((row, orderId) => {
    const current = targetMap.get(orderId);
    if (!current) {
      additions.push({ orderId, sourceRow: row.rowNumber });
      return;
    }
    const changed = ['productCode', 'quantity', 'status']
      .filter(key => row[key] !== current[key]);
    if (changed.length) {
      updates.push({ orderId, sourceRow: row.rowNumber,
        targetRow: current.rowNumber, changedFields: changed });
    }
  });

  const result = {
    dryRun: DRY_RUN,
    sourceCount: sourceRows.length,
    targetCount: targetRows.length,
    additionCount: additions.length,
    updateCount: updates.length,
    additions,
    updates
  };
  console.log(JSON.stringify(result));
  if (DRY_RUN !== true) throw new Error('この無料例は監査専用です');
}

function readRows_(sheet) {
  const count = sheet.getLastRow() - 1;
  if (count < 1) throw new Error(sheet.getName() + 'に確認行がありません');
  if (count > MAX_ROWS) throw new Error(sheet.getName() + 'が200行を超えています');
  return sheet.getRange(2, 1, count, 4).getDisplayValues().map((r, i) => ({
    rowNumber: i + 2,
    orderId: String(r[0] || '').trim(),
    productCode: String(r[1] || '').trim(),
    quantity: String(r[2] || '').trim(),
    status: String(r[3] || '').trim()
  }));
}

function indexRows_(rows, sheetName) {
  const map = new Map();
  rows.forEach(row => {
    if (!row.orderId || !row.productCode || !row.quantity || !row.status) {
      throw new Error(sheetName + 'の' + row.rowNumber + '行目に空欄があります');
    }
    if (!/^\d+$/.test(row.quantity) || Number(row.quantity) < 1) {
      throw new Error(sheetName + 'の' + row.rowNumber + '行目の数量が不正です');
    }
    if (map.has(row.orderId)) throw new Error(sheetName + 'で注文IDが重複しています');
    map.set(row.orderId, row);
  });
  return map;
}

実行手順

1. 元データをコピーした検証用スプレッドシートを用意します。

2. `注文一覧` と `発送一覧` に2〜3行のテストデータを入れます。

3. Apps Scriptへコードを貼り付けます。

4. `DRY_RUN = true` のまま `auditMultiSheetSyncPlanFree` を実行します。

5. ログの追加候補・更新候補を、行番号と注文IDで元シートへ照合します。

6. 空欄や重複を修正して再実行し、意図した差分だけになることを確認します。

失敗しやすい点と停止条件

  • この例は差分の確認専用で、同期処理は含みません。
  • 200行超、空欄、注文ID重複、数量不正では停止します。
  • ログへ購入者名、住所、メールアドレスは出しません。
  • 状態名の業務ルールや、どちらのシートを正とするかは自動判定しません。
  • 実データへ適用する場合は権限、実行時間、バックアップも別途確認してください。

公開前チェックリスト

  • 元データではなくコピー環境を使った
  • `DRY_RUN = true` を確認した
  • 追加候補と更新候補を行番号で照合した
  • 個人情報がログへ出ていない
  • 上書き・削除処理が含まれていない

まとめ

複数シートの同期は、先に差分を見える化すると上書き事故を減らせます。まずは元データを変更しないdry-runで、追加と更新の候補だけを確認してください。

個人販売の注文・発送管理GAS Proを見る

GasおじのTips商品一覧を見る

※学習・検証用の例です。実データへ適用する前にコピー環境で確認してください。Google公式・Google公認の商品ではありません。


あなたも記事の投稿・販売を
始めてみませんか?

Tipsなら簡単に記事を販売できます!
登録無料で始められます!

Tipsなら、無料ですぐに記事の販売をはじめることができます Tipsの詳細はこちら
 

この記事のライター

ツールおじ|GoogleアカウントをAIエージェント化

おう、Gasおじだ。 AIツールとSaaSに散々突っ込んで遠回りした結果、最後に強かったのは「今あるGoogleアカウント」だった。 今ではAIエージェントであらゆるタスクを自動化して無双してるぞ。 GAS、スプレッドシート、フォーム、Gmail、AIエージェントを組み合わせれば、個人でも小さな会社でも、手作業だらけの業務はかなり自動化できる。 ここでは机上のAI論じゃなく、現場で動くテンプレ、コード、手順だけを置いていくぞ。 高いツールを増やす前に、まずお前さんのGoogleアカウントを仕事するエージェントに変えようじゃないか。

このライターが書いた他の記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    2 %獲得
    (59 円相当)
  • 毎朝のToDoを区分・優先度・期限つきでまとめる Morning ToDo Mail Pro

    ¥2,980
    2 %獲得
    (59 円相当)
  • Googleフォームの採点ミスを回答公開前に発見|GASで正解キーをdry-run監査

関連のおすすめ記事

  • USBメモリで持ち運べるLinux Mint 22.1と永続的な書き込み領域の作成法【Rufus だけで作成する方法を初心者向けに徹底解説】

    ¥500
    2 %獲得
    (10 円相当)
    SmartSenior

    SmartSenior

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    2 %獲得
    (59 円相当)
    ツールおじ|GoogleアカウントをAIエージェント化

    ツールおじ|GoogleアカウントをAIエージェント化

  • 毎朝のToDoを区分・優先度・期限つきでまとめる Morning ToDo Mail Pro

    ¥2,980
    2 %獲得
    (59 円相当)
    ツールおじ|GoogleアカウントをAIエージェント化

    ツールおじ|GoogleアカウントをAIエージェント化