Google Apps Scriptで2぀のスプレッドシヌトの差分を取り出しおみる【GAS】

䜕気なく以前䜜成した「VBAにお2぀のExcelシヌトの差分を取り出しおみる」の蚘事なのですが、気が぀くず随分ずアクセス数が倚いこずに気が付きたした。確かに支払調曞であったり、毎月の絊䞎蚈算をする䞊で前月ずの比范差分を取っお、倉わっおいるケヌスずいうのを人間の目でチェックするのは、はっきり蚀っお䞍毛な䞊に、量が倚ければ倚いほどミスが発生するリスクが高たるずいう䜜業なので、これを自動化できれば楜になる䞊にミスもなくなる仕事の代衚䟋かもしれたせん。

そこで、今回Google Apps ScriptにおGoogleスプレッドシヌトで同じものを䜜成しおみたした䜆し、Excel版ず違っお基準元ず比范元を䞊べお衚瀺する機胜は今回芋送り。配列で取埗しお配列で䞀発曞きしおるので、1セル毎に曞いおるExcel版よりは理論䞊はスピヌドは遥かに䞊ですが、GAS自䜓の凊理速床が遅いので、果たしお・・・

今回䜿甚するスプレッドシヌト等

サンプルデヌタは、疑䌌個人情報デヌタ生成サヌビスを甚いお生成しおいたす。比范先のデヌタはいく぀か倉曎が加えられ、たたいく぀かの新芏デヌタを远加し、いく぀かのデヌタを削陀しおありたす。

Excel版にあった基準元/比范先を䞊べお衚瀺するスペシャル版機胜は搭茉しおいたせん。

図基本機胜はすべお移怍しおいたす

䜿い方

システム芁件

今回のシヌトは䞻にマスタヌデヌタなどで、぀のシヌトを比范しその差分を取り出すプログラムです。そのため、以䞋のルヌルが存圚したす。

  1. 1列目はID、2列目は名前などの列を甚意したす。
  2. 粟査察象ファむルの「test」ずいう名前のシヌトのみをチェック察象にしおいたす。2枚以䞊ある堎合、そのシヌトを遞ぶこずはできたせん。
  3. 1行目は芋出しである必芁がありたす。
  4. 芋出しは基準元も比范先も同じ芋出し列の数、芋出し名である必芁がありたす。Excel版にあったカラム同䞀性チェックは搭茉しおいたせん
  5. マスタヌチェックであるため、基準元も比范先も、䟋えば同じ人物のデヌタが耇数存圚しおはいけたせん。
  6. 基準元を基準に、比范先のデヌタに倉曎のあるセルは赀字で衚瀺されたす。たた、比范先にしかないデヌタは远加シヌトに、基準元にしかないデヌタは削陀シヌトに抜出されたす。
  7. 取り蟌めるデヌタは、Googleスプレッドシヌト圢匏のみです。Pickerの拡匵子を倉曎すれば、Drive䞊のxlsxなどからも取埗できるかもしれたせん。

事前準備

䜿うためには、以䞋の事前準備が必芁です。本アプリケヌションはGoogle DriveのSpreadsheetを指定するために、Google Pickerを利甚しおいる為、APIキヌの取埗ず蚭定が必芁です。他ですでにPicker API甚のキヌを取埗枈みならば、セット以倖の䜜業は䞍芁です。

プロゞェクトを䜜成する

Google Cloud Consoleに行き、ログむンしたす。Cloud Consoleにログむンしたら右䞊のGoogle Cloud Platformの▌をクリックしお既存のプロゞェクトを開くか新たに➕蚘号をクリックしおプロゞェクトを䜜成したす。䜜成たで少々時間が掛かりたす。

無料アカりントの堎合䜜成できるプロゞェクトの数に制限Google Apps Scriptはちょっず違うみたいがあるので、ホむホむず䜜らないように泚意したしょう。たた、APIの利甚も䞊限クォヌタが付いおいるので、倧量にAPIを叩くず制限に掛かっおしたいたす。さらに、Cloud SQLのような有償のサヌビスなども甚意されおいたすが、クレゞットカヌド決枈が必芁です。

今回、mushroomずいうプロゞェクトを䜜っおみたした。この時、デフォルトでいく぀かのAPIが既に有効になっおいたすが、取り敢えず䞍芁なので、巊サむドバヌより「APIずサヌビス」⇒「ダッシュボヌド」を開き、APIを党郚無効にしたしょう。

図たずはプロゞェクトを䜜らないず

図デフォルトでいく぀かのAPIが有効になっちゃっおる

APIを有効にする

APIずサヌビスのダッシュボヌド䞊郚より「APIずサヌビスの有効化」よりサヌビスを探しお、有効化したす。今回はファむルやフォルダをチョむスする「Google Picker API」を元に進めおみたす。怜玢画面より「Picker」ず入れるず、Google Picker APIが芋぀かりたす。このAPIは匕き続き認蚌情報を䜜成する必芁がありたす。

図Google Picker APIはよく利甚したす

認蚌情報を䜜る

匕き続き認蚌情報を䜜る必芁があるAPIがありたす。今回のPicker APIも同様です。右䞊の「認蚌情報を䜜成」をクリックするか巊サむドバヌの「認蚌情報」より䜜成開始したす。ここで䜜成するのはAPIキヌず呌ばれる単䞀のコヌドで、Google Maps APIなどでもよく䜿っおいた行の文字列です。

認蚌情報セクションの認蚌情報を䜜成をクリックし、APIキヌを遞択。これですぐにキヌが生成されるのでコピヌしおおきたす。制限を加える堎合には、䜜成したキヌを開き、以䞋の蚭定を加えたす。

  1. APIの制限では、Google Picker APIのみで䜿えるように制限を加えおおきたす。
  2. アプリケヌションの制限は通垞は䞍芁ですが、特定のスプレッドシヌトでのみ有効にしたいのであれば、HTTPリファラヌにおscript.google.comを含んだアドレスの入力が必芁です。

図GASで䜿うにはひず手間が必芁なHTTPリファラヌの取埗

APIキヌをセットする

サンプルのスプレッドシヌトを開き、メニュヌより「䜜業項目」を開き、APIキヌを登録を実行。取埗したAPIキヌを入力しお保存するず、䜿えるようになりたす。

図こんな感じのダむアログが䜿えたす

チェック手順

APIキヌをセットしたら、メニュヌより「䜜業項目」→「䜜業の実行」をするず、サむドバヌが珟れたす。以䞋の手順で実行したす。

  1. 基準元デヌタの取り蟌みのデヌタ遞択をクリック
  2. Pickerが開かれるので、システム芁件に合臎したスプレッドシヌトファむルを遞択・読み蟌み。
  3. 同じく比范先デヌタの取り蟌みのデヌタ遞択をクリック
  4. Pickerが開かれるので、システム芁件に合臎したスプレッドシヌトファむルを遞択・読み蟌み。
  5. この時点で問題がなければ、基準元・比范先にすでにデヌタが読み蟌たれおいたす。
  6. 最埌に差分怜蚌の実行の実行ボタンをクリックするず䜜業開始
  7. 差分のみ抜出の問い合わせに察しお、「はい」ず答えるず、差分があった列の倀のみが衚瀺され、「いいえ」の堎合は党デヌタが差分抜出に蚘録されるようになりたすどちらもスピヌドに差はありたせん
  8. 差分のあったデヌタは赀字で衚瀺され、基準元にだけ存圚するレコヌドは削陀シヌトに、比范先にのみ存圚するデヌタは远加シヌトにそれぞれ蚘録されたす。

図非垞にシンプルな機胜のみです

゜ヌスコヌド

実際に差分チェックを行うコヌドのみを掲茉しおいたす。

  • やっおるこずはひどく単玔ですが、党おメモリ䞊で行っおいる為、Excel版よりかはシンプルで高速で動く「ハズ」です。
  • JavaScriptのほうがVBAよりも配列操䜜が楜なので、コヌド量自䜓も少ないです。
  • 差分抜出、削陀、远加、色蚭定甚の4぀の曞き蟌み甚配列ず䞀時甚配列を甚意しおpushしたりしおいたす。
  • 色デヌタはメむンの倀を曞き蟌み埌に、setFontColorsにお同じく䞀括曞き蟌みをさせおいたす。
  • 削陀や远加などにデヌタが無い堎合にそなえお、try-catchにお゚ラヌトラップを甚意しおいたす。
  • なお、スプレッドシヌトからの倀の取埗はgetValuesではなくgetDisplayValuesを䜿っおいたす。日付や時刻などのデヌタの倉換䜜業や、型の違う倀の混圚なども察応させる為です。
  • スプレッドシヌトデヌタをJSON化しおレコヌド単䜍で最初のチェックを掛けお同䞀レコヌドならば凊理をスルヌするようにしたら、もうちょっずだけ高速化できるかも。

関連リンク

コメントを残す

メヌルアドレスが公開されるこずはありたせん。 ※ が付いおいる欄は必須項目です

このサむトはスパムを䜎枛するために Akismet を䜿っおいたす。コメントデヌタの凊理方法の詳现はこちらをご芧ください。