本日、自分が業務で運用中のアプリケーションの全アプリケーションが停止するというトラブルが発生しました。Chrome Debuggerで調査をしてみると、非常に致命的な問題が発生してる事がわかりました。スプレッドシートに記述されてる送信ログから見ると、本日より発生しています。

問題は、google.script.runというGAS側とHTML側とでデータのやり取りを行う為の非常に重要な関数であり、この関数に於いて特定のケースにて発生してることがわかりました(犯人はGoogle Picker APIですが)。また、本日も別のスクリプトを開発してる際に同様のエラーが出ていましたが、15:00付近までは問題なく実行出来ていました。よって、Google側が15:00以降に行ったなんらかの作業が原因だと思われます。

※2017年4月9日 0:30分現在、api.jsによるPickerの呼び出しと、google.script.runについて復旧した模様です。

※2017年4月21日 また再発です。Googleの担当者は、同じ問題を二度も三度も短期間に繰り返すようですね。どういうデバッグ体制なのか?甚だ疑問です。

目次

デバッガーの内容

デバッガーに表示されてるエラーは以下のようなものです。

Cannot read property ‘run’ of undefinedと表示されています。このスクリプトのエラーの原因となってるスクリプトは以下のようなものです。

このスクリプトは、昨日までは間違いなく稼働しており、他のフォーム類でも同様のエラーが出ています。

問題点

いくつかしらべてみたところ問題となってるケースというものが存在するようです。というよりも、明確にGoogle側でなんらかの変更を加えた結果、致命的なトラブルが生じていることは間違いありません。そこで、調査をしてみましたが、以下の条件の時に問題が発生するようです。

  1. Google Picker APIを利用してるフォームやウェブアプリ
  2. ScriptApp.getOAuthToken()メソッドを利用してる
  3. Google Pickerの初期化コード実行前のgoogle.script.runは問題なく実行できる。Pickerをロード後に実行すると壊れる。

google.script.runを実行するコードはHTML側に記述をするのですが、同じHTML上に上記の条件のコードを記述してる場合には、google.script.runがこけるようです。事実、Google Picker APIを利用していないウェブアプリケーションでは、とりあえず自分の作成したフォームで、データの送受信は出来ています。しかし、Picker APIを利用してるものについては、全て同じエラーが出ることを確認しました。

解決法

現在、Issue Trackerにて解決策が提示されています。現在、Google Picker APIを利用するのにapi.jsを利用しているのですが、これを使わず、Google Loaderであるgsapiを使って置き換えるものです。基本的には以下のようなスタイルで置き換える事になります。

このコードであれば、google.script.runがこけないで処理を行うことが出来ます。主な変更点は

  1. Head内のライブラリ呼び出しにおいて、api.jsをgsapiに置き換える
  2. ロードするコードは、google.load(“picker”,”1″)に置き換える

HTML側コード

GAS側コード

自分が使ってるpickerのコード例

関連リンク

Pocket
このエントリーをはてなブックマークに追加
Bookmark this on Yahoo Bookmark
Pocket