公式資料を参照して構成した手順です。本記事の操作・コードの実行は未確認です。小さな入力例で期待結果を確かめてから利用してください。
できあがるもの
P01は変更・100→120、P02は削除候補・200→空欄、P03は追加・空欄→300です。旧版と新版は書き換わりません。
始める前に
- ブラウザ版Googleスプレッドシートの編集権限と紐付きApps Script
- コピーした検証用ファイルで実行。Apps ScriptはV8ランタイムを利用
- 「旧版」と「新版」はA列コード・B列整数単価の2列、各1000行以内
- コードは一意の文字列、出力先「差分一覧」は未使用
入力例
旧版は「コード,単価」「P01,100」「P02,200」。新版は「コード,単価」「P01,120」「P03,300」です。
手順
- 検証用ファイルに2つの表を用意します。コードの大小文字や前後空白は別コードとして扱うため、比較前に正式なコード規則をそろえてください。
- 次の完全なコードをスクリプトへ貼り付けて保存します。他の記事の同名関数があるプロジェクトには混ぜません。 /** @OnlyCurrentDoc */ function masterDiff() { const ss=SpreadsheetApp.getActive(); if(ss.getSheetByName('差分一覧')) throw Error('出力名が使用中'); function read(name) { const s=ss.getSheetByName(name); if(!s || s.getLastRow()<2 || s.getLastRow()>1000 || s.getLastColumn()!==2) throw Error('入力表を確認'); const m=new Map(); for(const [id,v] of s.getRange(2,1,s.getLastRow()-1,2).getValues()) { if(typeof id!=='string' || !id.trim() || m.has(id) || !Number.isSafeInteger(v)) throw Error('コード重複・金額型を確認'); m.set(id,v); } return m; } const a=read('旧版'), b=read('新版'), out=[['コード','区分','旧単価','新単価']]; for(const id of new Set([...a.keys(),...b.keys()])) { if(a.has(id) && b.has(id) && a.get(id)===b.get(id)) continue; out.push(["'"+id,!a.has(id)?'追加':!b.has(id)?'削除候補':'変更',a.has(id)?a.get(id):'',b.has(id)?b.get(id):'']); } ss.insertSheet('差分一覧').getRange(1,1,out.length,4).setValues(out); }
- masterDiffを手動実行して権限を確認します。差分を確認し、変更を認める担当者が旧版と新版の出典を照合する運用にします。
- 別のコピーで新版にP01をもう1行追加すると、出力前に停止するか確認します。削除候補は旧版にだけ存在する意味で、正式な廃番が確認されたわけではありません。
期待結果と照合する
P01は変更・100→120、P02は削除候補・200→空欄、P03は追加・空欄→300です。旧版と新版は書き換わりません。
まずこの入力例で確認し、件数や値が一致しているかを見ます。完了表示だけで判断せず、重複・空欄・対象外データも残っていないか確認してください。
うまくいかないとき
- 同じコードに複数単価がある階層マスターでは使えません。一意になるキーの設計が必要です。
- 小数単価は対象外です。商品名や税区分の差分もこの2列のコードでは検査しません。
止める・元に戻す
差分一覧だけを削除します。元の旧版・新版は読み取りだけで、価格を復元する作業は不要です。
公式資料・対応範囲
参照日:2026-10-17。公式資料の一般的な機能説明と、本記事固有の入力例の実行検証は別です。実務での短縮時間や効果は未計測です。