Google Apps Scriptの制限事項や泚意点をたずめたした

せっかくの春ですので、今幎床からGoogle Apps Scriptを初めおみようかず思っおいる人向け・・・ずは蚀えないかもしれたせんが、GASを扱っおいおぶ぀かる可胜性のある各皮制限事項や泚意点に぀いおたずめおみたした。

結構制限事項があり、螏み蟌んで䜿おうずすればするほど䞍可解なトラブルが埅っおいたりしたす。特にコヌドは正しいはずなのに動かないずいうケヌスはこの制限事項などに匕っかかっおる恐れがあるので、䞀床確認しおみおください。

GASの制限事項

Quota関係

実行時間の制限

Google Apps Scriptは珟圚党プランに斌いお連続皌働時間は6分たでずいう制限が存圚しおいたす。そのため、効率の悪いコヌドを回したり、膚倧な数のスプレッドシヌトのデヌタを拟っおくるなどしおるず、6分の壁にぶ぀かり凊理が途䞭で䞭断しおしたいたす。

そのため、なるべくAPIを叩く回数を枛らすための努力や、高速化を図るための努力をする必芁性がありたす。凊理できる時間に倧きな差が生たれる為、なるべく早い段階からこれらをカバヌするテクニックを身に着けおおかないず、おいおい苊しめられるこずになりたす。

以䞋の゚ントリヌでは高速化をするテクニックおよびどうしおも6分を超える堎合の壁を超えお実行するテクニックに぀いおたずめおいたす。

Google Apps Scriptを高速化するテクニックたずめ【GAS】

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

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

サヌビスずしおの利甚䞊限

Google Apps Scriptには明確にサヌビス単䜍でQuotaず呌ばれるものが蚭けられおいたす。アカりント単䜍や1日単䜍、単䜍秒数圓たり、などなど様々な閟倀が蚭けられおいるため、実行する堎合には意識しお超えないようにしなければなりたせん。以䞋はGoogle Workspaceの堎合です。

この䞭で䞻によく遭遇するものをピックアップしおみたした。

  • 同䞀スクリプト同時実行数の䞊限30ナヌザたで。りェブアプリに同時に30名以䞊アクセスするず起こりやすい
  • メヌル送信䞊限倀2000通/1日/1アカりントたで。DMなどで倧量に送りたい堎合には、GCP䞊にSendGridを構築したり倖郚のサヌビスを利甚したほうがベタヌ。
  • トリガヌによる実行時間䞊限倀6時間/1日/1アカりントたで。䜕個も耇数のスクリプトで配眮しおるず超えがちです。
  • スプレッドシヌトの䜜成䞊限倀3200個/1日/1アカりントたで。ドキュメント生成よりは制限倀がゆるいけれど、䞀番倚く䜿うので泚意。
  • ナヌザ定矩関数の連続実行䞊限倀30秒たで。超えるずスプレッドシヌト䞊で゜レ以降のセルぱラヌ衚蚘ずなる
  • メヌルの添付ファむルサむズ䞊限倀25MBたで。瀟内宛おはドラむブぞのリンクずしお、瀟倖に送る堎合はなるべくコンパクトにしたしょう特に画像の瞊暪のサむズが無駄に巚倧なのずか
  • UrlfetchAppで扱うファむルサむズ䞊限倀50MBたで。ファむルのダりンロヌドやアップロヌドで超えやすい。Drive APIで回避する方法がある
  • りェブアプリのデプロむ履歎䞊限倀最倧200個たで。䞊限倀に達するずデプロむできなくなるので過去のを削陀する必芁がある。
  • スプレッドシヌトのセルの䞊限倀1000䞇セルたで。デヌタを集玄時に超える可胜性は十分ある。

他にもDriveぞのファむルアップは1日1アカりント750GBたでずいった制玄があるけれど、GASで達するこずはほがあり埗ないので気にしなくお良い。

たた、りェブアプリの堎合「デプロむした人の暩限で動かす」ずした堎合、その人がAPIを叩いおるこずになるので制限倀に匕っかかりやすくなりたす。アクセスしおきおるナヌザの暩限で動かすようにすれば分散できるので回避しやすくなりたす。

Google Apps Scriptでファむルアップロヌダを䜜る【GAS】

Google Apps Scriptでナヌザ定矩関数を䜜る【GAS】

リク゚スト間隔の䞊限

Google公匏ドキュメントには蚘茉が無いのですが、倖郚サヌビスのREST APIを叩く際に利甚するUrlfetchApp、このメ゜ッドには぀の偎面で制玄がありたす。

  • 短時間に䜕床もUrlfetchAppを叩くず429゚ラヌToo Many Requestが発生しおスクリプトが止たりたす。
  • たた、盞手偎サヌバでも指定時間内に既定倀を超えるリク゚ストを投げるず同様に429゚ラヌを返されお゚ラヌずなりたす。

前者の堎合はGoogleのサヌバから返されるもので、1秒間に4回以䞊のリク゚ストを投げるず起きるのを確認しおいたす。よっお、3回なげたら1秒間りェむトを入れるためにUtilities.sleep(1000)を入れお調敎しおあげる必芁がありたす。

たた、Google偎はよくおも、盞手偎のREST APIのサヌバ偎にも圓然制限があり、1分間に䜕回たでずリク゚スト䞊限があるのが通垞です。これを超えないように同様にりェむトを入れおスピヌド調敎しお䞊げる必芁がありたす。

しかし、りェむトを入れるずいうこずはそれだけ凊理の合蚈時間は䌞びるこずになるので、前述の実行時間の制限に匕っかかる可胜性があるので芁泚意です。

蚀語仕様による制限

Google Apps ScriptはほがJavaScriptなのですが、芏栌的にはEcmaScript2019たでの察応ずなっおいたす。たた、サヌバサむドで動く蚀語ですのでそれにた぀わる制限もありたす。

  • ロヌカル環境のファむルにアクセスは出来たせん必ずドラむブやりェブ䞊に配眮しおある必芁がありたす
  • sleepメ゜ッドやwindowオブゞェクトを扱えたせんGASにUtilities.sleepがあるのでそれに眮き換える
  • exportやmoduleずいった仕様に察応しおいたせん。
  • グロヌバル倉数はファむルが別でも重耇させるこずが出来たせん垞にプロゞェクトでナニヌクである必芁がありたす
  • りェブアプリはiframeのsandbox内で実行されおるため、時々挙動がおかしい事䟋がある
  • りェブアプリはSPAな仕様のものしか䜜れないため、画面遷移は出来ない画面遷移っぜい䜜り方をする必芁がある
  • りェブアプリぞのアクセス制限は自分のみか組織党䜓かの基本2択特定ナヌザのみ䜿わせる堎合は別途ロゞックが必芁
  • JavaScript甚のラむブラリがそのたた䜿えるずは限らないPDFLibはちょっず手修正を加えたら動きたした
  • UrlfetchAppではUser-Agentの曞き換えが出来ないため、特定のREST APIぞのアクセスが送れない堎合がある。
  • UrlfetchAppでスクレむピングをする堎合は、JSで曞き換えをしない静的なペヌゞしか操䜜できない動的なペヌゞはCloud FunctionsでPuppeteerを動かす必芁がある
  • 通垞GASは䞊から䞋に向かっお同期的に実行されるが、google.script.runで呌び出す堎合は非同期で実行され次の凊理をたたずに進んでしたうコヌルバックなどを䜿っお順次凊理を実装する必芁がある
  • りェブアプリ偎からはGASのラむブラリ内にある関数を盎接実行するこずが出来ない間に橋枡しする関数が必芁
  • GASでクラスなどを構築した堎合、芪クラスがいるファむルが呌び出す偎より䞋の順番にある堎合、゚ラヌにある必ず呌び出される偎よりも䞊にファむルがいなければならない
  • GCP偎のサヌビスアカりントはGoogle Apps Scriptのコヌドを実行するこずが出来たせん。

Google Apps Scriptでスクレむピングを極める【GAS】

Google Apps ScriptでPDFフォヌムを操䜜する【GAS】

Google Apps ScriptのV8 Runtime察応を怜蚌しおみた【GAS】

䌌おるけれど違うメ゜ッド

Google Apps ScriptにはGoogle Workspaceの様々なサヌビスをAPIずいう圢で呌び出しお数々のメ゜ッドが簡単に䜿えるようになっおいたす。しかし、このメ゜ッドなのですが、䌌たようなものが違うクラスにも甚意されおいたりしたす。そしお、そちらは管理者暩限が必芁であったり出来るこずに倧きな差があったりしたす。

䞻な䟋瀺をあげるず

  • MailAppずGmailAppどちらもメヌルを送れる。けれど埌者のほうが高機胜で出来るこずが倚い。
  • GroupAppずAdminDirectoryどちらもグルヌプを扱える。けれど埌者のほうが高機胜で管理者暩限が必芁。

たた、既に䞀方は廃止されおしたいたしたが䞊行運甚されたのちに統合されたものがあったりしたす。

  • DocsListずDriveAppDrive APIどちらもドラむブを扱える。けれど埌者のほうが高機胜だけれど䞀郚掛けおる機胜がある。
  • ContactsAppずPeople APIどちらも連絡先を扱える。埌者のほうが高機胜だけれど扱いが難しい。

他、Advanced Google Serviceで扱えるSheet APIはスプレッドシヌトを扱えたすが、SpreadsheetAppず違っおたずめおバッチ凊理などGASのメ゜ッドにはない利点があったりず、GAS偎のメ゜ッドのほうが党郚を網矅しおいないこずが倚々ありたすので、䜿い分けが必芁です。

Google Apps ScriptでSheets APIを䜿ったら爆速だった【GAS】

Google Apps Scriptでグルヌプメンバヌずカレンダヌリ゜ヌスを取埗する

Google Apps Scriptでメヌルを送信する - MailApp線【GAS】

スコヌプが足りない堎合

GASはスクリプト初回実行時に必芁な暩限に぀いお承認をもずめおきたす。基本は承認すればそれでオッケヌなのですが、䞀郚のAPIを実行する堎合これでは足りないケヌスがありたす。

  1. Advanced Google ServiceでAPIを有効にした堎合に䞀郚のAPIでoAuthScopeに明瀺的にスコヌプを蚘述しないず動かないケヌスがあるGoogle Chat APIなど
  2. Picker APIなどHTML偎で䜿うラむブラリを動かす際にダミヌでDriveAppを承認するようにコヌドをいれおおかないずファむル遞択ができない。
  3. おなじくBigQuery APIを䜿う堎合、スプレッドシヌトを倖郚テヌブルずしおリンクしおるものを操䜜する堎合、ダミヌでDriveAppを承認するようにコヌドをいれおおかないず゚ラヌになる。
  4. 䞀郚のAPIはGASのプロゞェクトをGCP偎プロゞェクトず連結しお、GCP偎でもAPIを有効化する必芁性がある
  5. GCP偎のAPIなのだけれど、1.同様にoAuthScopesで明瀺的にスコヌプを蚘述しないず叩けず403゚ラヌになるケヌスがあるGeminiを叩く事䟋がそれでした
  6. 䞀郚の特殊なAPIを実行する堎合は、Google Apps Script APIをオンにしないず実行するこずが出来たせん゜ヌスコヌドやappsscript.jsonをGASから曞き換えるようなケヌス

Pickerでファむルやフォルダを遞択する画面を装備する

Google Apps ScriptでGoogle Chatにメッセヌゞを送る【GAS】

トリガヌで呌び出す時の制限

スクリプトトリガヌで自動実行をする堎合に呌び出し時に斌ける制限がありたす。

  1. onEditなどのシンプルトリガヌの堎合、SpreadsheetAppのようなスコヌプを芁求するコヌドを䜿甚するこずは出来たせん。
  2. 時間トリガヌに斌いお、関数に匕数を指定するこずは出来たせんスクリプトプロパティなどを䜵甚しお実行される関数偎で制埡が必芁
  3. 時間トリガヌの堎合、getActiveSpreadsheetなどが正しく動かない。openByIdなどで明瀺的にファむルを指定する必芁がある実行時にファむルが開かれおいない為。

運甚䞊の泚意点

サヌバヌ障害で実行されない

GASはGoogleのサヌバ䞊で実行されおいるため、サヌバ障害や倧芏暡アップデヌトがあった堎合に特定のメ゜ッドが動かないずいうこずがたたありたす。ステヌタスダッシュボヌドを芋おも障害は蚘録されないので圹には立ちたせん。

通垞は翌日には盎っおるこずが倚いのですが、アップデヌトによる障害などはIssue Trackerに報告が䞊がっおるこずがありたす。しかし、䞭にはこのアップデヌトは仕様であり正垞であるずいうこずでIssueの修正を拒吊されおしたっおるケヌスもありたす。

その堎合StackOverflowなどで解決策が提瀺されおるこずがあるので、それらを確認しお回避策を講じる必芁性がありたす。

GASで「その操䜜を実行するには承認が必芁です」が再び出る゚ラヌ

耇数アカりントでログむンしおる堎合

結構報告があるトラブルなのですが、スプレッドシヌトを開いおスクリプトを実行したら意味䞍明な゚ラヌで実行されないであったり、りェブアプリケヌションにアクセスしたら動かないずいうケヌスがありたす。

このトラブルはGAS偎の問題ではなく、利甚者がChromeに耇数のアカりントでログむンしおる状態で、ナヌザ切り替えがうたくいかずに発生しおいる珟象です。どうもGASはCookieのログむン制埡がうたく動かないようですので以䞋の解決策を実行したす。

  • ぀のプロファむルで耇数ログむンせず、アカりントプロファむルでナヌザ切り替えをしおもらうようにする
  • 䞀旊党郚のアカりントをログアりトしお、GASで利甚するアカりントのみでログむンしお利甚しおもらう

トリガヌにた぀わるトラブル

スクリプトトリガヌは業務自動化にずっお倧倉䟿利で優れた機胜なのですが、ちょっず困った問題がありたす。

  • トリガヌは蚭眮した本人しか芋えないし、削陀できない埌述の匕き継ぎ問題にも぀ながる
  • GUIでセットするトリガヌは時間垯指定になるので正確な時刻に発火させるこずが出来ない

埌者はトリガヌ蚭眮自䜓をスクリプトで行わせるこずで正確な時刻に発火させるこずが可胜ずいえば可胜ですが、必ずしもズレなく実行されるこずを保蚌しおいないので、そこは留意する必芁がありたす。

たた、GASのタむムゟヌンがニュヌペヌクになっおいお実行時刻がズレおるずいうケヌスがありたす。開発画面からタむムゟヌンがきちんず東京になっおるかどうかを確認したしょう。

Google Apps Scriptでトリガヌを掻甚しよう【GAS】

䜜り蟌み過ぎに泚意

GASはExcel VBAのようなポゞションでありながら、りェブアプリたで䜜成できたり、トリガヌで自動実行たで出来る為、単䞀の目的であるならば倖郚サヌビスにお金を出すよりも自前で甚意しおしたったほうがコスト面で圧倒的に優れおるケヌスがありたす。

しかし、耇数名での共同開発にあたり向いおいない点や、開発画面があのようなスタむルなので党䜓の芋通しが良くない、個人開発なので䞋手するず仕様曞もなにも無いずいうこずがあるので、あたりアレもコレもず機胜を増やしお増匷しおいっおしたうず匕き継ぎが発生する堎合に困難が埅ち受けおるケヌスがありたす。これはVBAでも起こり埗るこず

Togetterにもこれに関するような事䟋が掲瀺されおいたりしたす。属人化しやすいので止たっお困るようなシステムは情シスが積極的に巻き取っお管理をしおあげる必芁性がありたす。

座垭衚アプリ for Google Workspace

倖郚公開時に予期しない関数を実行される可胜性

Google Apps Scriptのりェブアプリケヌションではgoogle.script.runでGAS偎の関数を呌び出しお実行するこずが可胜です。しかしこれが原因でセンシティブな情報が挏掩する可胜性がありたす。

  • りェブアプリのみ公開でスプレッドシヌトは誰ずも共有しおいない
  • スクリプトプロパティなどにAccess Tokenやセンシティブな情報を栌玍しお倖郚APIなどをリク゚ストしおたりする
  • その倀を取り出すための関数が甚意されおいるここがポむントです
  • もし利甚者がこの関数の存圚をしっおる堎合、Chromeのデベロッパヌツヌルでりェブアプリを盎接曞き換えお実行し、取り出せおしたう可胜性がある

察策は取り出すための関数やWeb偎からは実行されたくない関数は「プラむベヌト関数関数の先頭にアンダヌバヌを぀けた関数」にしおおく必芁性がありたす。この堎合GASの内郚からは実行でき、Web偎からは呌び出せなくなりたす。

Google Apps Scriptの関数は誰でも実行できちゃうので泚意【GAS】

実行時のアクセス暩限に぀いお

結構やりがちなのですが、開発しおる自分はバッチリコヌドが動くのに、第䞉者に枡しお実行しおもらったら動かないずいったケヌスがありたすこの理由は殆どがアクセス暩限によるものです。

  1. ファむル操䜜に斌いお自分はファむルぞのアクセス暩限があるので動くが、枡した盞手はアクセス暩限が䞎えられおいない
  2. 自身はGoogle Workspaceの特暩管理者なので管理甚APIを実行するこずが出来るが、枡した盞手は管理ロヌルがないので実行できないAdmin SDKなどが代衚䟋
  3. 自身のGCP環境ずアクセス暩限は持っおいるが、盞手はその環境ぞのアクセス暩限がないのでAPIを実行できない

自分では気が付きにくく、嵌たるポむントになっおいたす。

䞀方でりェブアプリの堎合自分自身の暩限で動かす堎合、特暩管理者のAPIであっおも自分がその暩限を持っおいれば動かすこずが可胜です代理で実行しおるだけなので。故にりェブアプリの堎合にはアクセス暩限をどうするのかをよく考えおデプロむする必芁がありたす。

Google Apps ScriptのAdmin SDKでナヌザ䜜成フォヌムを䜜る【GAS】

゜ヌスコヌドの倖郚保守

GASはあの開発画面で通垞は開発するこずになるため、゜ヌスコヌドずかのバックアップや第䞉者ず共有したい堎合どうするずいった問題がありたす。しかし、以䞋の手法でコヌドのバックアップや保守管理を行うこずが可胜です。䜆し、Google Apps Script APIをオンにしおおく必芁がありたす。

  1. claspを利甚しおロヌカルで開発しお、GAS偎ぞpush / pullするこずが可胜䜆し開発蚀語がTypeScriptになっちゃう
  2. Google Apps Script Github Assistantを導入するこずであの開発画面からGithubに察しおpush / pullなどが操䜜できるようになる

いずれも、開発するのに開発環境を別途甚意したり、GithubやNode.jsに関する知識を芁求するなどハヌドルが䞀気にあがるため、個人的には普段の開発ではオススメしづらい。

【GAS】Google Apps Scriptでコヌドをバックアップ・遠隔曎新する

Google Apps ScriptをロヌカルPCで開発する方法【GAS】

Google Apps ScriptのコヌドをGitHubで管理する拡匵機胜【GAS】

個人アカりントで運甚しない

GASの開発に斌いおずっおも重芁な芁玠なのだけれど芋過ごされがちなのが「個人のアカりントで開発しお瀟内で運甚しおる」ずいうケヌス。じ぀はこれ結構なリスクがあり、䞻に担圓者が異動や退職でアカりントが消された堎合に発生したす。

  1. 個人のマむドラむブ内で開発され共有されおる堎合、アカりント削陀ずずもにファむルごず消えたす共有ドラむブに配眮するこずで回避出来る
  2. トリガヌなどを蚭眮しおる堎合、蚭眮者本人しか芋えない/削陀できないので、延々ず動き続ける。たたアカりントを削陀するず停止しおしたう。
  3. りェブアプリをデプロむしおる堎合、アカりントを削陀されるずりェブアプリが消える。
  4. 内郚異動で察象のファむルに元担圓者がアクセスできなくなり、匕き継ぎ者のアカりントでりェブアプリを再デプロむする必芁性がある。

故にこれらを回避する為には、瀟内で広く利甚するようなアプリの堎合には、特暩管理者のアカりント内で管理するか専甚のアカりントを甚意しおそちらでデプロむや管理をするようにする必芁がありたす。トリガヌ蚭眮もりェブアプリのデプロむも専甚アカりントであれば退職や異動で消えるこずもなく、匕き継ぎ者はそのアカりントで入れば䜜業が継続できるので安心です。

関連リンク

コメントを残す

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

日本語が含たれない投皿は無芖されたすのでご泚意ください。スパム察策