よくわからない GAS の内部エラーをひとまず解決したのでメモだけ。調査しきらないまま解決してしまったので、推測を含みます。
要約
Chrome としてログインしているアカウントと、スプレッドシート・GAS 上でログインしているアカウントが異なる場合がある。スプレッドシートと GAS だけで完結する操作なら問題は発生しないが、modaldialog
や sidebar
のように HTML 要素が絡んでくるとそれが効いてきて、権限の処理に引っかかり、エラーが出ることがある。
詳細
Google スプレッドシートにデータチェック機能を持たせるために、GAS で処理を書いて、スプレッドシートの上部メニューから実行できるようにしていた。データ整形の段階に応じていくつかスクリプトを用意していたが、同一スクリプトでも、ある環境からは正しく実行されるのに、ある環境では実行されない現象が発生した。
以下は Chrome のデベロッパーツールが吐いたエラーログだが、Uncaught
とだけ表示されていて原因が分からない。こちらが書いた GAS スクリプト上でエラーが起きているのなら、ログに該当関数やその行数、エラーの詳細(undefined
なり invalid
なり)が表示されるはずであるが、それも無い。
エラーの発生個所から察するに、GAS の内部処理に関する js ファイル上で何らかのエラーが起きているらしいが、難読化されているので全く見当がつかない。
HtmlService を呼び出す関数でのみエラー
複数用意した処理のうち、スプレッドシートと GAS の間でデータをやりとりするだけの単純な処理ではエラーが発生しなかった。一方、sidebar
や modaldialog
のような HtmlService
を介する処理、たとえばまず設定用ダイアログを表示して、そこで処理の細かい設定を行なってから、改めてスプレッドシートに処理を行なうようなものについては、エラーが発生した。
特定の Chrome でのみエラー
複数の環境から実行してみたところ、そのうち1つの環境の Chrome で、とあるアカウントに切り替えたときのみエラーが出た。環境間の違いを調べてみたところ、このアカウントでは特殊なログイン状況が発生していることが分かった。
Chrome にはユーザー管理システムがあり、google アカウントを登録しておけば、右上のユーザーメニューから簡単にログインアカウントを切り替えることができる。
ところが当該 Chrome では、デフォルトの「ユーザー1」のままいったん組織の GSuite アカウント A
でログインしたのち、ログアウトし、スプレッドシートには別の無料アカウント B
でログインするなどした結果、妙な Cookie の残りかたをしてしまったようで、「Chrome としては A
でのログイン履歴があるが、現在スプレッドシートには B
でログインしている」ような状況になっていた。
従って、スプレッドシートと GAS の間でデータの処理が完結するようなスクリプトでは問題なかったが、sidebar
や modaldialog
のような HTML を同一画面内に表示し、そこから(HTML 内のスクリプトから)GAS の関数を呼び出そうとした結果、アカウント A
からアカウント B
の GAS にアクセスするような事態が発生し、権限周りでエラーが起きていたのではないかと考えられる。
解決策
Google およびアカウント A
に紐づいた組織サイトの Cookie をすべて削除し、あらためてログインしなおすことで環境を正常化することができた。しばらく試したが、同様の状況はそれ以降再現しなかったのが残念。
スクリプト作成にあたって .gs
のほうにはいくらか try-catch
を仕込んだりしていたが、HTML のほうは非常にシンプルな処理だったので、エラーハンドリングを怠ってしまった。これが一番の敗因かもしれない。