【コードの解説付き】GASでシート間のデータを簡単に比較する方法

スプレッドシート

在庫管理を効率化するには、スプレッドシートを活用する方法が便利です。

本記事では、Google Apps Script(以下、GAS)を使用して、スプレッドシートの2つ以上のシートを比較し、共通項目や非共通項目を効率的に処理する方法を解説します。

実際のシートに合わせて、コードを編集する箇所も記載しているのでぜひ試してみてください!

GAS剤師
GAS剤師

比較対象を組み合わせることで様々なリストを簡単に作成できます


この記事で解決できること

2つ以上のシートを比較して、共通する(しない)データを簡単に抽出

  • 共通する項目を抽出
  • 共通しない項目を抽出

事前準備

  1. Googleスプレッドシートを用意
    • シート1(例:在庫リストA)
    • シート2(例:在庫リストB)
    • シート3(例:在庫リストC)※結果出力シート
      比較したいデータの見出しは(例:商品コードなど)設定してください。
  2. GASエディタを開く
    • スプレッドシートを開き、拡張機能 > Apps Scriptを選択します。
  3. スクリプトを貼り付ける
    以下のコードをそのままコピーして、GASエディタに貼り付けてください。

共通する項目を抽出

以下のコードを貼り付けてください

function copyCommonItemsToSheetC() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetA = ss.getSheetByName("在庫リストA");
  const sheetB = ss.getSheetByName("在庫リストB");
  const sheetC = ss.getSheetByName("在庫リストC") || ss.insertSheet("在庫リストC");
  
  if (!sheetA || !sheetB) {
    throw new Error("指定されたシートが見つかりません。");
  }

  // 見出し行を転記
  const header = sheetA.getRange(1, 1, 1, sheetA.getLastColumn()).getValues();
  sheetC.getRange(1, 1, 1, header[0].length).setValues(header);

  const dataA = sheetA.getRange(2, 1, sheetA.getLastRow() - 1 || 0, sheetA.getLastColumn() || 1).getValues();
  const dataB = sheetB.getRange(2, 1, sheetB.getLastRow() - 1 || 0, sheetB.getLastColumn() || 1).getValues();
  
  if (dataA.length === 0 || dataB.length === 0) {
    SpreadsheetApp.getUi().alert("どちらかのシートにデータが存在しません。");
    return;
  }

  const commonItems = dataA.filter(rowA => dataB.some(rowB => rowA[0] === rowB[0]));
  
  if (commonItems.length > 0) {
    sheetC.getRange(2, 1, commonItems.length, commonItems[0].length).setValues(commonItems);
    SpreadsheetApp.getUi().alert("共通項目が「在庫リストC」に転記されました。");
  } else {
    SpreadsheetApp.getUi().alert("共通するアイテムはありませんでした。");
  }
}

コードのイメージ説明です

  • 対象シート取得: 「在庫A」「在庫B」「在庫C」を取得し、Cがなければ新規作成。
  • 見出しコピー: 「在庫A」の見出し行を「在庫C」にコピー。
  • データ取得: AとBのシートからデータ部分(2行目以降)を取得。
  • 共通項目抽出: AとBのデータで1列目(IDや商品名)が一致する行を抽出。
  • 共通項目転記: 共通項目を「在庫C」の2行目以降に転記。
  • 結果通知: 共通項目があれば成功メッセージ、なければ「共通項目なし」と通知。

共通しない項目を抽出

以下のコードを貼り付けてください

function copyUniqueItemsToSheetC() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetA = ss.getSheetByName("在庫リストA");
  const sheetB = ss.getSheetByName("在庫リストB");
  const sheetC = ss.getSheetByName("在庫リストC") || ss.insertSheet("在庫リストC");
  
  if (!sheetA || !sheetB) {
    throw new Error("指定されたシートが見つかりません。");
  }

  // 見出し行を転記
  const header = sheetA.getRange(1, 1, 1, sheetA.getLastColumn()).getValues();
  sheetC.getRange(1, 1, 1, header[0].length).setValues(header);

  const dataA = sheetA.getRange(2, 1, sheetA.getLastRow() - 1 || 0, sheetA.getLastColumn() || 1).getValues();
  const dataB = sheetB.getRange(2, 1, sheetB.getLastRow() - 1 || 0, sheetB.getLastColumn() || 1).getValues();
  
  if (dataA.length === 0 || dataB.length === 0) {
    SpreadsheetApp.getUi().alert("どちらかのシートにデータが存在しません。");
    return;
  }

  // シートAにのみ存在する項目を抽出
  const uniqueToA = dataA.filter(rowA => !dataB.some(rowB => rowA[0] === rowB[0]));

  // シートBにのみ存在する項目を抽出
  const uniqueToB = dataB.filter(rowB => !dataA.some(rowA => rowA[0] === rowB[0]));
  
  // 両方のシートに共通しない項目をまとめる
  const uniqueItems = uniqueToA.concat(uniqueToB);
  
  if (uniqueItems.length > 0) {
    sheetC.getRange(2, 1, uniqueItems.length, uniqueItems[0].length).setValues(uniqueItems);
    SpreadsheetApp.getUi().alert("共通しないアイテムが「在庫リストC」に転記されました。");
  } else {
    SpreadsheetApp.getUi().alert("非共通項目なし。");
  }
}

コードのイメージ説明です

  • 対象シート取得: 「在庫A」「在庫B」「在庫C」を取得し、Cがなければ新規作成。
  • 見出しコピー: 「在庫A」の見出し行を「在庫C」にコピー。
  • データ取得: AとBのシートからデータ部分(2行目以降)を取得。
  • 非共通項目抽出: AとBのデータで1列目(IDや商品名)が不一致な行を抽出。
  • 非共通項目転記: 在庫Aの非共通項目を「在庫C」の2行目以降に転記。
  • 結果通知: 非共通項目があれば成功メッセージ、なければ「非共通項目なし」と通知。

コードを応用するための補足

コードを編集することでいろいろな表に応用できます

シート名を変更したい:会社規定でシート名が変更できない場合
比較する行を変更したい:比較する行がシートごとに異なる場合

実際の編集方法は以下のサイトで解説してますので必要であれば是非見てください

実行方法

コードの転記が終わったら実際に実行して結果がうまく出るか確認します

  1. GASエディタで「実行」ボタンを押します。
  2. 初回実行時に「このアプリは確認されていません」という警告が表示されたら、「詳細」→「安全でないページに移動」を選択します。
  3. 実行したい関数(例:copyAndHighlightCommonItems)を選んで実行します。

まとめ

この記事では、GASを使ってスプレッドシート間で在庫データを比較し、共通項目や非共通項目を効率的に処理する方法を紹介しました。

応用するための編集ポイントも解説していますので、必要に応じてカスタマイズしてみてください。

在庫管理の手間を減らし、正確なデータ管理を実現しましょう!

タイトルとURLをコピーしました