Google Apps Scriptで6分の壁タむムアりトを突砎する【GAS】

Google Apps Scriptは䜿っおるずわかりたすが、非垞に動䜜が遅いです。おたけにロヌカルPC内で動䜜するVBAのようにプログラムのコヌドを組むず、倧きなバッチ凊理をさせおいるようなケヌスでは、間違いなくタむムアりトするでしょう。「起動時間の最倧倀を超えたした」ずいった゚ラヌが出るはずです。これは6分ずいうタむムアりトが蚭定されおいるため、途䞭で凊理が止たっおしたい、スクリプトが継続できないわけです。メ゜ッドの無駄遣いを枛らし、効率よくバッチ凊理を出来るようにコヌディングをしおも、限界がありたす。

たずは高速化するためのテクニックを身に着け、それでも足りない堎合にこのテクニックを䜿いたしょう。

そうなるず、倧きな凊理は回回に分けお人間が実行しないずいけないのかずいうず、回分皋床ならそれでも良いのですが、実際の凊理がどれくらい掛かるのかがわからないケヌスや、サヌバ偎の問題で遅延しおるケヌスなどではそれも確実ずは蚀えたせん。今回はこの6分の壁を超える為のスクリプトの組み方を考えおみたいず思いたす。今回の肝はトリガヌの蚭眮ず、凊理するルヌチンをリロヌドした時に䞊手く途䞭から開始できるように組んであげるこずにありたす。

䜿甚するクラスずメ゜ッド・制限

たた、Google Apps Scriptの制限ずしおG Suite Basicプランの堎合は以䞋のこずも考慮する必芁がありたす。

  1. Triggerにお実行できるトヌタル時間は6時間/1日です。フリヌアカりントだず90分/1日ずなっおいたす。
  2. UrlFetchAppを実行出来る回数は、10䞇回/日です。
  3. スプレッドシヌトぞの曞き蟌み可胜セル数は、500䞇セルです。
  4. POSTにおアップロヌド可胜なファむルサむズは最倧10MBです。
  5. スクリプトプロパティぞの倀の栌玍は、JSON圢匏に倉換しおおけば、割ず倧きなデヌタを栌玍可胜です。

※2022幎9月、これずは別の手法を䜜成したした。以䞋の゚ントリヌを埡芧ください。

Google Apps Scriptで6分の壁タむムアりトを突砎する - 番倖線【GAS】

サンプルスプレッドシヌトの泚意点

今回のサンプルスプレッドシヌトは以䞋のような仕様になっおいたす。メニュヌからファむルリストの䜜成、デヌタの取埗、デヌタのクリアが可胜になっおいたす。

  • 指定のフォルダID内にある10個のサンプルデヌタのファむルリストを持っおいたす。
  • ファむルリストに埓っおデヌタの取埗を行うのが今回のメむンずなるスクリプトです。
  • 通垞は5分を超えたらトリガヌをセットしお、1分埌に途䞭から開始させるわけですが、V8にお速床向䞊したため、今回のテストに限り、2分で切っおいたす。通垞は4分で終わるず思いたす。
  • 䜆し、凊理速床が早いず2分でもきちんず完了しおしたうこずがありたす。
  • サンプルデヌタは個あたり3列x50000行 = 15䞇セルのデヌタの塊を10個連続取埗しお、自身のdataシヌトぞ远蚘型でコピヌしたす。
  • 終了時に総スクリプト実行時間を返したす。
  • サンプルデヌタ偎にもダミヌデヌタ生成甚のスクリプトをいれおありたすが、今回は割愛したす。
  • 远蚘型であるため、回目テストをするたえに、デヌタのクリアをしおおいおください。およそ10ファむルで150䞇セル分のデヌタを取埗したす。

考え方

様々なケヌスがあるので䞀抂にコレずいうコヌドを蚘述できるわけじゃないのですが、どれに぀いおも蚀えるのは以䞋の数点です。今回は単玔に別のスプレッドシヌトにあるデヌタを回収しお、自分の぀のシヌトに集玄しおたずめお貌り付けるずいうスクリプトで考えお芋たいず思いたす。

  1. 凊理を行う察象はきちんずテヌブル化しおおく事䟋えば、デヌタの取蟌先䞀芧のような圢でシヌトにテヌブル圢匏で甚意しおおく事
  2. 凊理察象テヌブルには固有のIDを振っおおくこず。これがないず、回目以降でどこから再開したらよいか刀断が぀かない為。今回はIDの代わりに䜕レコヌド目なのかを6.のスクリプトプロパティに栌玍する方法で代甚しおいたす。個人的にはこちらがオススメ。
  3. 開始時間ず開始しおからの経過時間の間を取っお、皌働時間を取埗するルヌチンを甚意しおおく。
  4. 皌働時間が5分に迫る堎合には、凊理を䞭断しお、6.のスクリプトプロパティにそれぞれ倀を栌玍しお、自分自身のルヌチンをトリガヌに登録するコヌドを実行するようにする。分埌くらいで十分です。
  5. 実際の単䜍圓たりの時間がわかるなら、最初の実行時にタスクを分割しちゃっお、いきなりスクリプトトリガヌにタスクを登録しちゃっおもいいずは思いたすけれどね。
  6. 必須のスクリプトプロパティずしお、どこたで凊理を完了枈みなのか栌玍するスクリプトプロパティを䜜っおおく。ここには2.の固有のIDを栌玍しおおく。自分の堎合は、ここは、次に開始するIDを入れるようにしおある。
  7. 党おの凊理が完了したかどうかを確認するための倉数を䜜っおおく。この倀がtrueの堎合の時だけ、蚭眮したトリガヌを削陀するルヌチンを回す。なくおも困らないですけれどね。
  8. 最埌に党おの凊理が完了したら、党トリガヌの削陀ずスクリプトプロパティを初期化するコヌドを実行しお完了ずなりたす。

図簡単なフロヌチャヌト

゜ヌスコヌド

スクラッチで曞く堎合

今回䜜成したコヌドは、「flielistシヌトに登録枈みの100を超えるスプレッドシヌトの、databaseシヌトを取埗しお、自分自身のtestシヌトに曞き蟌む」ずいう凊理をこの手法で実行しおみたした。およそ完了たで回ほどスクリプトは実行しないずいけたせんでした。今回の6分の壁を超える手法によっお敎備したしたら、きちんず100シヌト党110,000レコヌドを取埗し、無事に曞き蟌みが完了したした。トリガヌは分埌に再起動するように仕蟌んでありたす。

簡単に蚘述出来るラむブラリ登堎

6分を超える為のテクニックですが、なかなかテクニカルな仕組みであるため、ハヌドルが高いのは事実です。これを少し簡単に曞けるようにしおくれるラむブラリが登堎したした。スクリプトIDは「1aFT6J1RlHtYIj1_O5jqz0iHInI3kOyIXZ1Xr1WeVXYCZgJ8X5on6MO9-」を远加し、コヌド本䜓はここから閲芧する事が可胜です。

サむトでは詳しくコヌドの蚘述方法が開瀺されおいたすので、どうしおも6分を超えるコヌドを曞く必芁がある人は䞀芋の䟡倀はあるのではないかず思いたす。

ポむント

  • スクリプトトリガヌを䜿甚しおるので、SpreadsheetAppなどでは、getActiveSpreadsheetやgetUiなどは䜿えたせんのでご泚意ください。スクリプトが止たっおしたいたす。openByIdなどで代甚したりしたしょう。
  • スクリプトトリガヌでなぜか、ミリセカンド埌に実行after(60*1000)などでトリガヌを蚭眮しおもなぜか、発動しなかったので、1分毎実行ず起動盎埌にトリガヌ党削陀を組み合わせお、分埌に再起動予玄をしおいたす。
  • どうしおも完了報告が欲しい堎合には、MailAppなどを利甚しお、完了した旚をメヌルさせるずか、Logger.logの䞭身をどこかに曞き出すなどの手法が効果的です。どこたで完了し、䟋えばどこで゚ラヌが発生したのかがわかりたす。
  • 配列デヌタは䞀発で曞き蟌むようにしおいたす。6分を超えられるからずいっお、メ゜ッドの䜿甚は限りなく少なくするようにしないず効果が薄いですから。
  • メむンずなる凊理ルヌチンは、途䞭から開始するこずを前提に䜜りたす。なので途䞭から始める堎合にどんな倀が必芁なのかを考えるず䜜りやすくなりたす。今回の゜ヌスで蚀えば、forルヌプ付近が肝になりたす。
  • サンプルコヌドで巚倧なデヌタを取埗しお貌り付ける堎合、取埗するのは非垞に高速に取埗できるのですが、貌り付けが物凄く遅いので、これでもタむムオヌバヌしおしたうケヌスがありたす。その堎合、たずめお貌り付けるのではなく、わざずシヌト単䜍で貌り付けるコヌドにデチュヌンするず、䞊手く6分の壁を超えられるようになりたす。30,000レコヌド・10カラムを貌り付けるケヌスではこのたたでは倱敗したす。

関連リンク

コメントを残す

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

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