GAS

GAS シートの内容を比較して異なる部分を出力

GAS

こんにちは! 健史です。

以下の記事のGAS版です。

Excel-VBA 実例 シートの内容を比較して異なる部分を出力
こんにちは! 健史です。 Excelシートで、 「レイアウトも格納されているデータの順番も同じ2つのシートから、内容の違っているセルを探したい!」 ってことありませんか。 「説明は要(い)らないから、すぐに実行したい!」方は、3.すぐに実行...
スポンサーリンク

処理概要

シート1シート2を比較し、異なる部分をシート3に出力します。

シート1

シート2

シート3

プログラム

 function myfunc1(){
  var ss = SpreadsheetApp.getActiveSpreadsheet()
/* シート名で指定する場合
  var sheet1 = ss.getSheetByName("シート1")
  var sheet2 = ss.getSheetByName("シート2")
  var sheet3 = ss.getSheetByName("シート3") 
*/
// インデックス番号で指定する場合は、0から始まるので注意
  var sheet1 = ss.getSheets()[0]
  var sheet2 = ss.getSheets()[1]
  var sheet3 = ss.getSheets()[2]
// 変数定義
  var ix1,iy2,ix1_max,iy1_max, ix3
  var str_col
// 最大行、最大桁を取得
  ix1_max = sheet2.getLastRow()
  iy1_max = sheet2.getLastColumn()
// シート3のクリアと見出し設定
  sheet3.clear()
  sheet3.getRange(1,1).setValue("列")
  sheet3.getRange(1,2).setValue("行")
  sheet3.getRange(1,3).setValue("シート1") 
  sheet3.getRange(1,4).setValue("シート2")
  sheet3.getRange(1,5).setValue("最大値の行:列は、 " + ix1_max + " : " + iy1_max)
// 比較処理
  ix3 = 1
  for (ix1 = 1 ; ix1 <= ix1_max ; ix1++) { 
    for (iy1 = 1 ; iy1 <= iy1_max ; iy1++) { 
      if (sheet1.getRange(ix1,iy1).getValue() != sheet2.getRange(ix1,iy1).getValue()) {
        ix3++  // ix3 = ix3 + 1 のこと
        str_col = sheet1.getRange(1, iy1)   // (ix1,iy1)では、A列12行目の場合
        str_col = str_col.getA1Notation()   // [A12]が取得され  
        str_col = str_col.replace(/\d/,"")  // 最初の数字[1]がNULLになり、[A2]になってしまう
        sheet3.getRange(ix3,1).setValue(str_col)
        sheet3.getRange(ix3,2).setValue(ix1)
        sheet3.getRange(ix3,3).setValue(sheet1.getRange(ix1,iy1).getValue()) 
        sheet3.getRange(ix3,4).setValue(sheet2.getRange(ix1,iy1).getValue())
      }
    }
  }

}

補足

・シート名取得について
プログラムではシート名から取得する方法とインデックス番号で取得する方法を記載しています。

シート名から取得する方法はコメントにしてあります。

インデックス番号で取得する方法は、1番目のシートが[0]から始まるので注意が必要です。

・最大行、最大列を確認するために
「sheet3.getRange(1,5).setValue("最大値の行:列は、 " + ix1_max + " : " + iy1_max)」にて、処理対象になった行列の最大値を出力しています。

・str_col = sheet1.getRange(1, iy1)で「(ix1,iy1)」でない理由
プログラム内でもコメントしましたが、[A12]の場合、その後の「str_col = str_col.replace(/\d/,'')」では数値1桁を空白に置き換えます。

それでは「str_col = str_col.replace(/\d\d/,'')」とし、"2桁の数字を置き換える"とした場合、今度は[A5]の場合には2桁の数字がないので置き換えられません。

列名が取得できればよいので、行番号が1桁の1行目を指定し、1桁の数字を置き換える処理にしています。

最後に

シート比較をスプレッドシート上で行うことはないかもしれません。

ですがこの記事は、一つひとつの関数の説明ではなく一連の処理の流れであり、その中で使用している関数なので実践的な使用方法をご理解頂けるものと考えています。


主観ですが、

・シートを「シート名」または「番号」で取得する

・シートの最大行、最大列を取得する

・文字と変数を連結して表示する → Browser.msgBoxでも使える

・アドレス:A1,B1,C1・・のどれか該当する値を取得し、数字1桁をNULLに置き換える


ご活用頂ければと思います。

GAS
スポンサーリンク
- 面白かったらシェアお願いします! -
健史をフォローする
自分で改善

コメント