2022/06/10に更新

【GASで時短】2つのシートの差分をチェックする

スプレッドシート業務改善

2つのシートを比較して、値や数式に差分があるかどうか教えてくれるGoogle Apps Scriptです。スプレッドシートでもdiffがしたい!という時にどうぞ。

こんな悩みを解決します


  • 2つのシートの差分をチェックしたくなった!けど目で見るのは辛い
  • diffコマンドみたいなのがスプレッドシートにもあればいいのになー

用意するもの


特にありません。今お使いのスプレッドシートに組み込めます。

このスクリプトで出来ること


  • 指定した2つのシートの値と数式を比較し、差分があったセルに色を付けることができます。
  • 比較したいシートはダイアログボックスで指定できます。
  • 別のスプレッドシートを指定することは(このアプリでは)できません。シートのコピーなどで対応いただければと思います。

使い方


1.スクリプトの実行

上のメニューにある「スクリプト実行」から「2つのシートの差分をチェックする」を実行します。

比較したいシート名を聞かれます。まずは1つ目のシート名を入力してください。

続いて2つ目のシート名を聞かれます。
このアプリでは差分が見つかったセルを黄色にします。色がつくのは2つ目のシートです。

2.結果の確認

シートのサイズによりますが、しばらく待つと「(シート名1)と(シート名2)を比較した結果、N個のセルで差分が見つかりました!」という完了メッセージが表示されます。

2つ目に指定したシートを見てみましょう。4つのセルが黄色くなっています。
E列は算数の得点が変わったことで、合計と平均も差分が出ているようです。
D10セルは1つ目のシートではSUM()関数を使っていましたが、シート2は1セルずつ足すという数式に変えてありました。
数値は変化ありませんが、数式の差分も拾えているようです。

もし2シート間で差分がない場合は「(シート名1)と(シート名2)を比較した結果、差分は見つかりませんでした!」というメッセージが表示されます。

また、もし比較対象として指定したシートがカラの場合は、「比較対象のシートにデータが入っていないようです。比較処理を中止します」というメッセージを表示し、何もせずスクリプトを終了します。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00101/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('2つのシートの差分をチェックする', 'check_diff');

  // メニューを画面に追加する
  menu.addToUi();
}

function check_diff() {

  // プロンプトを表示するためにUIを取得
  const ui = SpreadsheetApp.getUi();

  // 開いているスプレッドシートオブジェクトを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // 比較対象のシート名を2つ入力してもらう。キャンセルが押されたらスクリプトを終了する。
  const response1 = ui.prompt('比較したい1つ目のシート名を入力してください', ui.ButtonSet.OK_CANCEL);
  if (response1.getSelectedButton == ui.Button.CANCEL) {
    return;
  }

  const response2 = ui.prompt('比較したい2つ目のシート名を入力してください', ui.ButtonSet.OK_CANCEL);
  if (response2.getSelectedButton == ui.Button.CANCEL) {
    return;
  }

  // 入力されたシート名を元に、シートオブジェクトを取得する
  const sheet1 = ss.getSheetByName(response1.getResponseText());
  const sheet2 = ss.getSheetByName(response2.getResponseText());

  // 比較したいシートが空の場合は、処理せず中止する
  if (sheet1.getLastRow() == 0 || sheet2.getLastRow() == 0) {
    ui.alert('比較対象のシートにデータが入っていないようです。比較処理を中止します。');
    return;
  }

  // 各シートの使用されている部分の範囲オブジェクトを取得する
  let range1 = sheet1.getRange(1, 1, sheet1.getLastRow(), sheet1.getLastColumn());
  let range2 = sheet2.getRange(1, 1, sheet2.getLastRow(), sheet2.getLastColumn());

  // 範囲内のセルの値を取得する
  const values1 = range1.getValues();
  const values2 = range2.getValues();

  // 範囲内のセルに入っている数式を取得する
  const formulas1 = range1.getFormulas();
  const formulas2 = range2.getFormulas();

  // 差分の件数をカウントするための変数を宣言
  let result = 0;

  // 1セルずつチェックしていく
  for (let i = 0; i < values1.length; i++) { // 行のループ

    for (let j = 0; j < values1[i].length; j++) { // 列のループ

      // セルの値 もしくは 数式がシート間で一致しない場合は
      if (values1[i][j] != values2[i][j] || formulas1[i][j] != formulas2[i][j]) {

        // 2つ目のシート上で、該当セルに色を付ける
        range = sheet2.getRange(i + 1, j + 1);
        range.setBackground('yellow');

        // 差分の件数カウンターを増加する
        result++;
      }
    }
  }

  // 終了メッセージを表示する。差分の有無でメッセージを変える
  if (result > 0) {
    ui.alert(response1.getResponseText() + 'と' + response2.getResponseText() + 'を比較した結果、\n' + result + '個のセルで差分が見つかりました!');
  } else {
    ui.alert(response1.getResponseText() + 'と' + response2.getResponseText() + 'を比較した結果、\n差分は見つかりませんでした!');
  }
}

関連するアプリ


【GASで便利に】シート内のすべての数式を表示する

シートに入力されている全ての数式を、別シートに出力するGoogle Apps Scriptです。数式のセル参照が連鎖していて、確認が大変だったので作ってみました。

【GASで時短】数式エラーが出ているセルを通知する

数式でエラーが出ているセルを探してくれるGoogle Apps Scriptです。巨大なシートだとエラーに気づかないこともある・・・?ということで作ってみました。

【GASで便利に】数式が入っているセルに色を付ける

シート内の数式が入っているセルを探して、色を付けてくれるGoogle Apps Scriptです。他の人から引き継いだシートだと、数式がどこにあるのかわかりにくいので作ってみました。

【GASで時短】シート内の数式だけを削除する

セルに入力されている数式をすべて消し去るGoogle Apps Scriptです。数式を多用してデータを作ったが、再計算することはないので数値が直接入力されている状態にしたい時・・・などに。

【GASで時短】2つのセルの時間差を計算する

2つのセル(日付・日時型)を選択すると、差分の日数や時間を計算してくれるGoogle Apps Scriptです。スプレッドシート関数でも出来ますが、任意のセルでちょっと計算したいときに。

【GASで時短】セルの編集内容をすべてのシートに反映させる

シートに対する変更内容(値の変更)を、同じファイルのすべてのシートに反映(同期)させるGoogle Apps Scriptです。

タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp