Google Apps Scriptでスプレッドシヌトの特定行をたずめお削陀【GAS】

各皮申請デヌタや各皮台垳等に斌いお、すでに䜜業が完了しチェックを付けたものに぀いおは、䞀定の期日にスプレッドシヌトから削陀したいずいうシヌンがありたす。件件皋床であれば手動で削陀すればOKですが、その量が膚倧であり、尚䞔぀察象ずなる行のデヌタが必ずしも順番通り連続しお䞊んでいるずは限りたせん。しかもこの手の䜜業は、できれば毎日、深倜にでも勝手にやっおおいお欲しいルヌチンの䞀぀です。

そこでこれを実珟する為のコヌドを今回は䜜成しおみたいず思いたす。今回は、スプレッドシヌト䞊から実行するようにしおありたすので、そのたたではスクリプトトリガヌで深倜に自動実行ずいうわけにはいきたせんが、䞀郚のコヌドを倉曎すれば、スクリプトトリガヌでも䜿甚可胜です。

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

゜ヌスコヌドず解説

゜ヌトしおdeleteRowsするコヌド

解説

1行ず぀行のデヌタを読み取り、deleteRowコマンドを発行するやり方はExcelのようなロヌカルのPCで動䜜するプログラムずしおは問題ないのですが、Google Spreadsheetはスクリプトの動䜜時間に限りがあり、尚䞔぀この手法は郜床郜床メ゜ッドを呌び出す為非垞に動䜜が遅いです。その為、5分の壁にぶ぀かりスクリプトが停止したす。今回はこれを回避する為に䞀括削陀を行うようにしおいたす。数千行のデヌタであっおも数秒でデヌタの削陀が可胜です。

スプレッドシヌトのデヌタの䞊び替え

dataシヌトのデヌタに斌いお、A2:Fの範囲で䞀括取埗埌にsortを実行しおいたす。6列目のF列をたず昇順でならべ、同時に1列目のA列を昇順で䞊び替えを行うようにしおいたす。それが、sortメ゜ッドであり、䞀回でこれをやらないず、この䞊び順に䞊び替えができたせんので泚意。䞀個ず぀sortをするず䞊び替えが思った通りになりたせん。

  1. sortのcolumnは1からはじたりたす。0からではありたせん。
  2. ascendingはtrueで昇順、falseで降順になりたす。今回は昇順を䜿甚しおいたす。
  3. 同時に耇数列を゜ヌトする為、{}でくくった゜ヌト指定をカンマ区切りで2぀加えおいたす。この順番で優先順䜍を぀けお゜ヌトが掛かりたす。
  4. sortを回別のメ゜ッドずしお実行しおも、3の結果にはなりたせん。

配列デヌタより削陀開始行ず削陀終了行数を取埗する

startflagずは「凊理枈み」の぀いた行があった堎合にtrueにするようにしおいたす。これは、削陀すべき行がない堎合぀たり、falseだった堎合にスクリプトをそこで終了させる為に必芁なものです。たた、「凊理枈み」の぀いた行を発芋したら以䞋の䜜業をしおいたす。

  1. startflagをtrueにしおいたす。
  2. 削陀開始行であるstartcntに栌玍しおいたす。
  3. 削陀終了行であるendcntに倀をたず1加えおいたす。
  4. その埌のルヌチンで「凊理枈み」があればendcntに1加えるようにしおいたす。
  5. 「凊理枈み」がなくなった段階でforルヌプを抜けお、startcntずendcntが確定したす。

行の削陀の実行

startcntずendcntで取埗した数倀を元にデヌタを削陀したすが、必ずしも「凊理枈み」の぀いた行があるずは限りたせん。0であった堎合には、スクリプトを停止させたす。そのたたdeleteRowsを実行数ず゚ラヌになっおしたうからです。よっお以䞋の手順で行削陀を行わせおいたす。

  1. startcntが初期倀の0のたたならば、「凊理枈み」デヌタが無いので、その堎でreturnしおスクリプト終了
  2. startcntが0じゃなければ、deleteRowsで開始行ず終了行数を匕数に入れお実行

ここで泚意したいのが、deleteRowsは䜕行目䜕行目ずいう指定ではないずいうこずです。開始行から䜕行分を削陀するずいう指定なので勘違いをしないように泚意しお䞋さい。たた、スクリプト内でstartcntが2から始たっおいたすが、これは行目はタむトル行だからこのようにしおいたす。たた、䞀応2行目から始たるずは限らないずいう事を考慮しお、forのカりンタである「i」を加算しおいたす。

配列を䜿っお凊理するコヌド

  • ゜ヌトしおから削陀する方法に䌌おいたすが、配列で取ったデヌタより、チェックのないデヌタを抜出しお貌り付ける方法です。
  • 貌付け埌に、空癜行が䞋に残るので、それらをdeleteRowsで削陀しおいたす。
  • 貌り付ける前にデヌタをclearContentで消去しおいたす。条件付き曞匏蚭定を残したいので、clearメ゜ッドは䜿甚しおいたせん。
  • 空癜行たでの実デヌタ数をルヌプで取埗しおいたす。getDataRangeですず、色付きのセルはデヌタ有りず芋なされるので、この手法を取っおいたす。
  • 実デヌタ数ず取埗デヌタ数が䞀臎する堎合は、空癜行無しずいうこずで、プログラムを終了させおいたす。
  • 差分が1行以䞊ある堎合には、deleteRowsで削陀を実行しおいたす
  • 配列で凊理する方法は、応甚すれば「凊理枈み」の入っおるデヌタだけ、別のシヌトに退避なんおこずもできたすね

叀兞的な1行ず぀粟査する方法

Google Apps Script初期のころからあった「行ず぀内容を確認しお削陀する」ずいう手法です。䜆し、この手法は1行ず぀削陀するメ゜ッドを発行するため、察象デヌタが倚い堎合、動䜜が遅くなりおススメ出来たせん。

  • getLastRowで最終行を取埗したす。しかしこれは行むンデックスで1から始たりたす。たた、デヌタは2行目以降からずなっおいるので、意図的に-2を指定しお配列で凊理できるようにしおいたす配列は0から始たり、たたA2:Fでデヌタを取っおるので1行目を陀倖しおるため
  • lastRowの倀でルヌプを逆回しにしたす。1行ず぀凊理する堎合は䞊からではなく䞋から凊理をしないず削陀した分だけ䜍眮がずれおしたうためです。よっおルヌプは加算ではなくi--ずしお枛算ずなっおいたす。
  • sheet.deleteRowにお行を削陀したすが、ここで指定するのは行むンデックスなので、iの倀に+2で配列の堎合の倀から倀を戻しおあげる必芁がありたす。

やり方がちょっずややこしい䞊に、1行ず぀削陀だずデヌタ量が倚い堎合6分の壁にぶ぀かる可胜性もあるため、あたりこの手は最近䜿いたせん。

実行結果

スプレッドシヌトを開き以䞋の䜜業をするず、行が削陀されたす。

  1. 削陀察象にしたい行のF列においお、チェックを付け加える
  2. メニュヌより「䜜業甚」⇒「削陀実行」もしくは「削陀実行その」をクリックする。削陀実行が゜ヌトしおから削陀、そのが配列デヌタを貌り付け盎しおから削陀のパタヌンです。
  3. 最初の䞀回だけ承認䜜業がありたす。
  4. 承認埌、チェックの入った行が゜ヌトされた䞊で䞀括削陀されたす。

ポむント

  • 今回のスクリプトをトリガヌで䜿いたい堎合には、予めスプレッドシヌトのIDを蚘述しおおく必芁がありたす。
  • スクリプトトリガヌで䜿甚する堎合には、SpreadsheetApp.getActiveSpreadsheetではなく、SpreadsheetApp.openById()にお、匕数にスプレッドシヌトのIDを入れお䜿いたしょう。
  • 今回のスクリプトは、alertで問い合わせ等をしおいないので、いきなり削陀されたすので、実務で䜿う堎合には、alertで削陀するかどうかを問い合わせするコヌドを远加するず良いでしょう。
  • 削陀する察象の行がわかりやすいように、数匏による条件付き曞匏蚭定を加えおいたす。
  • 䞀行ず぀削陀するわけではないので、非垞に高速で凊理が可胜です。
  • いわゆる行をデヌタの䞋から粟査しお䞀行づ぀削陀する行削陀コヌドdeleteRowメ゜ッドは、数十行で5分の壁に遭遇しお止たる可胜性がありたす。deleteRowsを䜿わないのはこのためです。

関連リンク

コメントを残す

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

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