複数シートの同期ずれを上書き前に発見|GASで注文データをdry-run監査
ツールおじ|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公認の商品ではありません。
