PeaceJet

@PeaceJets 新しいブログ → https://blog.peacejet.net 2018年、証券会社から転職して人材会社のシステムエンジニアになりました。マーケティングやデータ分析・UI/UX改善などもやっています! https://github.com/peacejet

Googleスプレッドシートでシート同士の行を比較して変更を検出する方法。



Googleスプレッドシートでシート同士の行を比較

puts 'Hello PeaceJet From the Sky.'

こんにちは、PeaceJetです。

今回は、業務で増えてきた案件としてシート同士のそれぞれの行を比較して、変更されているか否かを検出するコードを書いてみたいと思います。 今回、使い方を便利にするためにスプレッドシート関数として扱えるようにしました。

方法について

Googleの公式で載っていた方法として重複した行を削除して、重複のない状態のリストを作成するプログラムがあったので、それを応用します。 そこに載っている考え方というのは、以下のとおりです。

  1. それぞれの行にある値を全てつなぎ合わせて文字列を作ります。
  2. 変更されているかを確認したいシートと別のシートについて、文字列を比較する。
  3. その際、変更されているか確認したいシートのA1:A6について文字列を作り、別のシートでは同様の文字列を全て比較して評価する。
  4. 変更されていれば「return '変更されています'」する。

この方法だと、時間がかかってしまう処理ではあるものの、比較的誰でも組めるし、なにしろ行数が少なくて済みます。

セットアップ

まずシートを作って、「データ」→「スクリプトエディタ」を開いてプロジェクト名を打ち込みます。 そして、以下のコードを貼り付けたら完了です。

f:id:PeaceJet:20190305153853p:plain こんな感じですね。

コード

function CHECK_DUPLICATE(range, target) {

  var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(target);
  //↓の部分は、確認したいシートと合わせる。
  // 今回の場合は、1行1列目から始まって最終行、そして列は6列目ということ。
  var data = target.getRange(1, 1, target.getLastRow(), 6).getValues(); 
  
  for (var i in data) {
    var changed = false;
    if ( data[i].join() == range.join() ) {
      changed = true;
      break;
    }
  }
  
  if (!changed) {
    return '変更されています。'
  }
}

使い方

変更されているか確認したいシートの対象データ一番右側に「変更されているか」的な感じで、列を作ります。 次の行に=CHECK_DUPLICATE("A2:F2","変更元シート")のような感じで入れてあげると2行目が変更されているかどうかが検出できるようになるはずです。

わからないことがあれば、コメントとかツイッターとかでいただければ出来る範囲でお答え致します!

参考

参考にしたGoogleのサイト developers.google.com